在关闭阅读文件之前打开文件是否不正确?

时间:2017-01-13 14:43:25

标签: java file inputstream outputstream file-descriptor

我正在重构一个小工具,它需要遍历文件列表并动态修改它们。

目前它在一个方法中执行修改操作,这意味着它将文件读取到内存,修改内存中的内容,并将该内容写回到同一文件位置。

它是在几个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方法中完成的?

注意:在第一次阅读之后,不打算进行任何进一步的阅读。

1 个答案:

答案 0 :(得分:1)

好问题。我说它在技术上可能不是问题,但是......我看到试用的范围是不必要的大,如果你将范围缩小到需要的地方,你甚至不会处于这种情况

使用最小化的试用范围

查看此版本的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();
        }
    }
}