gpt4 book ai didi

Java File.deleteOnExit() 不适用于 Windows 10

转载 作者:行者123 更新时间:2023-12-01 11:08:09 39 4
gpt4 key购买 nike

我正在尝试为 jarfile 编写代码,如果执行该代码,它将关闭 JVM,然后删除该 jarfile。这是我到目前为止尝试做的事情,但它并没有在 JVM 关闭后删除文件。

    public static void check() {
if (isJarFile()) {
try (Scanner s = new Scanner(new URL(HASH_PROVIDER).openStream())) {
String remote_hash = s.nextLine().trim();
File jarFile = getJarFile();
if (jarFile != null && !remote_hash.equals(getMD5Checksum(jarFile.getAbsolutePath()))) {
jarFile.setWritable(true);
jarFile.deleteOnExit();
}
System.exit(0);
} catch (Exception e) {
e.printStackTrace();
System.exit(0);
}
}
}

public static byte[] createChecksum(String filename) throws Exception {
InputStream fis = new FileInputStream(filename);
byte[] buffer = new byte[1024];
MessageDigest complete = MessageDigest.getInstance("MD5");
int numRead;
do {
numRead = fis.read(buffer);
if (numRead > 0) {
complete.update(buffer, 0, numRead);
}
} while (numRead != -1);
fis.close();
return complete.digest();
}

public static String getMD5Checksum(String filename) throws Exception {
byte[] b = createChecksum(filename);
String result = "";
for (int i = 0; i < b.length; i++) {
result += Integer.toString((b[i] & 0xff) + 0x100, 16).substring(1);
}
return result;
}

public static File getJarFile() {
try {
return new File(Main.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath());
} catch (URISyntaxException e) {
e.printStackTrace();
}
return null;
}

有人可以解释为什么deleteOnExit在这种情况下不起作用吗?

最佳答案

确保在退出 JVM 之前关闭在文件上打开的所有流。否则,应该删除文件的关闭 Hook 无法在 Windows 上触发,因为打开流会触发操作系统级别的文件锁定。

对于您的示例,这意味着您在退出 try-with-ressources-block 之前不得结束 JVM 进程,大致翻译为:

Scanner s = new Scanner(new URL(HASH_PROVIDER).openStream())
try {
// your code
System.exit(0);
} finally {
s.close(); // Never executed
}

由于程序在执行finally block 之前退出,因此会在不关闭流的情况下触发关闭钩子(Hook),并且无法删除文件。

请注意,以下代码将满足您的目的,因为finally block 是在关闭 try-with-ressources 参数之后执行的:

try (Scanner s = new Scanner(new URL(HASH_PROVIDER).openStream())) {
// your code
} catch (Exception e) {
e.printStackTrace();
} finally {
System.exit(0);
}

关于Java File.deleteOnExit() 不适用于 Windows 10,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32709678/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com