파일을 하위 폴더로 추출하는 데 문제가 있습니다. 압축을 풀어야하는 zip 파일에는 여러 개의 폴더가 있으며 압축을 풀 때 디렉토리 구조를 유지하려고합니다.
package components;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
/**
* This utility extracts files and directories of a standard zip file to
* a destination directory.
*
*
*/
public class UnzipUtility {
/**
* Size of the buffer to read/write data
*/
private static final int BUFFER_SIZE = 4096;
/**
* Extracts a zip file specified by the zipFilePath to a directory specified by
* destDirectory (will be created if does not exists)
* @param zipFilePath
* @param destDirectory
* @throws IOException
*/
public void unzip(String zipFilePath, String destDirectory) throws IOException {
File destDir = new File(destDirectory);
if (!destDir.exists()) {
destDir.mkdir();
}
ZipInputStream zipIn = new ZipInputStream(new FileInputStream(zipFilePath));
ZipEntry entry = zipIn.getNextEntry();
// iterates over entries in the zip file
while (entry != null) {
String filePath = destDirectory + File.separator + entry.getName();
if (!entry.isDirectory()) {
// if the entry is a file, extracts it
extractFile(zipIn, filePath);
System.out.println(filePath);
} else {
// if the entry is a directory, make the directory
File dir = new File(filePath);
System.out.println(filePath);
dir.mkdir();
}
zipIn.closeEntry();
entry = zipIn.getNextEntry();
}
zipIn.close();
}
/**
* Extracts a zip entry (file entry)
* @param zipIn
* @param filePath
* @throws IOException
*/
private void extractFile(ZipInputStream zipIn, String filePath) throws IOException {
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filePath));
byte[] bytesIn = new byte[BUFFER_SIZE];
int read = 0;
while ((read = zipIn.read(bytesIn)) != -1) {
bos.write(bytesIn, 0, read);
}
bos.close();
}
}
코드에서 얻은 출력은 다음과 같습니다. 문제는 DoD-DISA-logos-as-JPEG.jpg 파일이 하위 폴더에 대한 하위 폴더의 일부라는 것입니다. 따라서 경로는 folder / subfolder / childfolder / DoD-DISA-logos-as-JPEG.jpg 여야합니다. 해당 하위 폴더를 포함하지 않으므로 내가 믿는 IO 예외가 발생합니다.
java.io.FileNotFoundException: /Users/user/Desktop/folder/subfolder/DoD-DISA-logos-as-JPEG.jpg (No such file or directory)
at java.io.FileOutputStream.open0(Native Method)
at java.io.FileOutputStream.open(FileOutputStream.java:270)
at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
at java.io.FileOutputStream.<init>(FileOutputStream.java:101)
at components.UnzipUtility.extractFile(UnzipUtility.java:62)
at components.UnzipUtility.unzip(UnzipUtility.java:42)
at components.UnzipUtilityTest.main(UnzipUtilityTest.java:9)
반복자가 모든 폴더 계층 구조를 나열 entry.isDirectory()
한다는 사실에 의존해서는 안됩니다 ZipEntry
.
zip 파일 구조는 ZipEntry
이름에 하위 폴더 계층 구조를 포함 하는 파일 만 포함 할 수 있습니다 . 예 : foo/bar/file.txt
있을 것입니다 ZipEntry
하지만 foo/
도foo/bar/
따라서 :
File#mkdirs
File#mkdirs
코드는 다음과 같이 변환되어야합니다.
if (!entry.isDirectory()) {
// if the entry is a file, extracts it
new File(filePath).getParentFile().mkdirs();
extractFile(zipIn, filePath);
System.out.println(filePath);
} else {
// if the entry is a directory, make the directory
File dir = new File(filePath);
System.out.println(filePath);
dir.mkdirs();
}
외부 라이브러리를 사용하여 zt-zip 과 같은 압축 / 압축 해제를 권장합니다 .
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다