nio和编写非阻塞Scala代码
仅仅因为使用了java.nio,下面这样的代码中会不会有任何不阻塞的东西可以写入文件nio和编写非阻塞Scala代码,scala,scalability,nio,nonblocking,Scala,Scalability,Nio,Nonblocking,仅仅因为使用了java.nio,下面这样的代码中会不会有任何不阻塞的东西可以写入文件 def writeOutputFile(fileText: String, outDir: String, fileName: String) { import java.nio.file.{Path, Paths, Files} import java.nio.charset.StandardCharsets Files.write(Paths.get(outDir + "/" + fileN
def writeOutputFile(fileText: String, outDir: String, fileName: String) {
import java.nio.file.{Path, Paths, Files}
import java.nio.charset.StandardCharsets
Files.write(Paths.get(outDir + "/" + fileName), fileText.getBytes(StandardCharsets.UTF_8))
}
或者,为了编写一个没有阻塞的文件,您是否需要用承诺和未来来包装这段代码?如果这样包装,会不会产生另一个线程,在这个过程中阻塞。write
谢谢 java.nio本身的优点并不提供任何非阻塞好处。标准的
FileChannel
仍然是一个阻塞API。为了访问它的非阻塞功能,您必须使用AsynchronousFileChannel
注意:小心不要将提供javaFuture
的读/写方法误认为是一个有用的异步抽象,因为使用该Future
时,您仍然必须阻塞才能收到完成通知。如果您有一堆等待的javaFuture
实例,那么它只比同步I/O更好
对于真正的异步I/O API,您应该使用scala Future包装接受
CompletionHandler
的读/写方法,以便异步地通知您I/O完成。(请参见示例)据我所知,它仍然会阻止函数的调用者。如果您希望它是异步的,您需要在将来包装它,或者使用AsynchronousFileChannel接口。您可以对它进行设置,使它不会阻塞,但您可能无法确保它终止,或者无法捕获错误,除非您像Lionel所说在将来包装它,并且等待或等待未来的实现。虽然如此,但是,那么,在这个场景中,nio本身的异步是什么呢?它在文件.write
中做了java.io不做的事情吗?