Объяснение
file.delete()
не выдает ошибку в случае неудачи. И здесь он потерпел неудачу, на что указывает его возвращаемое значение false
.
Выполните вместо этого Files.delete(file.toPath())
, и вы увидите точную причину ошибки, которая:
Exception in thread "main" java.nio.file.FileSystemException: D:\Programming\Java\Program - Script Test\files\record.txt: The process cannot access the file because it is being used by another process
at java.base/sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:92)
at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:103)
at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:108)
at java.base/sun.nio.fs.WindowsFileSystemProvider.implDelete(WindowsFileSystemProvider.java:274)
at java.base/sun.nio.fs.AbstractFileSystemProvider.delete(AbstractFileSystemProvider.java:105)
at java.base/java.nio.file.Files.delete(Files.java:1146)
at Laboratory.main(Laboratory.java:123)
Итак,
Процесс не может получить доступ к файлу, потому что он используется другим процессом
Поскольку у вас все еще есть сканер для открытия файла, вы заблокировать себя от удаления. Закройте сканер, и он заработает.
Ваш код открывает два (а не один) сканер на file
, один в начале:
Scanner fscan = new Scanner(file);
, который вы используете во время начального l oop:
for (int i = 0; i < linecount; i++) {
content = fscan.nextLine();
}
а затем позже вы создаете второй:
fscan = new Scanner(file);
, который вы также закрываете во время своего finally
блока:
fscan.close();
Но вы никогда не закрывали первый сканер.
Решение
Добавить
fscan.close();
После начального l oop:
for(int i = 0; i < linecount; i++) {
content = fscan.nextLine();
}
fscan.close();
и file.delete()
будет успешным.
NIO
Как объяснялось, file.delete()
- это плохо разработанный метод. Предпочитайте Files.delete(path)
.
В общем, если у вас нет веских причин использовать старую громоздкую библиотеку ввода-вывода файлов, не делайте этого. Вместо этого используйте NIO (Java 7 +).