java nio读/写文件实际上是非阻塞io吗?

问题描述 投票:0回答:1

我正在学习非阻塞 I/O 术语。主要是在学习java Nio。我试图更好地理解非阻塞 I/O,并观察它在 Java Nio 的实现中是如何工作的。

我阅读了十几个与非阻塞 i/o 术语和使用 java Nio 实现非阻塞 i/o 相关的问题和答案。

我到处都看到以下类似的说法。

非阻塞IO不会等待数据被读取或写入才返回。 Java NIO 非阻塞模式允许线程请求向通道写入数据,但非阻塞 IO 不会等待数据被读取或写入才返回。

我尝试用一个使用 Nio 读取文件内容的 Java 代码示例来说明该语句。然而,线程仍然被阻塞在通道的 read() 方法处。

System.out.println("Thread-" + Thread.currentThread().getName() 
+ "-" + Thread.currentThread().getId());// Thread-main-1

String filePath = "./resources/nio-demo.txt";
FileInputStream fis = new FileInputStream(new File(filePath));
FileChannel fileChannel = fis.getChannel();

ByteBuffer buf = ByteBuffer.allocate(102400);

int bytesRead = fileChannel.read(buf);
System.out.println(buf.position()); //check how many bytes are written to the buf, always 102400

while (bytesRead != -1)
{

    buf.flip();

    while (buf.hasRemaining())
    {
        System.out.print((char) buf.get());
    }

    buf.clear();
    bytesRead = fileChannel.read(buf);
}
fis.close();

据我了解,触发read()方法后,线程会执行下面这行代码。 buf是否已满数据并不重要。 但在这里,线程被阻塞,直到 buf 完成并继续处理序列。

上面的例子读取了一个大约300M的文件,buf为102400。

这种情况让我很困惑;也许我误解了 java Nio 的非阻塞 i/o。

您能帮我解释一下这个情况吗?

java Nio如何实现只有一个线程的纯非阻塞I/O?

java nio nonblocking
1个回答
0
投票

也许这里的问题是,
“文件 API 中的所有操作都被阻止”
从 Socket 读取可以是非阻塞的。但即使在 NIO 中,从文件中读取也是阻塞的。

© www.soinside.com 2019 - 2024. All rights reserved.