zip 파일의 폴더 안에있는 zip 파일이 있습니다. zip 입력 스트림을 사용하여 읽는 방법을 제안 해주십시오.zip 파일 내의 zip 파일 읽기
예컨대 :
abc.zip
|
documents/bcd.zip
어떻게 압축 파일 내부에 zip 파일을 읽어?
zip 파일의 폴더 안에있는 zip 파일이 있습니다. zip 입력 스트림을 사용하여 읽는 방법을 제안 해주십시오.zip 파일 내의 zip 파일 읽기
예컨대 :
abc.zip
|
documents/bcd.zip
어떻게 압축 파일 내부에 zip 파일을 읽어?
다음 코드 스 니펫은 다른 ZIP 파일 안에있는 ZIP 파일의 항목을 나열합니다. 그것을 당신의 필요에 맞게 조정하십시오. ZipFile
은 후드 아래 ZipInputStream
s을 사용합니다.
코드 스 니펫은 Apache Commons IO, 특히 IOUtils.copy
을 사용합니다.
public static void readInnerZipFile(File zipFile, String innerZipFileEntryName) {
ZipFile outerZipFile = null;
File tempFile = null;
FileOutputStream tempOut = null;
ZipFile innerZipFile = null;
try {
outerZipFile = new ZipFile(zipFile);
tempFile = File.createTempFile("tempFile", "zip");
tempOut = new FileOutputStream(tempFile);
IOUtils.copy(//
outerZipFile.getInputStream(new ZipEntry(innerZipFileEntryName)), //
tempOut);
innerZipFile = new ZipFile(tempFile);
Enumeration<? extends ZipEntry> entries = innerZipFile.entries();
while (entries.hasMoreElements()) {
ZipEntry entry = entries.nextElement();
System.out.println(entry);
// InputStream entryIn = innerZipFile.getInputStream(entry);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
// Make sure to clean up your I/O streams
try {
if (outerZipFile != null)
outerZipFile.close();
} catch (IOException e) {
e.printStackTrace();
}
IOUtils.closeQuietly(tempOut);
if (tempFile != null && !tempFile.delete()) {
System.out.println("Could not delete " + tempFile);
}
try {
if (innerZipFile != null)
innerZipFile.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
readInnerZipFile(new File("abc.zip"), "documents/bcd.zip");
}
위대한 이것은 내가 무엇을 찾고 있습니다. 고마워요, 이봐 요. –
굉장한 젠장 .... 고마워요 ... !!!!! – Milesh
완벽한 해결책, 정확하게 내가 원했던 것과 함께 몇 시간 동안 내 머리를 부러 뜨렸다. 너는 내 하루를 보냈다. 정말 고맙습니다. –
재귀 zip 파일 내에서 zip 파일을보고 싶은 경우,
public void lookupSomethingInZip(InputStream fileInputStream) throws IOException {
ZipInputStream zipInputStream = new ZipInputStream(fileInputStream);
String entryName = "";
ZipEntry entry = zipInputStream.getNextEntry();
while (entry!=null) {
entryName = entry.getName();
if (entryName.endsWith("zip")) {
//recur if the entry is a zip file
lookupSomethingInZip(zipInputStream);
}
//do other operation with the entries..
entry=zipInputStream.getNextEntry();
}
}
전화 파일에서 파생 된 파일 입력 스트림 방법 -
File file = new File(name);
lookupSomethingInZip(new FileInputStream(file));
같은 지퍼로 다시 시나요? 사용하지 ... – harvish
내가 쓴 zip 파일 내의 모든 zip 파일을 압축 해제 할 수있는 코드. n 압축 수준까지 압축을 풀 수도 있습니다. 예를 들어 zip 내부에 zip 파일이 있고 zip 내부에있는 경우 zip 파일을 모두 추출합니다. 이 클래스의 zipFileExtract 메소드를 사용하고 소스 zip 파일과 대상 디렉토리를 인수로 전달하십시오.
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.*;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public class RecursiveFileExtract {
private static final int BUFFER_SIZE = 4096;
private static Queue<File> current;
private static List<File> visited;
public static void zipFileExtract(File sourceZipFile, File destinationDirectory) {
Path temp = null;
if(!destinationDirectory.exists())
{
destinationDirectory.mkdirs();
}
try {
temp = Files.move(Paths.get(sourceZipFile.getAbsolutePath()), Paths.get(destinationDirectory.getAbsolutePath()+File.separator+sourceZipFile.getName()));
} catch (IOException e) {
e.printStackTrace();
}
File zipFile = new File(temp.toAbsolutePath().toString());
current = new ConcurrentLinkedQueue<>();
visited = new ArrayList<>();
current.add(zipFile);
do {
unzipCurrent();
zipFinder(destinationDirectory);
}
while (!current.isEmpty());
}
private static void zipFinder(File directory) {
try {
if (directory != null) {
File fileArray[] = directory.listFiles();
if (fileArray != null) {
for (File file : fileArray) {
if (file != null) {
if (file.isDirectory()) {
zipFinder(file);
} else {
if (file.getName().endsWith(".zip")) {
if (!visited.contains(file)) {
current.add(file);
}
}
}
}
}
}
}
} catch (Exception e) {
System.out.println(e.getLocalizedMessage());
}
}
private static void unzipCurrent() {
try {
while (!current.isEmpty()) {
File file = current.remove();
visited.add(file);
File zipDirectory = new File(file.getParentFile().getAbsolutePath());
unzip(file.getAbsolutePath(), zipDirectory.getAbsolutePath());
}
} catch (Exception e) {
System.out.println(e.getLocalizedMessage());
}
}
public static void unzip(String zipFilePath, String destDirectory) {
try {
ZipInputStream zipIn = new ZipInputStream(new FileInputStream(zipFilePath));
ZipEntry entry = zipIn.getNextEntry();
while (entry != null) {
String filePath = destDirectory + File.separator + entry.getName();
if (!entry.isDirectory()) {
extractFile(zipIn, filePath);
} else {
File dir = new File(filePath);
Boolean result = dir.mkdir();
}
zipIn.closeEntry();
entry = zipIn.getNextEntry();
}
zipIn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
private static void extractFile(ZipInputStream zipIn, String filePath) {
try {
File file = new File(filePath);
File parentFile = file.getParentFile();
if (!parentFile.exists()) {
Boolean result = parentFile.mkdirs();
if (!result) {
throw new Exception();
}
}
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();
} catch (Exception e) {
System.out.println(e.getLocalizedMessage());
}
}
}
당신이 읽기에 의해 무엇을 의미합니까? bcd.zip을 추출 하시겠습니까? – Sujay