Удаление файла с помощью delete () - Java - PullRequest
0 голосов
/ 28 сентября 2010

Мой код использует BufferedReader для чтения из файла [main.txt] и PrintWriter для записи в другой временный файл [main.temp].Я закрываю оба потока и все же не смог вызвать метод delete() для объекта File, связанного с [main.txt].Только после вызова System.gc() после закрытия обоих потоков я смог удалить объект File.

public static boolean delete (String str1, String str2, File FileLoc)
{
    File tempFile = null;
    BufferedReader Reader = null;
    PrintWriter Writer = null;

    try
    {
        tempFile = new File (FileLoc.getAbsolutePath() + ".tmp");
        Reader = new BufferedReader(new FileReader(FileLoc));
        Writer = new PrintWriter(new FileWriter(tempFile));
        String lsCurrLine = null;

        while((lsCurrLine = Reader.readLine()) != null)
        {
            // ...
            // ...

            if (true)
            {
                Writer.println(lsCurrLine);
                Writer.flush();
            }
        }

        Reader.close();
        Writer.close();
        System.gc();
    }
    catch(FileNotFoundException loFileExp)
    {
        System.out.println("\n File not found . Exiting");
        return false;
    }
    catch(IOException loFileExp)
    {
        System.out.println("\n IO Exception while deleting the record. Exiting");
        return false;
    }
}

Это надежно?Или есть лучшее решение?

Ответы [ 4 ]

3 голосов
/ 28 сентября 2010

@ user183717 - указанный вами код явно не является всем соответствующим кодом.Например, эти "..." и тот факт, что File.delete() на самом деле не вызывается в этом коде.

Когда объект потока собирается мусором, его финализатор закрывает базовый дескриптор файла.Таким образом, тот факт, что удаление работает только при добавлении вызова System.gc(), является убедительным доказательством того, что вашему коду каким-то образом не удалось закрыть какой-то поток для файла.Вполне возможно, что объект потока отличается от того, который открыт в опубликованном вами коде.

Правильно написанный код обработки потока использует блок finally, чтобы обеспечить закрытие потоков независимо от того, что.Например:

Reader reader = new BufferedReader(new FileReader(file));
try {
    // do stuff
} finally {
    try {
        reader.close();
    } catch (IOException ex) {
        // ...
    }
}

Если вы не следуете этому шаблону или чему-то подобному, есть хороший шанс, что есть сценарии, где потоки не всегда закрываются.Например, в вашем коде, если один из вызовов read или write вызвал исключение, вы пропустите операторы, закрывающие потоки.

Это [то есть вызов System.gc();] надежный?

Нет.

  1. JVM может быть настроен на игнорирование вызова gc() вашего приложения.
  2. Нет гарантии, что потерянный потокбудет недоступен ... пока.
  3. Нет гарантии, что вызов System.gc() заметит, что поток недоступен.Гипотетически, объект потока может быть сохранен, а вызов System.gc() может только собрать пространство Eden.
  4. Даже если GC обнаружит, что поток недоступен, нет гарантии, что GC запустит финализаторнемедленно.Гипотетически, запуск финализаторов может быть отложен ... на неопределенное время.

Или есть лучшее решение?

Да.Исправьте ваше приложение, чтобы правильно закрыть его потоки.

2 голосов
/ 28 сентября 2010

Когда вы говорите, что «закрываете оба потока», вы имеете в виду BufferedReader и PrintWriter?

. Вам нужно только закрыть BufferedReader, прежде чем удаление будет работать, но вы такженеобходимо закрыть основной поток;обычно звонит BufferedReader.close().Похоже, вы думаете , что вы закрываете поток, но на самом деле это не удается.

Одна проблема с вашим кодом: вы не закрываете потоки, если возникают исключения.Обычно лучше закрыть потоки в блоке finally.

Кроме того, опубликованный вами код нигде не использует File.delete()?И что именно делают строки ... - они случайно передают Reader в новый поток?

1 голос
/ 28 сентября 2010

попробуйте использовать библиотеку java.io.File.вот простой пример:

File f = new File("file path or file name");
f.delete();
0 голосов
/ 28 сентября 2010

попробуйте использовать Apache Commons IO

http://commons.apache.org/io/description.html

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