我有某種批處理程序應該從目錄中選取文件並對其進行處理。用Java找到目錄中的第一個文件
由於這個程序應該是:
- 運行在JDK 5,
- 小(沒有外部庫)
- 快! (伴隨着一聲巨響)
... 什麼是最好的辦法只能從目錄中選擇一個文件 - 在不使用File.list()
(可能是數百個文件)?
我有某種批處理程序應該從目錄中選取文件並對其進行處理。用Java找到目錄中的第一個文件
由於這個程序應該是:
... 什麼是最好的辦法只能從目錄中選擇一個文件 - 在不使用File.list()
(可能是數百個文件)?
在Java 7中,您可以使用DirectoryStream,但在Java 5中,獲取目錄條目的唯一方法是list()
和listFiles()
。
請注意,列出一個包含數百個文件的目錄並不理想,但與處理其中一個文件相比,這仍然可能沒有什麼大不了。但是,一旦目錄中包含數千個文件,它可能開始成爲問題。
使用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;
}
});
這仍然會遍歷所有文件... –
確實如此,但它確實避免了創建和返回整個「文件」或文件名對象數組的開銷。 –
我不知道爲什麼你需要任何文件目錄,但我有一個測試用例需要任何文件:
這是我的方式,可能它不適合你的問題。無論如何
只是創建一個新的。 (聽起來很奇怪,我知道)
try {
File any = new File("C:/"+UUID.randomUUID().toString());
if(any.createNewFile()){
// just a file in Directory C:/
}
} catch(IOException ex) {
ex.printStackTrace();
}
有沒有好的解決辦法在這裏Java 1.5中,你可以使用一個過濾器,只得到1文件,但那麼Java只會返回一個文件,但分析過所有的人反正。如果你不需要實際的文件對象,你可以嘗試像Runtime.getRuntime().exec("dir")
那樣分割返回的字符串\n
並打印出第一行:-P
編輯:我的實現使用.list(),正如你所說的不會但它可能會持有一些價值:)
如果你看看文件實現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;
}
如果一眼類類文件系統,把它歸結爲訪問文件系統,只有列表方法因此似乎沒有用「純粹的」JAVA來選擇文件的其他方式,而不是將它們全部列在字符串數組中。
從你說你想處理目錄中的每個文件一次(包括被添加到目錄中的文件)看來。您可以執行以下操作:在添加文件時生成通知的目錄上設置監視器。然後處理您收到通知的每個文件。由於您使用JDK 5,我建議使用jpathwatch。請注意,在嘗試處理文件之前,您需要確保文件寫入已完成。在啓動監視器以確保您將處理每個新文件後,使用文件列表的一次性處理當前內容。
謝謝,我會研究它! – stephanos
你想挑選一個已命名的文件/目錄或任何文件嗎?此外,處理該文件後,您是否轉向其他人或退出程序? –
所以要清楚,你需要從目錄中獲得一個文件(任何文件)還是隻想知道該目錄是否包含文件? – Ali
只是任何文件,第一個被發現 - 程序應該在目錄中存在文件時執行此操作(連續添加文件);我只是不希望每次都列出文件夾中的所有文件,看起來效率很低...... – stephanos