java.nio和编写非阻塞的Scala代码

时间:2015-03-13 00:53:10

标签: 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 + "/" + fileName), fileText.getBytes(StandardCharsets.UTF_8))
}

或者您是否需要使用promise和future来包装此代码,以便在不阻塞的情况下编写文件?如果这样包裹,那会不会产生另一个在.write期间阻塞的线程吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

java.nio凭借自身的优点不提供任何非阻塞优势。标准FileChannel仍然是阻止API。要访问其非阻止功能,您必须使用AsynchronousFileChannel

注意:注意不要将提供java Future的读/写方法误认为是有用的异步抽象,因为使用Future时你还是要阻塞被通知完成。如果您有一堆等待的Future个实例,它只比同步I / O更好。

对于真正的异步I / O API,您应该使用scala Future包装接受CompletionHandler的读/写方法,以便可以异步通知I / O完成。 (有关示例,请参阅shifter.io