2011-08-18 347 views
3

我有某種批處理程序應該從目錄中選取文件並對其進行處理。用Java找到目錄中的第一個文件

由於這個程序應該是:

  • 運行在JDK 5,
  • 小(沒有外部庫)
  • 快! (伴隨着一聲巨響)

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

+0

你想挑選一個已命名的文件/目錄或任何文件嗎?此外,處理該文件後,您是否轉向其他人或退出程序? –

+0

所以要清楚,你需要從目錄中獲得一個文件(任何文件)還是隻想知道該目錄是否包含文件? – Ali

+0

只是任何文件,第一個被發現 - 程序應該在目錄中存在文件時執行此操作(連續添加文件);我只是不希望每次都列出文件夾中的所有文件,看起來效率很低...... – stephanos

回答

6

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

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

+0

你對大目錄的觀點是非常真實的。但是除了Java以外,這些都會導致很多問題。最好的方法不是將大量文件放入一個目錄中。 –

+0

最佳答案,簡短而甜美:) – stephanos

+0

DirectoryStream是Interface,我們不能用它來做任何工作,包括獲取文件。 – Gangnus

0

使用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; 
    } 
}); 
+2

這仍然會遍歷所有文件... –

+0

確實如此,但它確實避免了創建和返回整個「文件」或文件名對象數組的開銷。 –

0

我不知道爲什麼你需要任何文件目錄,但我有一個測試用例需要任何文件:
這是我的方式,可能它不適合你的問題。無論如何

只是創建一個新的。 (聽起來很奇怪,我知道)

 try { 
      File any = new File("C:/"+UUID.randomUUID().toString()); 
      if(any.createNewFile()){ 
       // just a file in Directory C:/ 
      } 
     } catch(IOException ex) { 
      ex.printStackTrace(); 
     } 
0

有沒有好的解決辦法在這裏Java 1.5中,你可以使用一個過濾器,只得到1文件,但那麼Java只會返回一個文件,但分析過所有的人反正。如果你不需要實際的文件對象,你可以嘗試像Runtime.getRuntime().exec("dir")那樣分割返回的字符串\n並打印出第一行:-P

0

編輯:我的實現使用.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; 
} 
0

如果一眼類類文件系統,把它歸結爲訪問文件系統,只有列表方法因此似乎沒有用「純粹的」JAVA來選擇文件的其他方式,而不是將它們全部列在字符串數組中。

2

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

+0

謝謝,我會研究它! – stephanos

相關問題