[英]Find first file in directory with Java
我有一些批處理程序應該從目錄中獲取文件並進行處理。
由於這個程序應該:
... 只從目錄中選擇一個文件的最佳方法是什么 - 不使用 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.