我正在重构一个小型工具,该工具需要迭代文件列表并动态修改它们。
目前,它用一种方法执行修改操作,这意味着它将文件读取到内存,修改内存中的内容,并将该内容写回同一文件位置。
这一切都是在几句try-with-resources语句中完成的。然而,这意味着在关闭读取之前完成"打开以进行写入"。
我在下面提供了一个小的近似值(见方法"correctTxt")。
要测试这一点,请创建一个文件"FileQuestion.txt"带有等文本
快速的棕色大象跳过懒狗
public class Demo
{
public static void main(String[] args) throws Exception
{
final File txtFile = new File("FileQuestion.txt");
correctTxt(txtFile);
}
static void correctTxt(File txtFile) throws IOException
{
try (BufferedReader reader = new BufferedReader(new InputStreamReader (new BufferedInputStream(new FileInputStream(txtFile))))) {
String line = reader.readLine();
if (line!=null) {
line = line.replace("elephant", "fox");
try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(txtFile))) {
bos.write(line.getBytes());
bos.flush();
}
}
}
}
}
它有效。这一切都是在一个进程(单个线程)中完成的。
问题是,
以correctTxt方法中的方式在读取结束前执行写入操作是否根本不正确?
注意:在第一次读取之后,不打算进行任何进一步的读取。
好问题。我想说,从技术上讲,这可能不是问题,但。。。我看到的是,尝试的范围不必要地大,如果你把范围缩小到需要的地方,你甚至不会处于这种情况。
请参阅此版本的correctTxt,尽量减少使用范围的尝试
static void correctTxt(File txtFile) throws IOException {
String line;
try (BufferedReader reader = new BufferedReader(new InputStreamReader (new BufferedInputStream(new FileInputStream(txtFile))))) {
line = reader.readLine();
}
if (line!=null) {
line = line.replace("elephant", "fox");
try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(txtFile))) {
bos.write(line.getBytes());
bos.flush();
}
}
}