【问题标题】:How to open files in JAR file with filename length greater than 255?如何在 JAR 文件中打开文件名长度大于 255 的文件?
【发布时间】:2013-11-26 06:06:20
【问题描述】:

我有一个结构如下的 JAR 文件:

com
-- pack1
   -- A.class
-- pack2
   -- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.class

当我尝试读取、提取或重命名pack2/AA...AA.class(文件名长度为 262 字节)时,Linux 和 Windows 都说文件名太长。在 JAR 文件中重命名也不起作用。

任何想法如何解决这个问题并使长类文件可读?

【问题讨论】:

  • 向我们展示您要“读取、提取或重命名”的代码。至少在 Linux 上,它应该可以工作。
  • @AaronDigulla 谢谢。你的意思是什么代码?我尝试通过GNOME Archive Managerunzipjar -xvf7zipWinZIPWinRAR 等传统应用程序读取、提取和重命名。
  • 至少 jar -xvf 应该在 Linux 中工作。由于文件名的 256 字节限制(除非您使用一些新的文件 API,否则整个路径为 1024),Windows 工具可能无法处理它。 Linux 上的哪个文件系统?
  • Linux 上的文件系统是ext4jar -xvf 不起作用。它甚至不显示错误消息(尽管给出了-v 选项)

标签: linux windows jar filenames long-filenames


【解决方案1】:

此页面列出了文件系统的通常限制:http://en.wikipedia.org/wiki/Comparison_of_file_systems

正如您在“限制”部分中看到的,几乎没有文件系统允许超过 255 个字符。

您唯一的机会是编写一个程序来提取文件并缩短过长的文件名。 Java 至少应该能够打开存档(尝试jar -tvf 列出内容;如果可行,截断也应该可行)。

【讨论】:

  • 真可怜。我想知道是否有人已经编写了这样一个可以处理长文件名的工具。
  • 不,因为您通常无法创建具有如此长文件名的档案。我建议您向生成该 JAR 文件的人提交错误报告。
  • 我认为这是对错误的巧妙使用,因为它位于混淆的 JAR 文件中。我想知道混淆器如何重命名一个那么长的类以及 JAR 打包器如何毫无问题地打包它:-)
  • 只要这些 ZIP 项目都没有通过文件系统,您可以给它们任意名称(甚至可能包含 0 个字节)。
  • 是的,我明白了。 JAR 文件并不意味着以传统方式提取。这就是为什么我想知道是否有人已经面临这个问题并编写了一个工具。感谢您的帮助!
【解决方案2】:

java.util.jar可以处理:

try {
    JarFile jarFile = new JarFile("/path/to/target.jar");
    Enumeration<JarEntry> jarEntries = jarFile.entries();
    int i = 0;
    while (jarEntries.hasMoreElements()) {
        JarEntry jarEntry = jarEntries.nextElement();
        System.out.println("processing entry: " + jarEntry.getName());
        InputStream jarFileInputStream = jarFile.getInputStream(jarEntry);
        OutputStream jarOutputStream = new FileOutputStream(new File("/tmp/test/test" + (i++) + ".class")); // give temporary name to class
        while (jarFileInputStream.available() > 0) {
            jarOutputStream.write(jarFileInputStream.read());
        }
        jarOutputStream.close();
        jarFileInputStream.close();
    }
} catch (IOException ex) {
    Logger.getLogger(JARExtractor.class.getName()).log(Level.SEVERE, null, ex);
}

每个类的输出将是test&lt;n&gt;.class

【讨论】:

    猜你喜欢
    • 2012-04-28
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    • 2011-09-28
    • 2011-11-04
    • 1970-01-01
    • 2014-08-29
    相关资源
    最近更新 更多