2011-05-25 4 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().


Unrelated проблемы, расширенная папка WAR не лучшее место для использования в качестве постоянного хранения. Все эти файлы в расширенной папке WAR будут потеряны при каждом повторном развертывании WAR. Кроме того, hardcoding специфический для servletcontainer путь в коде делает его полностью неспортивным.

Если фактическое намерение состоит в том, чтобы вернуть файл Excel на каждом запросе основе к клиенту с помощью сервлетов, то вы должны использовать

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

Таким образом, он пишет в ответ немедленно без необходимость в промежуточном файле.

+0

Если что-то еще держит файл открытым, то почему бы, если бы работа, если файл с именем «file.xls», но не с именем «file1.xls». Разве это не потерпит неудачу в обеих ситуациях? – Biggsy

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) 
Смежные вопросы