2010-03-10 3 views
0

A есть такая проблема: есть некоторые RandomAccessFiles, которые открываются через алгоритм. Функция, в которой они используются, рекурсивна. Я не могу закрыть их (если я это сделаю, я разрушу алгоритм). Есть ли способ закрыть их (удалить потом)?Не удается удалить файл

ответ

2

Вы можете использовать File.deleteOnExit(), тогда файлы будут автоматически удалены при завершении JVM.

+0

Не будет если он нуждается в очистке, но продолжит работу (например, на сервере или в более длинном рабочем приложении). –

+0

Да, согласен. Это только удаление – Dmitry

3

Начните с нерекурсивной подпрограммы, которая открывает файл, передает его вашей рекурсивной подпрограмме, а затем закрывает ее, когда заканчивается рекурсивная подпрограмма.

+0

+1: вы ** должны ** закрыть его. – BalusC

1

Каждая рекурсивная функция должна иметь какое-то условие прерывания. Просто удалите файл в конце вашего рекурсии.

КПП. вы должны закрыть каждый файл, который вы открываете, если ваша функциональная структура не позволяет вам это сделать, вы должны его изменить.

+0

Неверная ошибка? – Dmitry

2

Есть целый ряд способов для решения этой проблемы в зависимости от деталей вашей проблемы:

  • Если у вас есть только 1 файл, используйте решение @Bill Д.К. открытия файла в нерекурсивна рутине до ввода рекурсивной части является хорошим подходом.

  • Если у вас есть небольшое количество файлов для открытия, создайте себе класс «файловый менеджер» с помощью одного метода, который откроет новый файл по запросу и второй метод, который закроет и удалит все открытые файлы. Измените алгоритм открытия файлов с помощью диспетчера файлов и поместите вызов метода «закрыть все» в предложении finally try/finally, окружающем рекурсивный алгоритм.

  • Если у вас есть произвольно большое количество файлов, которые нужно открыть, вам придется перепроектировать ваш алгоритм, чтобы можно было удобно закрыть их по требованию разумным способом. Или измените алгоритм так, чтобы ему не нужно было использовать столько файлов. Решение

@Michael Borgwardt»(не закрывать файл на всех, и пометить его как удалить-на-выход) потенциально хрупкое, особенно если алгоритм должен открыть большое количество этих файлов. На многих платформах ОС на каждый процесс ограничено количество открытых файлов.

+0

Спасибо, я попробую это – Dmitry

1

Невозможно описать алгоритм, но даже если вы используете рекурсивную реализацию, вы сможете закрыть его при рекурсивном возврате.

Другой подход, чтобы открыть и закрыть файл вне рекурсивной функции:

Например:

main() { 
    File file = openFile() 
    recursiveFunction(file); // do whatever is needed and pass the file as arg 
    file.close() 
    } 

Или открыть и закрыть файл в рекурсивной функции

void recursiveFunction() { 
    File file = openFile() 
    doX 
    doY 
    if(finished()) { // guard condition executed when returning from the recursion 
     closeFile() 
    } else { 
     recursiveFunction() 
    } 
} 
Смежные вопросы