问题标签 [filechannel]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
255 浏览

java - Java NIO2:需要澄清 FileChannel

我正在尝试构建一个 custom FileChannel,但由于文档不一致,我遇到了不清楚的问题。

FileChannel.transferFrom(ReadableByteChannel src, long position, long count)方法的文档说,

如果给定位置大于文件的当前大小,则不传输任何字节。

现在,他们不应该这样说吗?:

“如果position + count大于文件的当前大小,则不传输任何字节。”

怀疑这可能是文档中的错误的原因是这个。在同一个 API 文档的其他地方,如果文件需要增长,则会明确提及它,例如FileChannel.write(ByteBuffer src, long position)

“如果给定的位置大于文件的当前大小,那么文件将被增长以容纳新的字节;”

因此,如果在 的情况下没有提到任何文件增长FileChannel.transferFrom(),我会觉得文件不应该通过这种方法增长。但问题是,文件不仅可以增长“如果给定位置大于文件的当前大小”,还可以“如果position + count大于文件的当前大小”。

0 投票
2 回答
297 浏览

java - 这是 Java 7 中的一个错误吗?

我不知道在哪里寻求关于 Java API 文档和 Java 代码的澄清和确认,所以我在这里做。

在 API 文档中FileChannel,我发现要归档position并归档size在多个位置的错误。

这里只是一个例子。状态的 API 文档transferFrom(...)

“如果给定位置大于文件的当前大小,则不传输任何字节。”

我确认 OpenJDK 代码也包含此代码...

...在FileChannelImpl.java与文档一致的文件中。

现在,虽然上面的代码片段和 API 文档看起来相互一致,但我“感觉”上面应该“大于或等于”而不仅仅是“大于”,因为position它是文件数据的基于 0 的索引,随意读取position == size()没有数据返回给调用者!(在position == size() - 1处,至少 1 个字节——文件的最后一个字节——可以返回给调用者。)

以下是同一 API 文档页面中的其他一些类似实例:

  1. position(...): "将位置设置为大于文件当前大小的值是合法的,但不会改变文件的大小。" (应该是“大于或等于”。)

  2. transferTo(...): "如果给定位置大于文件的当前大小,则不传输任何字节。" (应该是“大于或等于”。)

  3. read(...)“如果给定位置大于文件的当前大小,则不读取任何字节。” (应该是“大于或等于”。)

最后,返回值的文档部分read(...)甚至无法与文档的其余部分保持一致。这是它所说的:

read(...)

回报:

读取的字节数,可能为零,如果给定位置大于或等于文件的当前大小,则为 -1

所以,在这个单独的例子中,我确实看到他们提到了正确的事情。

总的来说,我不知道该怎么做。如果我今天编写与此文档匹配的代码,那么 Java 中的未来错误修复(代码或文档)将使我的代码出现错误,也需要我的修复。如果我今天自己按照今天的情况做正确的事情,那么我的代码一开始就会出错!

0 投票
1 回答
1678 浏览

java - 用 NIO 写一个大文本文件

我为我的应用程序中的离线报告编写了一个大约 1200 (+/- 200) mb 的大型 csv 文件。(一个线程执行这项工作。)数据计数可能在 5000 万左右,因此每 50k 行运行一次查询。查询循环运行直到空提取(对于给定的条件)。要将数据写入文件,而不是使用 Java 流,我尝试了 nio. 我花了大约 12 秒来写一个 50000 行的巨大字符串。使用 BufferedWriter 尝试的相同代码大约需要 18-22 秒。nio 方法代码如下。我想知道这是否是使用 nio 编写大文件的直接方法?我忽略了什么,错过了什么?任何其他方式,优化和代码改进都是受欢迎的。

0 投票
2 回答
33418 浏览

java - 缓冲区下溢异常 Java

我正在将值写入文件。

值写入正确。在另一个应用程序中,我可以毫无例外地读取文件。

但是在我的新应用程序中,我Bufferunderflowexception在尝试读取文件时得到了一个。

bufferunderflowexception指的是:

这是我读取文件的代码:

0 投票
0 回答
54 浏览

java - 我无法内存映射大文件。地图失败。内存不足错误

这是我的代码:

以下是错误:

我正在尝试在 32 位系统上映射 1.5GB 的文件。

我认为nio应该解决这个问题。难道我做错了什么?

问候。

0 投票
2 回答
2203 浏览

java - 使用 Java 7 AsynchronousFileChannel 附加到文件

我正在尝试AsynchronousFileChannelJAVA 7 API 以异步方式写入文件,但是我找不到附加到文件的简单方法。

API 描述指出AsynchronousFileChannel不维护文件位置,您必须指定文件位置。这意味着您必须维护一个全局文件位置值。此外,这个全局状态应该是原子的,以便您正确递增。

有没有更好的方法来使用 进行更新AsynchronousFileChannel

另外,有人可以解释一下 API 中 Attachment 对象的用法吗?

javadoc 说: attachment - 附加到 I/O 操作的对象;可以为空

这个附件对象有什么用?

谢谢!

0 投票
1 回答
1622 浏览

java - 如何使用 transferFrom 在 Java 中连接两个文件

下面是我的代码。我是否正确地注意到 transferFrom 不会修改被转移到的频道的位置?

这不起作用。它只是复制第一个文件。

问候。

0 投票
0 回答
111 浏览

android - 在 Android 中移动后无法读取图像和视频

我正在使用此功能将一些图像和视频移动到自定义文件夹:

文件被正确移动,src 文件被很好地删除。问题是,当我尝试使用任何图库打开图像或视频时,它显示为黑色或无法播放视频。所以我检查了文件管理器,发现文件的权限是错误的。你有什么建议吗?

谢谢。

0 投票
1 回答
1222 浏览

java - 如果源目标相同,Java中的fileoutputstream会生成零字节?

我们使用类似的代码在 Java 中使用文件复制:

问题是有时source并且dest可以指向同一个文件,在这种情况下,以下语句outputChannel = new FileOutputStream(dest).getChannel();会导致源截断为 0 字节,即使源是 400 kb,因为我认为它正在打开一个用于写入的流相同的手柄。那么有什么方法可以对抗呢?

我应该在我的代码中添加一些内容吗

上面的方法有用吗?或者有没有更好的方法来处理这个?

谢谢

0 投票
1 回答
1140 浏览

java - 获取错误的 FileChannel 大小

我正在尝试获取包含在assets. 我正在使用a FileChannel,因为我需要FileChannel稍后。该文件myfile.txt包含 7 个字节。

这是我的代码:

输出是:

为什么方法返回的大小FileChannel.size()错误?

谢谢你的帮助