【发布时间】:2020-11-24 05:56:25
【问题描述】:
下面是我的代码。我能够成功读取文件。但无法使用 BufferedWriter 用替换的内容重新写入它。但可以使用 ByteBuffer 来完成。有什么建议请教我哪里出错了。
myFile.txt 内容:
Key1-Value1
Key2-Value2
Key3-Value3
Java 代码如下:
String fileAbsolutePath = "C:\\myPath\\myFile.txt";
try {
RandomAccessFile file = new RandomAccessFile(fileAbsolutePath, "rw");
FileChannel fileChannel = file.getChannel();
FileLock lock = fileChannel.lock();
// read from the channel
BufferedReader bufferedReader = new BufferedReader(Channels.newReader(fileChannel, "UTF-8"));
List<String> filteredList = bufferedReader.lines().filter(line -> !line.contains("KEY1-VALUE1")).onClose(() -> {
try {
bufferedReader.close();
} catch (IOException ex) {
throw new UncheckedIOException(ex);
}
}).collect(Collectors.toList());
fileChannel.truncate(0);
BufferedWriter bufferedWriter = new BufferedWriter(Channels.newWriter(fileChannel, "UTF-8"));
for (String string : list) {
bufferedWriter.write(string);//does n't work
bufferedWriter.newLine();
}
lock.release();
file.close();
fileChannel.close();
} catch (Exception e) {
e.printStackTrace();
}
ByteBuffer 部分有效:
ByteBuffer buff = null;
for (int i = 0; i < filteredList.size(); i++) {
buff = ByteBuffer.wrap(filteredList.get(i).concat("\n").getBytes(StandardCharsets.UTF_8));
fileChannel.write(buff);
}
挑战是在BufferedWriter的帮助下实现同样的目标
尝试使用资源后更新代码
try (RandomAccessFile file = new RandomAccessFile(fileAbsolutePath, "rw");
FileChannel fileChannel = file.getChannel();
FileLock lock = fileChannel.lock();
BufferedReader bufferedReader = new BufferedReader(Channels.newReader(fileChannel, "UTF-8"));
BufferedWriter bufferedWriter = new BufferedWriter(Channels.newWriter(fileChannel, "UTF-8"))) {
// read from the channel
List<String> list = bufferedReader.lines().filter(line -> !line.contains("Key1-Value1"))
.collect(Collectors.toList());
fileChannel.truncate(0);
list.forEach(item -> {
try {
bufferedWriter.write(item.concat("\n"));
} catch (IOException e) {
e.printStackTrace();
}
});
bufferedWriter.flush();
}
【问题讨论】:
-
快速提问,但您为什么不只使用 NIO?
Files.write(path, list). -
请注意,您的代码存在资源泄漏,因为您没有使用 try-with-resources。
-
// TODO handle exception首先。e.printStacktrace(); -
@JoopEggen 完成。但也不例外。似乎代码的BufferedWriter部分无法访问打开的fileChannel
-
@Zabuzard 我需要锁定文件,因为有可能同时有其他进程访问该文件。 Files.write(路径,列表);抛出异常 java.io.IOException: 该进程无法访问该文件,因为另一个进程已锁定该文件的一部分
标签: java nio bufferedwriter filechannel java.nio.file