【问题标题】:IllegalStateException: zip file closed during file writeIllegalStateException: zip 文件在文件写入期间关闭
【发布时间】:2014-04-30 05:58:34
【问题描述】:

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

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

【问题讨论】:

  • 代码是否被多个线程调用?

标签: java jar classloader


【解决方案1】:

我检查了JarClassLoadersource code,问题是JarClassLoader 还有一个关闭钩子来关闭jar 文件。正如documentation of shutdown hooks 所说,它们可以按任何顺序调用,甚至可以并行调用。所以当你的钩子在JarClassLoaders 之前“进入”时,你的代码就可以工作了。当为时已晚时,您会收到此异常。

解决此问题的一种方法是确保在调用关闭挂钩之前加载 PrintWriter 类。

【讨论】:

  • 就是这样。我不知道您是否也可以帮助解决这个次要问题,但我还没有找到一种使用 JarClassLoader 有选择地加载 jar 的好方法;它全部加载。您对此有什么见解吗?
  • @user3109490 您可以通过在关闭挂钩之前运行的代码中实例化PrintWriter 类来强制加载它。但我可能会改用其他解决方案,而不是这种诡计,比如OneJar
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-21
  • 1970-01-01
  • 1970-01-01
  • 2012-06-23
  • 2023-04-03
相关资源
最近更新 更多