java Невозможно удалить файл, используемый другим процессом

у меня есть этот код

 import org.apache.commons.io.FileUtils;
    try {
        FileUtils.copyURLToFile(new URL(SHA1_LINK), new File("SHA1.txt"));
        if(!sameSha1()) {
            System.out.println("sha diferentes");
            FileUtils.copyURLToFile(new URL(LINK), new File(PROG));
        }
    } catch (Exception e) {
        System.out.println("Internet is off");
    }
    //delete SHA1 file
    Files.deleteIfExists(Paths.get("SHA1.txt"));

и когда я его выполняю, он говорит

java.nio.file.FileSystemException
Процесс не может получить доступ к файлу, поскольку он используется другим процессом (в sun.nio.fs.WindowsException)

В sameSha1() у меня есть это:

String sha1Txt = new Scanner(new File("SHA1.txt")).useDelimiter("\\Z").next();

Я хочу удалить файл «SHA1.txt». Как я могу это сделать?


person alexandre1985    schedule 06.03.2015    source источник
comment
что еще использует этот файл, оставляя его открытым?   -  person Chris    schedule 06.03.2015
comment
Можете ли вы предоставить реализацию sameSha1?   -  person JuniorCompressor    schedule 06.03.2015


Ответы (2)


Я предполагаю, что с помощью sameSha1 вы открываете SHA1.txt, чтобы прочитать его, и забываете закрыть его.

РЕДАКТИРОВАТЬ:

Из вашего комментария вы содержите следующую строку в sameSha1:

String sha1Txt = new Scanner(new File("SHA1.txt")).useDelimiter("\\Z").next();

Итак, вы создаете экземпляр сканера, но не закрываете его явно. Вы должны сделать что-то вроде этого:

Scanner s = new Scanner(new File("SHA1.txt"));
try {
    String sha1Txt = s.useDelimiter("\\Z").next();
    ...
    return result;
}
finally {
    s.close();
}

Или, как предлагает @HuStmpHrrr в Java 7:

try(Scanner s = new Scanner(new File("SHA1.txt"))) {
    String sha1Txt = s.useDelimiter("\\Z").next();
    ...
    return result;
}
person JuniorCompressor    schedule 06.03.2015
comment
благодарю вас. В том же Sha1 у меня есть это: String sha1Txt = new Scanner(new File("SHA1.txt")).useDelimiter("\\Z").next();. Как закрыть? - person alexandre1985; 06.03.2015
comment
вы назначаете новый сканер (...) в переменной s и перед тем, как вернуться, вы вызываете s.close() - person JuniorCompressor; 06.03.2015
comment
вы используете try(Scanner s = new Scanner(new File("SHA1.txt"))) для автоматического закрытия файла. - person Jason Hu; 06.03.2015

Если он используется другим процессом, я предполагаю, что какая-то другая программа открыла этот текстовый файл. Попробуйте закрыть другую программу.

person Eric S.    schedule 06.03.2015
comment
Все программы закрыты, кроме IDE, которую я использую, и в ней не открыт файл SHA1.txt. - person alexandre1985; 06.03.2015
comment
@dan_san_1, что-то наверняка его блокирует: об этом говорит исключение. Используйте какой-нибудь инструмент, чтобы узнать, что это делает: technet.microsoft.com/en -us/sysinternals/bb896653.aspx - person Bart Kiers; 06.03.2015
comment
Или перейдите в каталог, где он сохранен, перечислите скрытые файлы и удалите блокировку самостоятельно. В Linux это ls -a, чтобы показать файлы и удалить тот, у которого есть ~. Не уверен, что это то же самое для Windows, но вы можете показать скрытые файлы в свойствах папки и посмотреть, сможете ли вы найти файл .lock. - person Eric S.; 06.03.2015