繁体   English   中英

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

[英]can we open multiple FileWriter stream to the same file at the same time?

我们可以同时打开多个 FileWriter stream 到同一个文件。 我写了一些代码来测试这一点,显然它允许发生。 这绊倒了我。 因为如果我打开一个文件写入器来归档,然后在关闭它之前,我会尝试删除该文件,我不能。 那么如何以及为什么我可以一次打开多个 FileWriter stream 到同一个文件? 这是我尝试的

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

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

是的,这很有可能。

那么如何以及为什么我可以一次打开多个 FileWriter stream 到同一个文件?

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

在 Java 1.4 之前(当 NIO 出现时),文件锁定在 Java 中是不可能的,因为 JVM 没有在适当的平台内调用系统调用文件来锁定文件。 NIO 改变了这种情况,它在java.nio package 中可用。 FileChannel class 的文档中,您会注意到以下内容:

除了熟悉的字节通道的读、写和关闭操作之外,这个 class 还定义了以下文件特定的操作:

...

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

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

至于为什么 FileWriter 存在这种行为,原因很简单。 NIO 是/曾经是一组新的 I/O 类,但它没有取代java.io 因此,您可以继续使用java.io类,如 FileOutputStream 和 FileWriter,但您将永远无法在写操作的持续时间内被 Z18B5A217C4DAD25662D3A05EDB0E39 锁定文件。

FileWriter API 文档说该行为取决于平台,并且文档中没有任何内容表明当您想要对文件进行排他锁定时应该使用 FileWriter。

您可能应该查看并考虑改用FileChannel class 对锁定文件和防止两个线程同时写入同一个文件有适当的支持。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM