【问题标题】:How to write a reader into a file using nio?如何使用 nio 将阅读器写入文件?
【发布时间】:2021-05-30 17:34:15
【问题描述】:

给定一个阅读器、一个字符集和一个路径,我如何正确有效地将阅读器的内容写入文件?

事先不知道阅读器内容的总大小。

这是我目前的解决方案:

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 语句中的类型转换,有更清洁的解决方案吗?

【问题讨论】:

  • 类型转换使用FileChannel#open
  • 为什么是Reader?为什么不只复制字节?为什么选择蔚来?
  • 因为读者是我得到的,这部分是我无法控制的

标签: java io nio bytebuffer


【解决方案1】:

将阅读器转移到路径的最简单方法是使用Files的内置方法:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-11
    • 2021-01-15
    • 2016-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-25
    • 1970-01-01
    相关资源
    最近更新 更多