我们可以同时打开多个FileWriter流到同一个文件吗?

时间:2011-06-13 19:13:41

标签: java

我们可以同时打开多个FileWriter流到同一个文件。我写了一些代码来测试这个,显然它允许发生。这让我感到沮丧。因为如果我打开文件编写器来文件,并在关闭它之前,我尝试删除该文件,我不能。那么我怎样以及为什么可以一次打开多个FileWriter流到同一个文件?这是我尝试的

private static final int SIZE = 1000;

public static void main(String[] args) throws IOException, InterruptedException {
    File file = new File("C:\\dev\\harry\\data.txt");
    FileWriter fileWriter = new FileWriter(file, true);
    BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
    for (int i = 0; i < SIZE; i++) {
        bufferedWriter.write("1\n");
        Thread.sleep(100);
    }

    if (bufferedWriter != null) bufferedWriter.close();
    if (fileWriter != null) fileWriter.close();
}

我有另一个进程,它完全相同,但是在我的数据文件中写出2,我同时得到12

2 个答案:

答案 0 :(得分:4)

  

我们可以同时打开多个FileWriter流到同一个文件。

是的,很有可能。

  

那么我怎样以及为什么一次将FileWriter流多次打开到同一个文件?

您已经演示了如何打开多个FileWriter实例,因此我将坚持为什么可能。在Java中,所有基于文件或设备的操作通常都依赖于平台的功能。您可以将java.io和其他相关包视为实际执行此功能的JVM中本机代码的精简包装。

直到Java 1.4(当NIO出现时),Java中无法进行文件锁定,因为JVM没有进行适当的特定于平台的系统调用来锁定文件中的文件或范围。这已在NIO中更改,NIO可在java.nio包中找到。在FileChannel课程的文档中,您会注意到以下内容:

  

除了熟悉的字节通道的读,写和关闭操作外,该类还定义了以下特定于文件的操作:

     

...

     

可能会锁定文件的某个区域,以防其他程序访问。

正如您所猜测的那样,这种行为是由于JVM进行了必要的特定于平台的调用。如果底层平台不支持此操作,则不会发生文件锁定。

至于为什么FileWriter存在这种行为,原因很简单。 NIO是一组新的I / O类,但它并没有取代java.io。因此,您可以继续使用FileOutputStream和FileWriter等java.io类,但在写入操作期间,您永远无法让JVM锁定文件。

答案 1 :(得分:2)

FileWriter API文档说该行为是依赖于平台的,并且文档中没有任何内容表明当您想要对文件进行独占锁定时应该使用FileWriter。

您应该考虑并考虑使用FileChannel。该类对锁定文件和防止两个线程同时写入同一文件具有适当的支持。