Java无法删除文件,因为文件正在被另一个进程使用。

6
我有这段代码。
 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”。我该怎么做?


还有什么正在使用这个文件并保持打开状态的吗? - Chris
你能提供相同的Sha1实现吗? - JuniorCompressor
3个回答

6
我猜测你在使用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;
}

谢谢。在同一个代码块中,我有这个:String sha1Txt = new Scanner(new File("SHA1.txt")).useDelimiter("\\Z").next();。怎么关闭它? - alexandre1985
1
你将新的 Scanner(...) 赋值给变量 s,在返回之前调用 s.close() - JuniorCompressor
你可以使用 try(Scanner s = new Scanner(new File("SHA1.txt"))) 自动关闭文件。 - Jason Hu

0
尝试在文件资源使用完毕后自动关闭它,类似于这样:
Path tempFilePath = fileUtil.createTempFile( uploadedInputStream, fileDetail.getFileName() );
File tempFile = tempFilePath.toFile();

try (InputStream is = new FileInputStream( tempFile )) {
    uploadDocument( fileTypeId, description, is );
} catch (IOException e) {
    LOGGER.debug( e );
}

Files.deleteIfExists( tempFilePath );

0

如果它正在被另一个进程使用,我猜想其他程序已经打开了那个文本文件。尝试关闭其他程序。


除了我使用的IDE之外,所有程序都已关闭,它没有打开SHA1.txt文件。 - alexandre1985
@dan_san_1,肯定有某个东西持有锁:异常信息就是这么说的。使用一些工具来找出是什么在做这件事情:https://technet.microsoft.com/zh-cn/sysinternals/bb896653.aspx - Bart Kiers
或者进入保存文件的目录,列出隐藏文件并自己删除锁定。在Linux中,使用ls -a命令显示文件,并删除带有~的文件。不确定Windows是否相同,但您可以在文件夹属性下显示隐藏文件,看看是否可以找到.lock文件。 - Eric S.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接