Java确实打开已经打开的文件抛出异常或等待

时间:2017-06-12 09:57:25

标签: java file-io

我们说我有两个进程在运行(A和B)。 A打开了一个文件。如果B也试图打开文件B是否等待A关闭文件或B抛出异常?或者文件系统通过一些魔法(如在内存副本和缓冲区中创建)尝试让两个进程同时打开文件?

提前谢谢

1 个答案:

答案 0 :(得分:0)

两个线程都可以打开同一个文件。

没有错误被抛出。

见下文:

以下程序的输出是:

进程1打开文件

1

2

3

进程2打开文件

1

2

3

处理1已关闭的文件

处理2关闭文件

测试文件的内容" /tmp/test1.txt"是:1 2 3

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.stream.Stream;

public class TwoThreadsOneFileExample {

    public static void main(String[] args) throws InterruptedException {

        Process p1 = new Process("1");
        Thread t1 = new Thread(p1);

        Process p2 = new Process("2");
        Thread t2 = new Thread(p2);

        t1.start();
        Thread.sleep(2000);
        t2.start();

        Thread.sleep(20000);


    }
}

class Process implements Runnable {


    String name;

    public Process(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        try {
            processFile();
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }

    }

    private void processFile() throws InterruptedException {

        String fileName = "/tmp/test1.txt";

        try (Stream<String> stream = Files.lines(Paths.get(fileName))) {

            System.out.println("process " + name + " opened file");
            stream.forEach(System.out::println);
            Thread.sleep(10000);

        } catch (IOException e){
            throw new RuntimeException(e);
        }
        System.out.println("process " + name + " closed file");

    }
}