邮编结构:-
OuterZip.zip--|
|--Folder1---InnerZip.zip--|
|--TxtFile1.txt // Requirement is to read content of txt file
|--TxtFile2.txt // Without extracting any of zip file
现在我能够读取txt文件的名称,但不能读取其中的内容。
代码:-
public static void main(String arg[]){
ZipFile zip = new ZipFile("Outer.zip");
ZipEntry ze;
for (Enumeration e = zip.entries(); e.hasMoreElements();) {
ZipEntry entry = (ZipEntry) e.nextElement();
ZipInputStream zin = new ZipInputStream(zip.getInputStream(entry));
while ((ze = zin.getNextEntry()) != null)
{
System.out.println(ze.getName()); //Can read names of txtfiles, Not contents
zip.getInputStream(ze); // It is giving null
}
}
}
PS:-1.希望在不提取文件系统中任何zip的情况下进行操作。
2.已经在SOF上看到了一些答案。
答案 0 :(得分:1)
ZipFile zip = new ZipFile("Outer.zip");
...
zip.getInputStream(ze); // It is giving null
ze
(例如TxtFile1.txt
)的内容是InnerZip.zip
的一部分,而不是Outer.zip
(由zip
代表)的一部分,因此是null
。 / p>
我将使用递归:
public static void main(String[] args) throws IOException {
String name = "Outer.zip";
FileInputStream input = new FileInputStream(new File(name));
readZip(input, name);
}
public static void readZip(final InputStream in, final String name) throws IOException {
final ZipInputStream zin = new ZipInputStream(in);
ZipEntry entry;
while ((entry = zin.getNextEntry()) != null) {
if (entry.getName().toLowerCase().endsWith(".zip")) {
readZip(zin, name + "/" + entry.getName());
} else {
readFile(zin, entry.getName());
}
}
}
private static void readFile(final InputStream in, final String name) {
String contents = new BufferedReader(new InputStreamReader(in)).lines().collect(Collectors.joining("\n"));
System.out.println(String.format("Contents of %s: %s", name, contents));
}
0。 while (...)
,我们正在遍历整个所有条目。
1。(if (.endsWith(".zip"))
),如果遇到另一个我们本身递归调用的zip(readZip()
),然后转到步骤 0。 < / p>
2。(else
),否则我们将打印文件的内容(此处为文本文件)。