在java中写入文件 - 关闭或刷新

时间:2017-03-21 08:30:00

标签: java file flush filewriter

我正在使用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();
}

}

现在我的回答是,如果可以不关闭流并且只使用同花顺? 以后会有问题吗?因为在我的所有测试中它运行良好。

谢谢!

2 个答案:

答案 0 :(得分:1)

这是不是很诚实?,以一种非常卑微的方式。对不起但很臭的代码:

  1. 为什么设置为null“bw”和“fw”?, globals ?,为什么?
  2. “ex.printStackTrace();” ?真的吗?,没有log4j或类似的?
  3. 为什么不使用finally块?如果在读取文件时发生异常会怎么样?
  4. 有人已经回答了这个问题,因为代码可以参考这个优秀的答案:
  5. Is it necessary to close a FileWriter, provided it is written through a BufferedWriter?

答案 1 :(得分:0)

关闭#include <stdio.h> #include "lua.h" #include "lauxlib.h" #include "lualib.h" #define lua_pushglobaltable(L) lua_pushvalue(L,LUA_GLOBALSINDEX) int main(void) { lua_State *L=luaL_newstate(); luaL_openlibs(L); lua_pushglobaltable(L); lua_pushnil(L); while (lua_next(L,-2) != 0) { puts(lua_tostring(L,-2)); lua_pop(L,1); } lua_pop(L,1); lua_close(L); return 0; } 对象。

bufferedWriter

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

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

如果你不写fw.close(),那么该文件将为空。 所以,确保你必须写每个文件写入操作bw.close()