0

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

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

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

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

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

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

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

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

4

1 回答 1

0

与您相同的文档

如果源通道剩余的字节数少于计数,或者源通道是非阻塞的并且其输入缓冲区中立即可用的字节数少于计数,则将传输少于请求的字节数。

为什么 transferFrom 应该增长 ReadableBiteChannel?

所以:没有

编辑1:

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

意思是:

Path sourcePath = Paths.get("C:/FileChannelDemo/source.txt");
Path targetPath = Paths.get("C:/FileChannelDemo/target.txt");

Files.createDirectories(sourcePath.getParent());

BufferedWriter writer = Files.newBufferedWriter(sourcePath,
        StandardCharsets.UTF_8);

// 200k
while (Files.size(sourcePath) < 200 * 1024)
    writer.write(System.currentTimeMillis() + "\n");

FileChannel src = FileChannel.open(sourcePath, StandardOpenOption.READ);

FileChannel trgt = FileChannel.open(targetPath, EnumSet.of(StandardOpenOption.WRITE, 
        StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING));

int count = 200*1024;

System.out.println("current size is: " + Files.size(targetPath) + "smaller than  count:" +count);

trgt.transferFrom(src, 0, count);

不会传输任何数据。但确实如此。

上面说明了不传输count字节的原因。

于 2014-01-02T21:32:32.797 回答