如何使用 nio 将 reader 写入文件?
How to write a reader into a file using nio?
给定 Reader、字符集和路径,如何正确有效地将 reader 的内容写入文件?
reader 内容的总大小事先未知。
这是我目前的解决方案:
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 并简化了您需要为此经常需要的任务编写的代码逻辑。
给定 Reader、字符集和路径,如何正确有效地将 reader 的内容写入文件?
reader 内容的总大小事先未知。
这是我目前的解决方案:
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 并简化了您需要为此经常需要的任务编写的代码逻辑。