Java 非阻塞文件读取
java中是否有非阻塞文件读取API?如果不是,在C++中构建一个并通过JNI调用java应用程序是明智的吗?< /P> < P>不,<代码> <代码>不扩展<代码> <代码>。 可能是因为并非所有操作系统都支持它Java 非阻塞文件读取,java,c++,io,java-native-interface,Java,C++,Io,Java Native Interface,java中是否有非阻塞文件读取API?如果不是,在C++中构建一个并通过JNI调用java应用程序是明智的吗?< /P> < P>不, 不扩展 。 可能是因为并非所有操作系统都支持它 Windows,理论上你可以编写一个Windows特定的C++库并通过JNI调用它,但是要把它与java .NiO 集成起来,还需要大量的工作。 我宁愿让一个工作线程将文件内容复制到另一端,并在管道的另一端执行非阻塞读取。我原来的答案现在是错误的,因为在Java 7中添加了 您仍然无法对文件执行任何操作,但现在有
Windows,理论上你可以编写一个Windows特定的C++库并通过JNI调用它,但是要把它与
我宁愿让一个工作线程将文件内容复制到另一端,并在管道的另一端执行非阻塞读取。我原来的答案现在是错误的,因为在Java 7中添加了 您仍然无法对文件执行任何操作,但现在有两种异步文件读取方法:一种方法接受,另一种方法返回
使用回调方法(并从回调中分派事件)可能比使用专用线程轮询管道更干净。
AsynchronousFileChannel
是正确的答案。然而,它并没有提供一个简单的API。与提供简单静态方法的java.nio.file.Files
的类似用法相比,使用它非常冗长,例如:readAllLines
或lines
。不幸的是,文件
方法是同步的
来自的AsyncFiles
备选方案提供了相应的非阻塞方法,具有3种不同的API:基于回调的、CompletableFuture
以及反应流。这里是一个反应流的示例:
你想用它做什么?使用阻塞模型有什么错?潜在的IO阻塞会干扰MDB的生命周期。你能扩展一下吗?这会有什么影响?@finnw是的,消息驱动Bean的MDB。异步和非阻塞是不同的。事实上,异步IO操作作为非阻塞IO显然不是。
AsyncFiles
.lines(path)
.subscribe(doOnNext(line -> /*... use line from background thread ...*/));