#java #jakarta-ee #io #create-directory
#java #джакарта-ee #io #создать-каталог
Вопрос:
это действительно простой, но он заставил меня поцарапать слух на 4 часа, теперь я сдаюсь. чтобы предоставить как можно больше информации, я могу сказать, что это проект java webapp с zk 5.0.8 в качестве интерфейса spring hibernate maven под ubuntu 11.04 с разрешением для basedir, равным 777.
попробовал загрузить файл, кажется, все в порядке, и там, где я уверен, что мой код верен, он просто не работает.
вот этот код
private boolean saveUploadledFile(Media uploadedMedia, String basedir) {
String code = codeGenerator.generateContentCode(15);
String FINAL_DIR_PATH = basedir "/" "Racing" "/" code;
String FINAL_FILE_PATH = FINAL_DIR_PATH "/" uploadedMedia.getName();
alert(FINAL_DIR_PATH);
try {
File finaldir = new File(FINAL_DIR_PATH);
//apache commons
FileUtils.forceMkdir(finaldir);
alert("Size equals" uploadedMedia.getByteData().length);
fout = new FileOutputStream(new File(FINAL_DIR_PATH "/" addContentWindow1$txtName.getText() ".jar"));
//apache commons
IOUtils.copy(uploadedMedia.getStreamData(), fout);
} catch (IOException e) {
throw new RuntimeException(e);
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
try {
IOUtils.closeQuietly(in);
IOUtils.closeQuietly(fout);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
return false;
}
new FileOutputStream всегда генерирует исключения. итак, если я не могу указать, где я хочу сохранить, как сохранить файлы. есть какие-нибудь идеи? я намеренно вывожу размер файла, чтобы убедиться, что файл есть. Кто-нибудь может пролить некоторый свет? спасибо, что прочитали это
фактическим исключением является
Вызвано: java.io.FileNotFoundException: /joseph/mbcs/Games/Racing/20314/somthing.jar (является каталогом)
Ответ №1:
Возможно, я ошибаюсь, но разве эта часть вашего кода не ошибочна?
if (!finaldir.exists()) {
if (!finaldir.canWrite())
finaldir.mkdirs(); // this creates no directory no error
else
alert("Cannot write to the directory" );
}
Если каталог не существует, вы проверяете, не можете ли вы записать туда, а затем создать его, в противном случае вы выводите ошибку. Я думаю, что !
это неправильно.
Может быть причиной вашей проблемы, но с таким же успехом может и не быть.
Комментарии:
1. Привет, я исправил то, что вы заметили, но, думаю, это было не то. обновил свой пост
2. Эээ. Я только что понял , что ты никогда не звонишь
createNewFile()
finalfile
.3. неужели ? действительно ли это необходимо здесь, я не нашел этого метода, когда сравнивал свой с другим способом в сети. но я предполагаю, что сначала возникает проблема с созданием каталога. как я уже упоминал, используя простой консольный проект, создается каталог. даже не знаю, чего мне здесь не хватает. Спасибо
4. обновлено на основе вашего предложения, и теперь я теряюсь. Все еще не работает: (
5. Извините… Я понятия не имею, как это исключение связано с вашим кодом. Согласно документации, в сообщении совершенно четко указано, что файл, в который вы пытаетесь выполнить запись, на самом деле является каталогом. Я не понимаю, как это могло произойти, основываясь на вашем коде.
Ответ №2:
Не учитывается:
if(finalfile.canWrite()) {
поскольку вы только что создали файл и записываете в него.
Вы получите неправильное FileNotFoundException с именем FileNotFoundException (я думаю, переименованный в Java 7), когда конструктор OutputStream потерпел неудачу при записи.
Еще один совет, общая работа, такая как копирование, может быть выполнена с использованием apache-commons (IOUtils, FileUtils), т.е.:
import org.apache.commons.fileupload.util.Streams;
Streams.copy(in, out, false);
Комментарии:
1. Привет, спасибо за советы. Я думаю, что моя проблема действительно в том, что из веб-приложения я не могу создать каталог. Таким образом, проблема возникает фактически перед записью outputstream. Возможно, я ошибаюсь, но can write всегда возвращает false
2. Кстати, не могли бы вы подробнее рассказать о своем решении? я не вижу, как использовать его в своем коде, так как не знаком с этой библиотекой.спасибо
3. Никто (другой) не может выполнять запись в уже запущенный FileOutputStream, поэтому File.CanWrite возвращает false . Просто удалите тест. Или попробуйте { … } catch (исключение IOException e) { не удалось записать }
4. Это уже сделано, и каталоги создаются, но я получил еще одно исключение все вместе. я действительно не понимаю, почему он жалуется на то, что файл является каталогом, спасибо за ответ