IllegalStateException:在文件写入期间关闭zip文件

时间:2014-03-22 20:10:45

标签: java jar classloader

当我的程序进入关闭挂钩并尝试将设置文件写入文本文档时,会发生此错误。奇怪的是,每次都不会抛出异常。

Exception in thread "Thread-4" java.lang.IllegalStateException: zip file closed
    at java.util.zip.ZipFile.ensureOpen(Unknown Source)
    at java.util.zip.ZipFile.getEntry(Unknown Source)
    at java.util.jar.JarFile.getEntry(Unknown Source)
    at java.util.jar.JarFile.getJarEntry(Unknown Source)
    at com.crimson.server.JarClassLoader.findJarEntry(JarClassLoader.java:514)
    at com.crimson.server.JarClassLoader.findJarClass(JarClassLoader.java:584)
    at com.crimson.server.JarClassLoader.loadClass(JarClassLoader.java:956)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at com.crimson.universalUtils.Datastore.store(Datastore.java:66)
    at com.crimson.server.ServerShutdownHook.run(ServerShutdownHook.java:38)

这是Datastore.store(设置):

public static File set = new File("settings.properties");

public static void store(Settings settings){
    set.delete();

    try {
        set.createNewFile();
        PrintWriter pw = new PrintWriter(set);//line 66
        pw.println(ObjectTransfer.toString(settings));

        pw.close();
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

我不知道为什么创建PrintWriter调用ClassLoader.loadClass,但这可能是问题所在,因为我正在使用JarClassLoader:http://www.jdotsoft.com/JarClassLoader.php

1 个答案:

答案 0 :(得分:1)

我检查了JarClassLoader的{​​{3}},问题是JarClassLoader还有一个关闭钩子来关闭jar文件。正如source code所说,它们可以按任何顺序调用,甚至可以并行调用。所以,当你的钩子进入"在JarClassLoader之前,您的代码有效。如果有点太晚了,你会遇到这个例外。

解决这个问题的方法是确保在调用shutdown hook之前加载PrintWriter类。