Java 为什么InputStream读取方法会阻塞资源?

Java 为什么InputStream读取方法会阻塞资源?,java,multithreading,randomaccessfile,Java,Multithreading,Randomaccessfile,为什么InputStream的read方法会在没有可读取内容的情况下阻塞资源 假设我在RW模式下打开了一个RandomAccessFile,我使用文件描述符创建了InputStream/OutputStream 线程1正在尝试读取文件,但没有可用的内容。 此时,如果线程2尝试写入该文件,它将被阻止 为什么会这样?文件描述符是携带操作系统文件句柄的对象,这意味着它是携带文件指针的对象 一次只能有一个线程使用文件句柄/文件指针,因为FileDescriptor不支持多线程。访问已同步 如果您想让两个

为什么InputStream的read方法会在没有可读取内容的情况下阻塞资源

假设我在RW模式下打开了一个RandomAccessFile,我使用文件描述符创建了InputStream/OutputStream

线程1正在尝试读取文件,但没有可用的内容。 此时,如果线程2尝试写入该文件,它将被阻止


为什么会这样?

文件描述符是携带操作系统文件句柄的对象,这意味着它是携带文件指针的对象

一次只能有一个线程使用文件句柄/文件指针,因为
FileDescriptor
不支持多线程。访问已同步

如果您想让两个线程独立访问该文件,则需要两个文件描述符

为了证明我的共享文件指针的观点,如果您交替地从
FileInputStream
读取和写入
FileOutputStream
,您认为会发生什么

下面是显示发生了什么的代码:

String fileName = "Test.txt";
Files.writeString(Paths.get(fileName), "abcdefghijklmnopqrstuvwxyz", StandardCharsets.US_ASCII);

try (RandomAccessFile raFile = new RandomAccessFile(fileName, "rw");
     FileInputStream in = new FileInputStream(raFile.getFD());
     FileOutputStream out = new FileOutputStream(raFile.getFD()) ) {

    byte[] buf = new byte[4];
    for (int i = 0; i < 3; i++) {
        int len = in.read(buf);
        System.out.println(new String(buf, 0, len, StandardCharsets.US_ASCII));

        out.write("1234".getBytes(StandardCharsets.US_ASCII));
    }
}

String s = Files.readString(Paths.get(fileName), StandardCharsets.US_ASCII);
System.out.println(s);

如您所见,读取4个字节返回字节0-3并移动文件指针,因此写入4个字节将替换字节4-7,然后读取4个字节将返回字节8-11,写入4个字节将替换字节12-15,依此类推。

您为什么不亲自尝试一下,看看?这就是所谓的研究,是开发人员学习的一个很好的工具。线程被阻塞。我试图理解为什么它会阻塞整个资源?如果你已经知道它会阻塞,为什么你要问它是否会阻塞?如果你想问为什么,为什么你的问题是问“它会被阻止?”而不是“它为什么被阻止?”。我的错。如果您知道,请帮助我理解。真正的问题是,为什么您要从文件描述符创建InputStream/OutputStream,而不是单独创建它们。这很有意义。谢谢你,安德烈亚斯。