用于加载系统库时无法删除临时文件

时间:2015-10-20 01:03:33

标签: java dll

我正在尝试通过将jar文件中的.DLL复制到临时文件,然后加载该文件来将本机库加载到系统中:

try (InputStream in = getResourceStream("/lib/Foo.dll")) {
  File file = createTemporaryFileFromStream(in);
  System.load(file.getAbsolutePath());
  if (!file.delete()) {
    System.err.println("Failed to delete temporary file " + file.getAbsolutePath());
  }
}

file.delete()调用失败了,我留下了一个临时文件。

如果我删除 System.load(...)调用,则可以删除临时文件,因此似乎 System.load(...)保持文件资源打开,防止文件删除工作(这是在Windows 7 64位计算机上)。

我还添加了一个 file.deleteOnExit()调用,但是在JVM关闭后,临时文件仍然存在。

我还添加了一个自定义关闭钩子,以防万一:

Runtime.getRuntime().addShutdownHook(new Thread() {
  public void run() {
    if (file.exists()) {
      if (!file.delete()) {
        System.err.println("Shutdown failed to delete file " + file.getAbsolutePath());
      }
    }
  }
});

同样,临时文件未被删除。

我真的想从jar文件加载.DLL而不是修改 java.library.path 系统属性并指向.DLL的绝对位置,尽管代码实际上,上面确实从jar文件资源加载了.DLL,它留下了一个临时文件,这是不可接受的。

有没有办法使用可以在加载库后删除的临时文件来执行此操作?

0 个答案:

没有答案