我正在尝试使用以下代码从Internet解压缩文件。在其中一个文件(“uq.class”)上,从联机源解压缩后,缺少大约2kb的文件大小(原始文件是10,084,解压缩后得到8,261)。所有其他文件似乎都完全正常,当我从zip中复制uq.class文件并手动放置它时,它完全正常运行。任何人都可以解释发生了什么并提供修复?下面是代码的解压缩部分。
public static File unpackArchive(URL url, File targetDir) throws IOException {
if (!targetDir.exists()) {
targetDir.mkdirs();
}
InputStream in = new BufferedInputStream(url.openStream(), 2048);
// make sure we get the actual file
File zip = File.createTempFile("arc", ".zip", targetDir);
OutputStream out = new BufferedOutputStream(new FileOutputStream(zip),2048);
copyInputStream(in, out);
out.close();
return unpackArchive(zip, targetDir);
}
public static File unpackArchive(File theFile, File targetDir) throws IOException {
if (!theFile.exists()) {
throw new IOException(theFile.getAbsolutePath() + " does not exist");
}
if (!buildDirectory(targetDir)) {
throw new IOException("Could not create directory: " + targetDir);
}
ZipFile zipFile = new ZipFile(theFile);
for (Enumeration entries = zipFile.entries(); entries.hasMoreElements();) {
ZipEntry entry = (ZipEntry) entries.nextElement();
File file = new File(targetDir, File.separator + entry.getName());
if (!buildDirectory(file.getParentFile())) {
throw new IOException("Could not create directory: " + file.getParentFile());
}
if (!entry.isDirectory()) {
copyInputStream(zipFile.getInputStream(entry), new BufferedOutputStream(new FileOutputStream(file),2048));
} else {
if (!buildDirectory(file)) {
throw new IOException("Could not create directory: " + file);
}
}
}
zipFile.close();
theFile.delete();
return theFile;
}
public static void copyInputStream(InputStream in, OutputStream out) throws IOException {
byte[] buffer = new byte[1024];
int len = in.read(buffer);
while (len >= 0) {
out.write(buffer, 0, len);
len = in.read(buffer);
}
in.close();
out.close();
}
public static boolean buildDirectory(File file) {
return file.exists() || file.mkdirs();
}
答案 0 :(得分:2)
第一眼看不到代码有什么问题。我建议你做的是更安全地关闭你的流。在当前的实现中,您同时关闭输入和输出流,关闭语句可能会导致异常,因为可以读取和写入语句!如果其中任何一个失败,您的文件将保持打开状态,并且您的应用程序将耗尽文件描述符。你最好在finally语句中结束,这样你肯定会关闭它。
答案 1 :(得分:0)
我不知道为什么我不能登录,但我想出了这个问题。我在马之前做过整车。我解压缩了正确的文件,然后将旧文件解压缩,因此我不断重新整合旧文件。窗外编程5个小时。请记住,小孩,正确的编程架构可以为您节省大量的麻烦。