如何使用 nio 将阅读器写入文件?

How to write a reader into a file using nio?

提问人:Cephalopod 提问时间:3/1/2021 更新时间:3/1/2021 访问量:189

问:

给定一个 Reader、一个 Charset 和一个 Path,如何正确有效地将读取器的内容写入文件中?

读者内容的总大小事先是未知的。

这是我目前的解决方案:

CharBuffer charBuffer = CharBuffer.allocate(1024);

try (FileChannel fc = (FileChannel) Files.newByteChannel(path, StandardOpenOption.WRITE, StandardOpenOption.CREATE_NEW)) {
    while (true) {
        int size = reader.read(charBuffer);
        if (size < 0) break;
        charBuffer.flip();
        ByteBuffer bytes = charset.encode(charBuffer);
        fc.write(bytes);
        charBuffer.flip();
    }
}

它有效,但它在每个循环中分配一个新的 ByteBuffer。我可以尝试重用字节缓冲区,但我实际上更喜欢总共只使用一个缓冲区的解决方案。

“使用”不是一个选项,因为它不考虑字符集。ByteBuffer#toCharBuffer

我也不喜欢 try-statement 中的类型转换,有没有更干净的解决方案?

Java IO NIO 字节缓冲

评论

1赞 Slaw 3/1/2021
至于类型转换,请使用FileChannel#open
0赞 user207421 3/1/2021
为什么是 ?为什么不直接复制字节呢?为什么选择蔚来汽车?Reader
0赞 Cephalopod 3/1/2021
因为读者是我得到的,所以这部分超出了我的控制范围

答:

1赞 DuncG 3/1/2021 #1

将读取器传输到路径的最简单方法是使用以下内置方法:Files

try(var out = Files.newBufferedWriter(path, charset, StandardOpenOption.WRITE, StandardOpenOption.CREATE_NEW)) {
    reader.transferTo(out);
}

这不需要 CharBuffer,并简化了为此经常需要的任务编写的代码逻辑。