Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我们可以同时打开同一文件的多个FileWriter流吗?_Java - Fatal编程技术网

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

Java 我们可以同时打开同一文件的多个FileWriter流吗?,java,Java,我们可以同时打开同一文件的多个FileWriter流吗。我写了一些代码来测试这一点,显然它允许发生。这使我感到困惑。因为如果我打开一个文件写入程序来创建文件,在关闭它之前,我会尝试删除该文件,但我不能。那么,我如何以及为什么可以一次打开同一文件的多个FileWriter流呢?这是我尝试的 private static final int SIZE = 1000; public static void main(String[] args) throws IOException, Interru

我们可以同时打开同一文件的多个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();
}
private static final int SIZE=1000;
公共静态void main(字符串[]args)引发IOException、InterruptedException{
File File=新文件(“C:\\dev\\harry\\data.txt”);
FileWriter FileWriter=newfilewriter(file,true);
BufferedWriter BufferedWriter=新的BufferedWriter(fileWriter);
对于(int i=0;i

我有另一个过程,它做完全相同的事情,但是相反,我将
2
写出来,并且在我的数据文件中同时得到
1
2

FileWriter API文档说这种行为取决于平台,文档中没有任何内容表明,当您希望对文件使用独占锁时,应该使用FileWriter

你应该看看并考虑使用<代码>文件频道< /代码>。该类对锁定文件和防止两个线程同时写入同一文件提供了适当的支持

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

是的,很有可能

那么,我如何以及为什么可以一次打开同一文件的多个FileWriter流呢

您已经演示了如何打开多个FileWriter实例,因此我将继续说明为什么可以这样做。在Java中,所有基于文件或设备的操作通常都依赖于平台的功能。您可以考虑<代码> java .IO < /C>和其他相关包,以在JVM中的本地代码中实现实际的功能。 在Java1.4之前(当NIO问世时),文件锁定在Java中是不可能的,因为JVM没有进行适当的特定于平台的系统调用来锁定文件或文件中的范围。NIO改变了这一点,它在
java.NIO
包中提供。在该类的文档中,您将注意到以下内容:

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

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

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

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