2011-05-25 78 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)