我正在重构一个小工具,它需要遍历文件列表并动态修改它们。
目前它在一个方法中执行修改操作,这意味着它将文件读取到内存,修改内存中的内容,并将该内容写回到同一文件位置。
它是在几个try-with-resource语句中完成的。但是,这意味着'open for write'在读取关闭之前完成。
我在下面提供了一个小的近似值(参见方法“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方法中完成的?
注意:在第一次阅读之后,不打算进行任何进一步的阅读。
答案 0 :(得分:1)
好问题。我说它在技术上可能不是问题,但是......我看到试用的范围是不必要的大,如果你将范围缩小到需要的地方,你甚至不会处于这种情况
使用最小化的试用范围
查看此版本的correctTxtstatic 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();
}
}
}