Невозможно удалить файл после прочтения - PullRequest
0 голосов
/ 27 января 2010

Я передаю файл из файловой системы динамически с помощью jsp

Вот мой код:

<%@ page import="java.io.*,java.util.*"
    InputStream in = null;
    OutputStream responseOut = null;
    File  file  = new File(request.getAttribute("fileToServe"));
    try{
        in = new FileInputStream(file);
        responseOut = response.getOutputStream();
        // Transfer bytes from in to out
        byte[] buf = new byte[1024];
        int len;
        while ((len = in.read(buf)) > 0) {
            responseOut.write(buf, 0, len);
        }
    }finally{
         if( responseOut != null ) try {
            responseOut.close();
         } catch( IOException ioe ){}

        if( in != null ) try {
            in.close();
         } catch( IOException ioe ){}
    }
    file.delete();
%>

Проблема, с которой я сталкиваюсь, заключается в том, что файл удаляется только при первом запуске кода, то есть после перезапуска сервера. Последующие звонки не удаляют файл.

Я использовал ProcessExplorer для отслеживания этого и, да, да, Java VM хранит этот файл, я не знаю, почему это происходит.

Мы будем работать на ОС Windows, всегда, есть ли обходной путь для этого?

В Интернете я нашел несколько ресурсов по этому поводу, но я не могу понять из них, как решить эту проблему.

Ответы [ 2 ]

2 голосов
/ 27 января 2010

Что создает файл? Я вижу только чтение и затем удаляю его в этом коде.

На что нужно обратить внимание:

  • Чтение файла требует разрешения на чтение из файла, но удаление файла требует разрешения на запись из каталога ; и
  • Убедитесь, что вы close() любые файлы, которые вы создаете. Если вы этого не сделаете, вы можете потерять данные, или может потребоваться время для сброса неявного закрытия.

Наконец, использование такого атрибута, как fileToServe, полученного от пользователя, действительно опасно. Я надеюсь, что вы дезинфицируете это в другом месте. Вы должны убедиться, что только разрешенные файлы обслуживаются таким образом.

1 голос
/ 27 января 2010

Хорошо, я проверил после комментария cletus место, где создается этот файл. Метод close в потоке, в котором записан файл, отсутствует.

Тайна раскрыта

cletus, пожалуйста, добавьте свой ответ, чтобы я мог принять его

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...