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

问题描述

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

预先不知道读者内容的总大小。

这是我目前的解决方案:

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

解决方法

将 reader 传输到路径的最简单方法是使用 Files 的内置方法:

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

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...