如何删除使用URL#openConnection()打开的jar文件?

时间:2011-11-15 11:19:02

标签: java

我有一个小函数,基本上需要一个java.net.URL,读取文件并关闭它。我希望在读取结束后删除该文件。但是,当进程正在运行时,我甚至无法通过Windows资源管理器删除它。我收到文件仍在使用中的错误消息。这适用于普通文件,但不适用于jar文件。我应该做些不同的事吗?这是我正在使用的代码片段。

更新了代码段:

public static void tryPreOpenConnection(URL url, File file) throws IOException {
    URLConnection connection = url.openConnection();
    InputStream stream = connection.getInputStream();
    stream.read();
    stream.close();
    System.out.println("Deleted: " + file.delete());
    connection = null;
    stream = null;
    System.gc();
    try {
        Thread.sleep(10000);
    } catch (InterruptedException e) {
     // do nothing
    }
    System.out.println("Deleted: " + file.delete());
}

3 个答案:

答案 0 :(得分:0)

您还记得关闭网址连接吗?

另外,您可以发布更大的代码段,以便我们可以看到上下文吗?

答案 1 :(得分:0)

您可以尝试使用Commons Virtual File System

几天前,我在HttpURLConnection(实现)中遇到了内部缓存的问题。 URLConnection太棒了。 :)

答案 2 :(得分:0)

感谢http://www.genevski.com/2010/04/javaneturl-and-jarurlconnection-may.html。我发现了这个问题。除非 useCaches 属性设置为false,否则连接似乎会阻止该文件。我可以设法通过设置此属性或将我的代码更改为

来解决此问题
public static void tryPreOpenConnection(URL url, File file) throws IOException {
    JarURLConnection connection = (JarURLConnection) url.openConnection();
    JarFile jar = connection.getJarFile();
    JarEntry entry = connection.getJarEntry();
    InputStream stream = jar.getInputStream(entry);
    stream.read();
    stream.close();
    jar.close();
    System.out.println("Deleted: " + file.delete()); // this works
}