簡體   English   中英

使用Java查找目錄中的第一個文件

[英]Find first file in directory with Java

我有一些批處理程序應該從目錄中獲取文件並進行處理。

由於這個程序應該:

  • 在JDK 5上運行,
  • 小(沒有外部庫)
  • 而且快! (砰的一聲)

... 只從目錄中選擇一個文件的最佳方法是什么 - 不使用 File.list() (可能是數百個文件)?

在Java 7中,您可以使用DirectoryStream ,但在Java 5中,獲取目錄條目的唯一方法是list()listFiles()

請注意,列出包含數百個文件的目錄並不理想,但與處理其中一個文件相比,這可能沒什么大不了的。 但是,一旦目錄包含數千個文件,它可能會開始出現問題。

從您所說的內容看來,您希望一次處理目錄中的每個文件(包括添加到目錄中的文件)。 您可以執行以下操作:在添加文件時生成通知的目錄上設置監視器。 然后處理您收到通知的每個文件。 由於你使用JDK 5,我建議使用jpathwatch 請注意,在嘗試處理文件之前,您需要確保文件已完成。 啟動監視器以確保您將處理每個新文件后,請一次性使用文件列表來處理當前內容。

使用FileFilter (或FilenameFilter )編寫只接受一次,例如:

File dir = new File("/some/dir");
File[] files = dir.listFiles(new FileFilter() {
    boolean first = true;
    public boolean accept(final File pathname) {
        if (first) {
            first = false;
            return true;
        }
        return false;
    }
});

Java 1.5上沒有好的解決方案,你可以使用過濾器只獲取1個文件,但是java只會返回一個文件,但無論如何都要解析所有文件。 如果您不需要實際的文件對象,可以嘗試使用Runtime.getRuntime().exec("dir")將返回的字符串拆分為\\n並打印出第一行:-P

編輯:我的實現使用.list(),你說它不會,但它可能會持有一些價值:)

如果查看File實現,public String [] list()方法似乎比File [] listFiles()具有更少的開銷。 應該是最快的

String[] ss = myDir.list();
File toProcess = null;
for(int i = o ; i< ss.length ; i++){
 toProcess = new File(myDir.list()[i], myDir));
 if(toProcess.isFile())break;
}

來自File.class

public File[] listFiles() {
String[] ss = list();
if (ss == null) return null;
int n = ss.length;
File[] fs = new File[n];
for (int i = 0; i < n; i++) {
    fs[i] = new File(ss[i], this);
}
return fs;
}

如果看一下它歸結為文件系統訪問的類類FileSystem,那么只有list方法,所以在“純”JAVA中似乎沒有其他方法來選擇文件而不是在String數組中列出它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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