2011-05-25 96 views
0

修正:而不是調用isFile()我用exists(),它似乎工作正常。如果可能的話,有人可以解釋爲什麼這種改變起作用了?Java:文件輸出幫助

我試圖寫出一個excel文件,但如果名稱已經存在,在嘗試創建該文件時遇到問題。

基本上我正在上傳到服務器上的文件,讀取它,然後在具有相同文件名的新位置輸出報告文件。我試圖通過簡單地檢查文件是否已經存在,然後在文件名上添加一個數字來做到這一點。我的代碼在文件不存在的情況下或者沒有數字時存在(例如filename.xls)。如果一個文件名稱爲「filename1.xls」,服務器似乎在嘗試寫入文件時會掛起。有什麼可以解決這個問題?

這裏是我的代碼:

 String destination = "c:/apache-tomcat-7.0.8/webapps/reports/" + fileName.substring(fileName.lastIndexOf("\\")+1, fileName.lastIndexOf(".")) + ".xls"; 
     int filenum = 1; 
     while (new File(destination).isFile()) { 
      destination = "c:/apache-tomcat-7.0.8/webapps/reports/" + fileName.substring(fileName.lastIndexOf("\\")+1, fileName.lastIndexOf(".")) + filenum + ".xls"; 
      filenum++; 
     } 
     WritableWorkbook workbook = Workbook.createWorkbook(new File(destination)); 

回答

2

這將如果某些進程仍然保持文件打開發生。例如。你已經在文件上創建了一個FileInputStream來閱讀它,但是在閱讀之後從不會調用close()


無關的問題,擴大WAR文件夾是不能作爲永久存儲使用的最佳場所。每當您重新部署WAR時,展開的WAR文件夾中的所有文件都會丟失。在代碼中對特定於servletcontainer的路徑進行硬編碼使其完全不可移植。

如果您實際意圖是返回上使用servlet每個請求的基礎上給客戶端的Excel文件,那麼你就應該使用

WritableWorkbook workBook = Workbook.createWorkbook(response.getOutputStream()); 
// ... 

這樣,它會立即寫入應答,而不需要一箇中間文件。

+0

如果事情仍保持文件打開那麼爲什麼當工作,如果名稱爲「file.xls」,而不是名稱爲「file1.xls」的文件。這兩種情況都不會失敗嗎? – Biggsy 2011-05-25 18:54:13

1

使用File.createTempFile(prefix, suffix, directory) API:

String localName = new File(fileName).getName(); 
String nameNoExt = localName.substring(0, fileName.lastIndexOf(".")); 
String extension = localName.substring(fileName.lastIndexOf(".")); // need to include the . 
File directory = new File("c:/apache-tomcat-7.0.8/webapps/reports/"); 
File destFile = File.createTempFile(nameNoExt, extension, directory)