2011-04-09 71 views
2

我聯繫外部服務,我的Java應用程序有效的方法。的Java:掃描文件夾中特定文件

流動情況如下: - >我生成一個XML文件,並把它的文件夾中,然後該服務處理文件和眼下後具有延伸.out

同名返回另一個文件我把文件放在文件夾中,我以一個循環開始,直到我得到這個文件,所以我可以讀取結果。

下面是代碼:

 fileName += ".out"; 
     File f = new File(fileName); 
     do 
     { 
      f = new File(fileName); 
     } while (!f.exists()); 

     response = readResponse(fileName); // got the response now read it 

我的問題來這裏,我會以正確的方式做,有沒有更好/更有效的方式來等待文件?

一些信息:我跑我在WinXP的應用程序,通常需要外部服務不到一秒鐘與文件作出迴應,我每天發送大約200請求該服務。包含結果文件的文件夾路徑始終相同。

歡迎您提出任何建議。

謝謝你的時間。

+4

爲什麼創作中的每個循環的新File對象的? f的第一個例子應該沒​​問題。我建議在循環中放置一個Thread.sleep(100) - 這將使繁忙循環不那麼繁忙(每秒10次)。另一個問題是,文件可能沒有完全寫在你看到它出現在目錄中的那一刻。 – Ingo 2011-04-09 08:33:18

+0

謝謝@ingo我還沒有關於該文件沒有完全寫入。 – Adnan 2011-04-09 08:36:23

+2

@Adam,不幸的是,這是一個比人們想象的更陌生的問題 - 所有這些都可能在你的開發人員機器上運行良好,但在「生產」中則完全沒有。操作系統在這裏也起着重要的作用,而Unix會忠實地報告當前的文件大小,Windows可能會報告0或2的冪的倍數,直到文件從另一端真正關閉。在這種情況下一個很好的技巧:讓另一個程序用另一個名字編寫一個文件,並在它關閉時找到它的名字。 – Ingo 2011-04-09 08:40:58

回答

8

沒有理由重新創建File對象。它只是表示文件的位置,不管文件是否存在。此外,如果沒有至少短暫的延遲,你可能不想要一個循環,否則它會使處理器達到最大值,直到文件存在。你可能想是這樣的,而不是:

File file = new File(filename); 
while (!file.exists()) { 
    Thread.sleep(100); 
} 

編輯:英戈使得在評論一個偉大的點。該文件可能並不完全在那裏,因爲它存在。保證它準備好的一種方法是在第一個完成寫入之後,第一個進程創建第二個文件。然後讓Java程序檢測第二個文件,將其刪除,然後安全地讀取第一個文件。

+0

非常感謝@ WhiteFang34 – Adnan 2011-04-09 08:34:11

+0

對Ingo的評論+1。我打算將它作爲答案發布,直到我意識到它已經在評論中和在你的最後。 :)請注意,雖然它很有用,但並不能最大限度地擴展。體面的,但不是最好的如果你的文件很小,而且你做得很多,你會有很多額外的開銷。顯然,最好是在必要的時候開發簡單,簡單並且優化的產品,並且憑藉這個標誌它現在適合該法案。 – corsiKa 2011-04-09 09:03:24

相關問題