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

标签 linux windows jar filenames long-filenames

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

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

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

有什么想法可以解决这个问题并使长类文件可读吗?

最佳答案

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每个类(class)。

关于linux - 如何打开JAR文件中文件名长度大于255的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19957171/

相关文章:

java - 在 Java 和 C++ 之间交换对象/类数据

windows - 从另一个 powershell session 访问在一个 powershell session 中创建的远程 powershell session

java jar以两种不同的字符编码写入

java - 如何将 Java 资源作为文件获取?

c++ - 链接到旧版本 g++ 编译的动态库时,我应该注意什么潜在问题吗?

c++ - 为 X 毫秒数创建一个 boost::posix_time::ptime 实例

linux - 如何将逗号分隔的字段变成不同的行?

windows - 在 Windows 上启动 Sinatra 应用程序时,shotgun gem 会爆炸

windows - 在 Azure 上托管电子邮件

java - 将 Guava 23.0 导入 Eclipse Photon 4.8.0