【发布时间】: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