如何在文件名长度大于255的JAR文件中打开文件?

时间:2013-11-13 15:05:19

标签: linux windows jar filenames long-filenames

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分: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<n>.class