【问题标题】:Writing to file in java - close or flush在java中写入文件 - 关闭或刷新
【发布时间】:2017-08-12 19:20:13
【问题描述】:

我正在使用 bufferedWriter 和 FileWriter 将记录器写入我的 java 程序(csv 格式)。

当我在程序运行时打开 csv 文件并继续写入文件时,我得到了这个异常:“该进程无法访问该文件,因为它正在被另一个进程使用”。

我想要的是当我在程序运行时打开 csv 文件,csv 文件将以读取模式打开,程序将成功写入文件。

我通过将 bufferedWriter 和 FileWriter 的关闭更改为 .flush() 而不是 .close()

来解决它

原始最小记录器代码(带有原始关闭功能)

public class logger {
     private BufferedWriter bw = null;
     private FileWriter fw = null;
     private File file = null;

   logger(String nclass) {

        path = "c:\\test\\test.csv";
        this.file = new File(path);

        // Check if the file is already exist.
        if (!file.exists()) {
            file.createNewFile();
        }

        fw = new FileWriter(file.getAbsoluteFile(), true);
        bw = new BufferedWriter(fw);
   }
   public void writeToFile(String msg) {
    entryWrite();

    try {

        fw = new FileWriter(file.getAbsoluteFile(), true);
        bw = new BufferedWriter(fw);
        fw.append(msg);

    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        close();
        exitWrite();
    }
}

}

  private void close()  {
try {
    if (bw != null) {
        bw.close(); 
        bw = null;
    }
    if (fw != null) {
        fw.close();
        fw = null;
    }
} catch (IOException ex) {
    ex.printStackTrace();
}

}

我的解题功能

  private void close()  {
try {
    if (bw != null) {
        bw.flush(); 
        bw = null;
    }
    if (fw != null) {
        fw.flush();
        fw = null;
    }
} catch (IOException ex) {
    ex.printStackTrace();
}

}

现在我的回答是,不关闭流而只使用flush是否可以? 以后会不会有问题?因为在我所有的测试中它都运行良好。

谢谢!!

【问题讨论】:

  • 请出示完整的minimal reproducible example;你错过了很多重要的方面。对于初学者来说;我猜你正在使用 FileWriter 创建你的 BufferedWriter;那么你到底为什么要在这两个上调用方法(你只需要刷新/关闭外部编写器!)
  • @GhostCat - 我添加了。
  • 应该作为 DUP 关闭到stackoverflow.com/questions/16584777/… ... 答案是正确的:这段代码真的...对不起,不好。
  • @GhostCat - 为什么不好?我只是创建一个文件并写信给他。我还能做些什么更好?我只是想解决有人在程序仍在运行时打开文件的问题......
  • 我在那个聊天室里放了一些内容;愉快地消化……然后告诉我你的想法。

标签: java file flush filewriter


【解决方案1】:

以非常谦虚的方式诚实可以吗?抱歉,代码很臭:

  1. 为什么将“bw”和“fw”设置为空?,全局变量?,为什么?
  2. “ex.printStackTrace();” ?真的吗?没有 log4j 或类似的?
  3. 为什么不使用 finally 块?如果在读写文件时发生异常会怎样?
  4. 有人已经回答了这个问题,代码参考这个优秀的答案:

Is it necessary to close a FileWriter, provided it is written through a BufferedWriter?

【讨论】:

  • 我将大部分代码添加到我的主帖中。 1.不知道,有问题吗? 2.我不需要log4j,因为我将程序的所有错误都写入了我的记录器。当我的记录器出现问题时,我看到它存在于 java 中。 3. 当我完成写入文件时,我使用了 finally 块。查看我更新的代码。 4. 谢谢。所以你认为使用 flush 而不是 close 是安全的?
【解决方案2】:

只需关闭bufferedWriter 对象即可。

bw.close();

说,你有一个很大的file.txt。 现在你要从一个文件中取出一些东西,每次都制作一个新的更小的文本文件。 在这种情况下, 不知何故,您必须编写几行代码来确定何时完成对特定文件的写入。然后用flag写bw.close();

最终,您必须初始化第二个文件并完成您的任务。然后 bw.close();

如果你不写 fw.close(),那么文件将会是空的。 所以,请确保每个文件写入操作都必须编写 bw.close()

【讨论】:

    猜你喜欢
    • 2017-09-15
    • 1970-01-01
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-19
    相关资源
    最近更新 更多