Hallo erstmal!
Ich versuche eine Methode zu schreiben, welche Zip-Files rekursiv durchsucht, und darin enthaltene Textdateien nach einem bestimmten String durchsucht.
Das ganze funktioniert, bis die Methode die 3. Verschachtelung erreicht, (also eine Zip-Datei in einer Zip-Datei welche wiederum in einem Zip-File steckt.
Dann krieg ich folgende Exception: java.io.IOException: Stream closed
Wobei der Compiler auf folgende Zeile verweist:
Ich kapier einfach nicht wieso er den Stream schliesst... bin mit meinem (geringen) Latein am Ende, habe auch schon Stunden Google gequält...
Bin also für jeden Denkanstoss oder Vorschlag extrem dankbar!
Hier was ich bisher hab:
Hier noch der Aufbau der Test-Datei und die Ausgabe die ich in meinem (FX-GUI) kriege:
Ich versuche eine Methode zu schreiben, welche Zip-Files rekursiv durchsucht, und darin enthaltene Textdateien nach einem bestimmten String durchsucht.
Das ganze funktioniert, bis die Methode die 3. Verschachtelung erreicht, (also eine Zip-Datei in einer Zip-Datei welche wiederum in einem Zip-File steckt.
Dann krieg ich folgende Exception: java.io.IOException: Stream closed
Wobei der Compiler auf folgende Zeile verweist:
Java:
while ((entry = archiveStream.getNextEntry()) != null) {
Ich kapier einfach nicht wieso er den Stream schliesst... bin mit meinem (geringen) Latein am Ende, habe auch schon Stunden Google gequält...
Bin also für jeden Denkanstoss oder Vorschlag extrem dankbar!
Hier was ich bisher hab:
Java:
public int searchZip(BufferedInputStream bufferedStream, String searched, ZipFile zip, String zipName, String archiveLocation) throws IOException{
int numberOfMatches = 0;
String recursionInfo = "(occuring in '" + zipName + " " + archiveLocation;
ZipInputStream archiveStream = null;
Reader decoder = null;
BufferedReader bufferedR = null;
try {
archiveStream = new ZipInputStream(bufferedStream);
decoder = new InputStreamReader(archiveStream /* , "UTF-8" */);
bufferedR = new BufferedReader(decoder);
String actualLine;
ZipEntry entry;
Enumeration<ZipArchiveEntry> entries = zip.getEntries();
System.out.println(entries);
while ((entry = archiveStream.getNextEntry()) != null) {
String entryName = entry.getName();
if (entryName.endsWith(".zip"))
{
String tempPath = archiveLocation += "-->" + entryName + " ";
ZipArchiveEntry zipEntry = zip.getEntry(entryName);
InputStream entryStream = null;
BufferedInputStream buffered = null;
try {
entryStream = zip.getInputStream(zipEntry);
buffered = new BufferedInputStream(entryStream);
if((buffered != null)){
numberOfMatches += searchZip(buffered, searched, zip, zipName, tempPath);
}
}
catch (Exception e) {
e.printStackTrace();
}
finally{
entryStream.close();
buffered.close();
}
}
int line = 0;
while ((actualLine = bufferedR.readLine()) != null) {
line++;
if(actualLine.toLowerCase().contains(searched.toLowerCase()))
{
numberOfMatches +=1;
System.out.println("Found *" + searched + "* in file '" + entryName + "' on line -" + line + "- "+ recursionInfo +"')\n");
}
}
}
}
catch (Exception e) {
e.printStackTrace();
}
finally{
decoder.close();
bufferedR.close();
archiveStream.close();
}
return numberOfMatches;
}
Hier noch der Aufbau der Test-Datei und die Ausgabe die ich in meinem (FX-GUI) kriege: