我有一个具有以下结构的JAR文件:
com
-- pack1
-- A.class
-- pack2
-- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.class
当我尝试读取,提取或重命名pack2/AA...AA.class
(文件名长度为262字节)时,Linux和Windows都说文件名太长。在JAR文件中重命名也不起作用。
任何想法如何解决这个问题并使长类文件可读?
答案 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
。