[英]How to list files in directory in a non-blocking manner in Java?
在 Java 中使用nio
package 中的文件在目錄中列出“文件”很簡單:
Stream<Path> paths = Files.list(Path.of("<folder>"))
但是對Files.list(..)
的調用被阻塞。 如何以非阻塞方式列出目錄中的文件?
更新
“阻塞”是指不阻塞任何線程,就像在反應式編程的上下文中一樣。 就我而言,我使用的是Spring的項目反應器,我有一個這樣定義的方法:
public Flux<String> doStuffWithFilesInDirectory(String dir) {
// Intellij complains that the call to "Files.list(..)" is inappropriate since it's a blocking call
var fileStream = Files.list(Path.of(dir));
return Flux.fromStream(fileStream). ..
}
如果您只想從調用線程異步運行Files.list
,則可以這樣做而無需尋找“替代”文件 API。
最基本的例子是:
Runnable lister = () -> {
try {
SomeReceivingClassOrInstance
.someEventMethod(Files.list(Path.of("yourPath")));
}
catch (IOException ioe) {
// TODO handle
ioe.printStackTrace();
}
};
然后您可以:
Stream<Path>
並對其進行操作的方法。new Thread(lister).start();
異步調用Runnable
從您希望異步啟動操作的位置請注意,周圍有很多替代和更優雅/更高級別的示例,可以異步運行操作。
這只是一個案例來證明您實際上不需要進一步查看 nio API(例如使用FileVisitor
等)來進行異步處理。
筆記
深思熟慮:如果相反,您真的希望根據列表逐漸“發現”的內容懶惰地填充集合,那么您最好在自己的線程中啟動FileVisitor
,並為每個線程填充一個線程安全的集合入口。
磁盤的本質是它們不會立即產生信息。 因此,可能的“非阻塞”解決方案是
(a) 在單獨的線程中同步阻塞執行,或
(b) 使用某種通知機制(回調、Future 等)啟動異步操作,以告訴您何時完成。
在后一種情況下,不僅需要通過一些 Java 方法來實現,而且需要底層操作系統提供支持。 由於並非所有系統都提供“異步 readdir”,我懷疑您也找不到 Java 接口。 這是一般推理的論點,所以我可能錯了 - 但我不會打賭。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.