簡體   English   中英

Java中如何以非阻塞方式列出目錄中的文件?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM