Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Hallo,
ich bekomme tar.gz Dateien, diese möchte ich mit einer Javaklasse entpacken. Ich verwende zum entpacken das Commons.Compress package. Ich hab hier mal was gebastelt:
Hier meine Methode zum entpacken des .gz
Java:
private final int BUFFER = 2048;
System.out.println(new Date() + " - Start extracting: " + file.getName());
InputStream is = new FileInputStream(file);
OutputStream out;
out = new FileOutputStream(gzFile.getCanonicalFile() + "\\" + GzipUtils.getUncompressedFilename(file.getName()));
CompressorInputStream in;
in = new CompressorStreamFactory().createCompressorInputStream("gz", is);
final byte[] buffer = new byte[BUFFER];
int n = 0;
while (-1 != (n = in.read(buffer))) {
out.write(buffer, 0, n);
}
is.close();
in.close();
Und nun die Methode zum entpacken des .tar
Java:
InputStream is = new FileInputStream("c:\\ftpFiles\\GZ\\" + file.getName());
ArchiveInputStream in = new ArchiveStreamFactory().createArchiveInputStream("tar", is);
TarArchiveEntry entry;
while ((entry = (TarArchiveEntry) in.getNextEntry()) != null) {
System.out.println(new Date() + " - Extracting: " + entry.getName());
OutputStream out = new FileOutputStream(new File(tarFile.getCanonicalFile() + "\\", entry.getName()));
IOUtils.copy(in, out);
System.out.println(new Date() + " - " + entry.getName() + " has been unzipped");
out.close();
}
in.close();
Das funktioniert auch alles, eigentlich. Aber es dauert irgendwie sehr sehr sehr lange. Ich bekomme eine 70mb tar.gz datei das Tar-Archiv ist dann aber 1,3gb groß. Kann man da vielleicht irgendwas machen, oder den "Algorithmus" ändern, anders schreiben, dass es schneller/besser geht?
Wie lange läuft das Programm denn, und auf was für einem System?
Was mir auffällt ist, das beim Gunzip einen Buffer von nur 2k Grösse benutzt, das erzeugt natürlich massiv unnötigen Overhead, 1,3 GB in 2k Blöcken zu verarbeiten. Also mach den Buffer mal viel viel grösser, vielleicht ein paar MB. Beim Tar entpacken benutzt du IOUtils.copy, benutz das alternativ auch mal beim Gunzip. Gibt ja keinen Grund es einmal so und dann wieder anders zu machen.
Habe mich mit dem Thema noch nie auseinandergesetzt und kenne auch die Klasse IOUtils nicht, aber das
Code:
IOUtils.copy(in, out);
scheint mir nicht zu passen. in ist ein Stream auf das gesamte Archiv, während hier doch nur ein einzelner Eintrag des Archivs herausgeschrieben werden sollte.
Das IOUtils.copy(in, out); macht auch nichts Anderes als den Inhalt eines InputStreams komplett in einen OutputStream zu schreiben, genau das was du mit dem kleinen Buffer auch händisch machst.
Wie meinst du das? Das aus 70MB bei nem GUnzip mal 1,3GB rauskommen, wenn es sich um Text handelt, ist nichts Ungewöhnliches. Soll das heissen du weiss noch nichtmal ob die entpacken Daten korrekt entpackt wurden?
Der Code sieht an sich ok aus, er geht jeden Entry des ArchiveInputStreams durch, liest jeden Entry bis zum EOF und packt ihn in einen neue Datei.
Es werden zwar die ganzen Entries durchgegangen, aber in Zeile 4 wird doch in die OutputStreams (die für die Entries gedacht sind) jedes mal das komplette Archiv (in) geschrieben:
Java:
while ((entry = (TarArchiveEntry) in.getNextEntry()) != null) {
System.out.println(new Date() + " - Extracting: " + entry.getName());
OutputStream out = new FileOutputStream(new File(tarFile.getCanonicalFile() + "\\", entry.getName()));
IOUtils.copy(in, out);
System.out.println(new Date() + " - " + entry.getName() + " has been unzipped");
out.close();
}
Archive input streams MUST override the InputStream.read(byte[], int, int) - or read() - method so that reading from the stream generates EOF for the end of data in each entry as well as at the end of the file proper.
The getNextEntry() method is used to reset the input stream ready for reading the data from the next entry.
Hallo,
sorry, dass ich mich erst jetzt melde.
Also bei den gepackten Daten handelt es sich um gezipte (.tar.gz) xml dateien. Deswegen auch die Größe, die dann dabei rauskommt. Ich hab jetzt mal den Buffer erhöht und schau mal was passiert
Also hab das noch mal mit dem Buffer getestet und da ändert sich rein garnix ... das dauert immernoch zu lange ... wenn das File von 7Zip in 2 Minuten ausgepackt wird, werden bei mir in 2 Minuten knapp 1 MB ausgepackt, das kann doch nicht sein.
ich habe mal versucht mit Deinem Code ein tar-file zu entpacken. Das tar-file enthält bei mir Verzeichnisse und Dateien. Wenn ich das so mache wie du, werden bei mir Verzeichnisse als Dateien entpackt. Wenn dann Unterverzeichnisse entpackt werden, kommt berechtigterweise der Fehler not a directory.
Was muss man also an deinem Code ändern, damit man beim Entpacken eines Tar-files auch Verzeichnisse entpacken kann?