为什么我的程序在 java.util.zip 解压缩时会跳过文件?
Why does my program skip files when unzipping by java.util.zip?
看了好几篇文章,都没有找到类似的问题和解决办法。
我尝试读取所有文件并使用方法跳过了一些 zis.getNextEntry
public static void main(String[] args) throws Exception {
String fileZip = "src/main/resources/unzipTest/fias_xml.zip";
ZipInputStream zis = new ZipInputStream(new FileInputStream(fileZip));
ZipEntry entry;
while ((entry = zis.getNextEntry()) != null) {
System.out.println(entry.getName());
}
}
}
但是如果你用 WinRar 解压,一切都会被正确解压
Archive files
After running the program
或者我怎么知道为什么有些文件无法读取?
存档能破解吗?
我用winrar解压和重新压缩文件后,程序运行正常。为什么 winrar 可以做到这一点,但 java 代码却不能?
jdk1.8.0_161
根据测试,我能够正确打印每个目录和文件名。
我想到了两种情况:
i) 文件名长度或完整长度更多是平台可以处理的。但这也应该是从 winrar 解压缩时的情况
ii) 是否有任何权限问题,但同样不会是选择性的方式。
你能告诉我哪个 jdk 版本吗?
能不能把zip文件发给我,我试试模拟一下。
public void unzip(String zipFile, String destDir)
{
try
{
int BUFFER = 8*1024;
File file = new File(zipFile);
ZipFile zip = new ZipFile(file);
String newPath = destDir;
new File(newPath).mkdir();
Enumeration zipFileEntries = zip.entries();
while (zipFileEntries.hasMoreElements())
{
ZipEntry entry = (ZipEntry) zipFileEntries.nextElement();
String currentEntry = entry.getName();
File destFile = new File(newPath, currentEntry);
File destinationParent = destFile.getParentFile();
destinationParent.mkdirs();
if (!entry.isDirectory())
{
BufferedInputStream is = new BufferedInputStream(zip
.getInputStream(entry));
int currentByte;
byte[] data = new byte[BUFFER];
FileOutputStream fos = new FileOutputStream(destFile);
BufferedOutputStream dest = new BufferedOutputStream(fos,
BUFFER);
while ((currentByte = is.read(data, 0, BUFFER)) != -1) {
dest.write(data, 0, currentByte);
}
dest.flush();
dest.close();
is.close();
}
}
}
catch (Exception e)
{
System.out.println(e.getMessage());
}
}
看了好几篇文章,都没有找到类似的问题和解决办法。
我尝试读取所有文件并使用方法跳过了一些 zis.getNextEntry
public static void main(String[] args) throws Exception {
String fileZip = "src/main/resources/unzipTest/fias_xml.zip";
ZipInputStream zis = new ZipInputStream(new FileInputStream(fileZip));
ZipEntry entry;
while ((entry = zis.getNextEntry()) != null) {
System.out.println(entry.getName());
}
}
}
但是如果你用 WinRar 解压,一切都会被正确解压
Archive files
After running the program
或者我怎么知道为什么有些文件无法读取?
存档能破解吗?
我用winrar解压和重新压缩文件后,程序运行正常。为什么 winrar 可以做到这一点,但 java 代码却不能?
jdk1.8.0_161
根据测试,我能够正确打印每个目录和文件名。
我想到了两种情况: i) 文件名长度或完整长度更多是平台可以处理的。但这也应该是从 winrar 解压缩时的情况 ii) 是否有任何权限问题,但同样不会是选择性的方式。
你能告诉我哪个 jdk 版本吗?
能不能把zip文件发给我,我试试模拟一下。
public void unzip(String zipFile, String destDir)
{
try
{
int BUFFER = 8*1024;
File file = new File(zipFile);
ZipFile zip = new ZipFile(file);
String newPath = destDir;
new File(newPath).mkdir();
Enumeration zipFileEntries = zip.entries();
while (zipFileEntries.hasMoreElements())
{
ZipEntry entry = (ZipEntry) zipFileEntries.nextElement();
String currentEntry = entry.getName();
File destFile = new File(newPath, currentEntry);
File destinationParent = destFile.getParentFile();
destinationParent.mkdirs();
if (!entry.isDirectory())
{
BufferedInputStream is = new BufferedInputStream(zip
.getInputStream(entry));
int currentByte;
byte[] data = new byte[BUFFER];
FileOutputStream fos = new FileOutputStream(destFile);
BufferedOutputStream dest = new BufferedOutputStream(fos,
BUFFER);
while ((currentByte = is.read(data, 0, BUFFER)) != -1) {
dest.write(data, 0, currentByte);
}
dest.flush();
dest.close();
is.close();
}
}
}
catch (Exception e)
{
System.out.println(e.getMessage());
}
}