标题说明了所有,虽然在Java解压缩方法中它关闭并给出了这个错误:
java.io.FileNotFoundException: ##File hierarchy here#\armor (Access is denied)
但如果我尝试用7-zip解压缩,我会收到以下错误:
Error: can not delete ouput file: ##File hierarchy here#\armor
对于Jar中的每个文件夹,这意味着它必须是我的压缩方法的问题 - 我希望我有意义!
我采取的步骤: 1.成功拉开罐子 2.成功拉上罐子 3.再次解压缩以找到所有这些错误。
这是我的压缩方法:
package minecraftmodmanager;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.jar.JarEntry;
import java.util.jar.JarOutputStream;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author Tom
*/
public class jarZip {
public static void zipAll(File Directory, File jar) {
try {
JFrame.debugLn("Opening Jos: " + jar.getName() + "... ");
JarOutputStream jos = new JarOutputStream(new FileOutputStream(jar));
zip(Directory, "", jos);
jos.close();
} catch (IOException ex) {
Logger.getLogger(jarZip.class.getName()).log(Level.SEVERE, null, ex);
}
}
public static void zip(File Directory, String Hierarchy, JarOutputStream jos) {
try {
BufferedInputStream in = null;
File[] directoryFiles = Directory.listFiles();
JFrame.debug("JOS Opened!");
System.out.println();
String FullDirectoryPath = Directory.getAbsolutePath() + File.separator;
String BasePath = FullDirectoryPath.substring(0, FullDirectoryPath.lastIndexOf(File.separator) + 1);
JFrame.debug("BasePath: " + BasePath);
for (int FileNumber = 0; FileNumber < directoryFiles.length; FileNumber++) {
String name = directoryFiles[FileNumber].getPath();
String JarFileName = name.replace(BasePath, "");
String FullFileHierarchy = Hierarchy + JarFileName;
if (directoryFiles[FileNumber].isDirectory()) {
zip(directoryFiles[FileNumber], FullFileHierarchy + "/", jos);
}
JFrame.debug("name: " + FullFileHierarchy);
JarEntry entry = new JarEntry(FullFileHierarchy);
jos.putNextEntry(entry);
if(!directoryFiles[FileNumber].isDirectory()) {
in = new BufferedInputStream(new FileInputStream(directoryFiles[FileNumber]));
byte[] buffer = new byte[1024];
while (true) {
int count = in.read(buffer);
if (count == -1) {
break;
}
jos.write(buffer, 0, count);
}
jos.closeEntry();
} else {
jos.closeEntry();
}
}
} catch (Exception ex) {
Logger.getLogger(jarZip.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
赞赏的家伙们!如果我没有遵守和规则,那么有点新来,所以请原谅我
答案 0 :(得分:0)
我不完全确定,但我认为您的问题可能是您试图将实际文件夹包起来。你不需要 - 当提取文件时,unzipper或unjarrer将根据jar或zip条目的路径创建文件夹。
如果您在子目录上添加一个继续调用zip
,例如
if (directoryFiles[FileNumber].isDirectory()) {
zip(directoryFiles[FileNumber], FullFileHierarchy + "/", jos);
continue;
}
这应该以递归方式添加您的文件,而不是添加文件夹。
虽然您确实检查过以确保只尝试从文件中读取内容,但您仍尝试将文件夹推入JarOutputStream
JarEntry entry = new JarEntry(FullFileHierarchy);
jos.putNextEntry(entry);
if(!directoryFiles[FileNumber].isDirectory()) {
JarOutputStream认为你创建的文件根本没有任何内容,并且被命名为与你的一个文件夹同名。因此,当需要解压缩时,它会创建一个文件夹和一个具有相同名称的文件。
如果这对您有用,您可以相应地修改其余代码。
希望这会有所帮助: - )