Вызвано: java.io.FileNotFoundException: /path/somthing.jar (Является каталогом) при создании объекта FileOutputStream

#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. Это уже сделано, и каталоги создаются, но я получил еще одно исключение все вместе. я действительно не понимаю, почему он жалуется на то, что файл является каталогом, спасибо за ответ