#java #file
#java #файл
Вопрос:
Кто-нибудь, пожалуйста, может сказать мне, как удалить файл из каталога после открытия и загрузки в базу данных?
Вот мой код:
public static void main(String[] args) throws SQLException{
int Count= 0;
File directory = new File("C://Documents and Settings//welcome//My Documents//Bluetooth Exchange Folder");
directory.deleteOnExit();
File files[] = directory.listFiles();
for(int index = 0; index < files.length; index ){
try {
FileReader inp = new FileReader (files[index]);
BufferedReader buf = new BufferedReader(inp);
String strLine;
try {
while ((strLine = buf.readLine()) != null)
{
System.out.println(strLine);
String[] dbColumnValues = strLine.split("%");
Connect.DoInsertIntoDB(Long.parseLong(dbColumnValues[0]),dbColumnValues[1],dbColumnValues[2], dbColumnValues[3]);
Count ;
System.out.println(Count " Row(s) are inserted into the Database");
GenHTML.gen();
}
}
Но файлы в каталоге не удаляются.
Пожалуйста, кто-нибудь может исправить ошибку в моем коде?
[В настоящее время я тестирую с 3 файлами в каталоге. После загрузки каждого файла в базу данных я хочу, чтобы каждый файл удалялся из каталога.]
Заранее спасибо!
Ответ №1:
Лучше быть явным в вашем коде.
File files[] = directory.listFiles();
for(int index = 0; index < files.length; index ){
{
// Process files[index]
// ...
boolean wasDeleted = files[index].delete();
if (!wasDeleted)
{
// Deal with error
}
}
Кроме того, вам нужно закрыть дескрипторы файлов, когда вы закончите с ними
FileReader inp = new FileReader (files[index]);
try
{
// ...
}
finally
{
inp.close();
}
Комментарии:
1. Вы должны
close
BufferedReader
, а неFileReader
поскольку закрытие первого приведет к закрытию обоих.2. Да!! Большое спасибо! Это действительно помогло. Теперь файлы удаляются из каталога.
Ответ №2:
Методы File.delete()
и File.deleteOnExit()
удалят каталог, только если он пуст. Вам придется удалять файлы из каталога по мере их обработки (и убедитесь, что там нет подкаталогов). В качестве альтернативы вы можете использовать FileUtils.deleteDirectory()
из Apache Commons IO в конце вашей обработки.
Ответ №3:
Двойные косые черты кажутся подозрительными. Либо используйте единственную обратную косую черту, которую вам нужно заключить в кавычки как \
, либо используйте единственную косую черту /
.
Кроме того, вы могли бы попробовать использовать метод delete()
when then возвращает вместо deleteOnExit()
.
Комментарии:
1. Это должен быть комментарий, а не ответ.
2. Но на самом деле, данные из файлов нормально загружаются в базу данных, что означает, что файлы из каталога идентифицированы. Итак, я думаю, косая черта — это не проблема
Ответ №4:
Согласно API:
Запрашивает удаление файла или каталога, обозначенного этим абстрактным путем, при завершении работы виртуальной машины.
Однако в вашем коде вы обрабатываете эту функцию так, как будто она немедленно удаляет каталог.
Ответ №5:
Вы не можете удалить каталог, если он не пуст. Если каталог не пуст, необходимо сначала рекурсивно удалить все файлы и подкаталоги в каталоге.
Таким образом, directory.deleteOnExit() в вашем случае не будет работать.
Более того, я предлагаю вам явно удалять файлы, не используя deleteOnExit(). Это тупая функция, которая не удалит файл при выходе, если все потоки ввода / вывода, связанные с файлом, не закрыты. Всегда закрывайте потоки и явно удаляйте файлы, а затем каталог.
Ответ №6:
Возможно, что вам нужно сделать, это использовать метод dispose() для компонента, который открывает файл. Возможно, ситуация заключается в том, что файл по-прежнему рассматривается как открытый и заблокированный компонентом, в котором он был открыт, поэтому вы должны убедиться, что используете dispose()
метод для решения этой проблемы.