zip Dateien schreiben mit in/outputstream

dermoritz

Bekanntes Mitglied
Ich versuche gerade Code zu bauen der eine zip-Datei anlegt. In die zip-Datei sollen 2 Fileobjekte und ein Outputstream. Die Beispiele die man so für das zippen findet sind meistens kacke. entweder sind sie von der Art wie das offizielle zip-Tutorial:
Java:
static final int BUFFER = 2048;
...
 while((count = origin.read(data, 0, 
              BUFFER)) != -1) {
               out.write(data, 0, count);
}
Wobei gerne mal auch 1024 als Puffergröße verwendet wird. Nur keines Dieser Beispiele versucht auch nur zu erklären was das soll - die meisten Benutzer scheinen diesen Code einfach zu kopieren.
Lange Rede Kurzer Sinn, ein wirklich exzellentes Beispiel hab ich hier im Forum gefunden. es beutzt nicht diesen low-level-crap mit Magic Numbers (1024, 2048), sondern Outputstream:

http://www.java-forum.org/xml-co/48194-xml-zip-archiv-packen.html

Nun frag ich ob das nicht prinzipiell die bessere Strategie ist?! In meinem Fall hab ich eine Funktion (die save() Methode einer EMF-Resource), die einen Outputstream frisst. Kann ich da nicht einfach den zipoutputstream reinhauen? Analog zu http://www.java-forum.org/xml-co/48194-xml-zip-archiv-packen.html#post298610 ?

Um Fileobjekte einzutragen muss ich nicht mit Streams rummachen oder?

http://www.java-forum.org/xml-co/48194-xml-zip-archiv-packen.html#post298610
 

dermoritz

Bekanntes Mitglied
Danke,
aber auch wenn eines der Vorteile ist: "One API less to get a headache from (java.util.zip). " Würde ich gerne ohne externe Bibliothe auskommen. Mein Usecase ist wie gesagt extrem einfach.
 
S

SlaterB

Gast
XMLOutputter ist eine Klasse, die in einen OutputStream schreibt, dort kann man ZipOutputStream wie jeden anderen auch übergeben,
wenn du irgendwas mit EMF hast, was auch einen OutputStream akzeptiert, sollte das genauso klappen (ob was verkleinert werden kann hängt von der Art der Daten ab)

wenn du Files in das Zip einfügen willst, dann musst du über Java diese Dateien einlesen und schreiben, wieder mit Buffer, 1024 usw.,
ich denke da gibts nichts fertiges, und wenn dann wären es auch nur 10 Zeilen genau mit diesem Code
 

FArt

Top Contributor
Du drückst dich etwas undeutlich aus.. dein Objekt frisst den Outputstream, den du reinhauen möchest... hm...
.. und dann machst du mit Streams rum... und die Beispiele sind natürlich kacke, nicht anders herum...

Lange Rede kurzer Sinn: die Antwort ist erst ja und dann nein, wenn ich dich richtig verstanden habe.
 

dermoritz

Bekanntes Mitglied
Also ich möchte die zip Klasse so benutzen wie in dem anderen Beispiel: nicht mit Puffer mit dubioser Größe, sondern mit Outputstreams.

Also in meinem Beispiel:
Java:
ZipOutputStream zipDok =  new ZipOutputStream(new FileOutputStream(zipDatei));
			
			//xml hinzufügen
			ZipEntry xmlZ = new ZipEntry(ordn + ".xml");
				zipDok.putNextEntry(xmlZ);
			meinXML xml = new MeinXML();
			xml.save(zipDok);
				zipDok.closeEntry();
Das find ich bei weitem schöner. Nun frag ich mich wieso man so ein Beispiel nur hier im Forum findet?! ODer Gibt es Nachteile gegenüber der Benutzung von einem (Byte)Zwischenpuffer?
Und dann frag ich mich noch, ob man damit auch "File"s in zips schreiben kann. Also mit welcher Klasse kann ich ein File in einen beliebigen Outputstream shcreiben (in meinem Fall will ich ein File nach zipDok schreiben).
 
S

SlaterB

Gast
> Nun frag ich mich wieso man so ein Beispiel nur hier im Forum findet?!
wo hast du MeinXML gefunden? Forum-Suche liefert nix, klingt in jedem Fall nur nach einer selbstgeschriebenen Dummy-Klasse die die Arbeit macht,
ein Manager delegiert Aufträge auch sauber an Untergebene, das heißt nicht dass dadurch die Arbeit per Magie erledigt wird, irgendjemand muss immer noch ackern,

XMLOutputter ist allerdings komplett eine Sonderform, dort liegen die Rohdaten in einem Objekt-Baum vor, nicht als bytes in einer Datei auf der Festplatte, ein Zwischenpuffer würde bei XML überhaupt nicht helfen

wenigstens zu Files bitte einfach mein vorheriges Posting lesen
 

dermoritz

Bekanntes Mitglied
mhm,

in meinem ersten Post hab ich den Link zum Beispiel. Basierend auf diesem Beispiel hab ich obigen Code gemacht. Aber letztendlich sind die meisten Details irrelevant (xml oder nicht...).

Entscheidend ist, dass "zipoutputstream" ein outputstream ist und der Beispielcode offensichtlich neue Zipeinträge direkt damit anlegt. Es wird ein Eintrag eröffnet, der zipoutputstream wird in einen "Datenstrom gehalten" ( er wird einer Methode übergeben die einen Outputstream als Parameter hat) und dann wird der Eintrag geschlossen. Das find ich wie schon erwähnt bei weitem eleganter als irgendwelche Bytes zu puffern. Falls das gut funktioniert (- hat jemand Erfahrung damit?) würde ich diesen ansatz gerne verallgemeinern:

wie kann ich den Inhalt einer Datei direkt in diesen zipoutputstream schreiben? Gibt es irgendwas wie liesDatei(File datei, Outputstream ziel) ?
 

FArt

Top Contributor
wie kann ich den Inhalt einer Datei direkt in diesen zipoutputstream schreiben? Gibt es irgendwas wie liesDatei(File datei, Outputstream ziel) ?

Ich verstehe nicht ganz dein Problem. Die ZIP API ist dir zu kompliziert und zu lowlevelig, die Tutorials sind unverständlich (was ich nicht nachvollziehen kann) und TrueZIP ist (weil höherlevelig) keine Option weil das eine weitere Bibliothek bedingt ... ???:L

http://java.sun.com/developer/technicalArticles/Programming/compression/
 

dermoritz

Bekanntes Mitglied
Fart du hast völlig recht. Ich bin so einen Lowlevelkram ben von Java nicht gewöhnt und gebe die Hoffnung erst recht spät auf, dass es etwas schöneres mit Standardwerkzeug gibt.

Nun hab ich aber herausgefunden warum man über die Bytes iterieren muss um Dateien zu schreiben: Es ist die einzige Standard-Java-Möglichkeit um einen Input- (hier File) in einen Outputstream zu schreiben (siehe hier: Easy way to write contents of a Java InputStream to an OuptutStream - Stack Overflow). Bzw. gibt es keine Möglichkeiten Dateien direkt in einen (geg.)Outputstream zu schreiben.

mit der Javavariante landet man genau bei der whileschleife die die zip-Beispiele benutzen (die zip bibliothe kann so direkt also gar nix dafür).
Nun hab ich die Wahl:
entweder ich benutze die Schleife und wähle hoffentlich eine geschickte Größe für den Puffer (könnte sich auf die Performance niederschlagen) oder ich benutze eine externe Bibliothek: truezip oder ioutils beides würde helfen die while-Schleife nicht selbst schreiben zu müssen.
 

FArt

Top Contributor
Wenn dich nur die magische Puffergröße abschreckt: setze sie intuitiv auf 1k oder 4k oder so.. spiele mal mit dem Wert und schaue dir an was es bringt... oder nicht... in der Regel muss man sich da überhaupt keinen Kopf machen...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
O Wie kann ich in Apache POI (Excel Dateien schreiben) Datumszellen in Excel erzeugen Allgemeine Java-Themen 6
MiMa Log4j in Dateien mit eigenem Namen schreiben Allgemeine Java-Themen 3
X NetBeans Bilder und andere Dateien ins .jar schreiben und wieder aus .jar lesen Allgemeine Java-Themen 6
A Input/Output Spätes Schreiben von Dateien der JVM Allgemeine Java-Themen 3
F Java ME Dateien schreiben Allgemeine Java-Themen 7
K Dateien lesen und schreiben Allgemeine Java-Themen 2
F Dateien lesen/schreiben - C++ <-> Java Allgemeine Java-Themen 8
H Dateien lesen und schreiben mit Filereader und Filewriter Allgemeine Java-Themen 2
G dateien auf webspace schreiben Allgemeine Java-Themen 5
U In Jar Dateien schreiben Allgemeine Java-Themen 4
Thomasneuling Java Jar datei erstellen, von Projekt, dass auch Javafx Dateien, FXML Dateien und CSS Dateien, sowie Bilder enthält? Allgemeine Java-Themen 14
G Dateien lesen Allgemeine Java-Themen 3
OnDemand Unterschiedliche jar Dateien zusammen führen Allgemeine Java-Themen 8
A Sicheres Löschen von Dateien Allgemeine Java-Themen 7
O git ignore für Intellji braucht es die .idea Dateien? Allgemeine Java-Themen 8
Master3000 Dateien zwischen verschiedenen Netzwerken senden Allgemeine Java-Themen 17
L Jar Dateien in Classpath laden ab JDK 9+ Allgemeine Java-Themen 11
d.lumpi JDA eclipse dateien versenden Allgemeine Java-Themen 4
O Produziert das Tool "jpackage" (ab JDK 14) .exe Dateien, die auf einer Zielumgebung ohne JRE lauffähig sind ?` Allgemeine Java-Themen 7
T Meine Frage lautet wie ich 2 CSV Dateien miteinander in Java verbinde und Spalten die zueinander gehören durch den gleichen Key zusammen ausgebe? Allgemeine Java-Themen 5
L Dateien richtig auslesen Allgemeine Java-Themen 6
L Eclipse Runnable Jar mit Dateien Allgemeine Java-Themen 8
W Server-Thread schreibt nicht alle Dateien Allgemeine Java-Themen 6
MiMa Logging mit log4j2 in verschiedene Dateien? Allgemeine Java-Themen 22
I Klassen aus Jar-Dateien aus anderem Ordner laden Allgemeine Java-Themen 3
O jar und EXE Dateien, Pfade zur Laufzeit Allgemeine Java-Themen 1
W Dateien werden nicht gelöscht - warum? Allgemeine Java-Themen 12
B Dateien / Bilder von "webapp" Ordner bekommen? Allgemeine Java-Themen 1
P Erste Schritte Dateien löschen Allgemeine Java-Themen 4
H Erste Schritte Ausführbare Dateien lassen sich nicht starten Allgemeine Java-Themen 5
I Java als exe veröffentlichen inkl. kompletter Dateien Allgemeine Java-Themen 4
M Drucken von Dateien Allgemeine Java-Themen 10
J jar Dateien unter Windows 7 mit spezifischer jdk öffnen Allgemeine Java-Themen 2
I Laden von Informationen aus Dateien: Austauschbarkeit: 2 Dateien sinnvoll? Allgemeine Java-Themen 2
N Temporäre Dateien Allgemeine Java-Themen 3
Bluedaishi Druck Probleme mit PDF dateien Allgemeine Java-Themen 4
M Dateien schneller kopieren Allgemeine Java-Themen 1
M Dateien nach kopieren vergleichen Allgemeine Java-Themen 9
Arif Input/Output Dateien im Jar-Programm speichern Allgemeine Java-Themen 12
D Collections.sort funktioniert nicht in exportierten .class Dateien Allgemeine Java-Themen 10
K Große JSON-Dateien schnell und effizient verarbeiten Allgemeine Java-Themen 16
J Programm zum Download von CSV-Dateien Allgemeine Java-Themen 4
V Eclipse .class Dateien Allgemeine Java-Themen 9
B Download von dateien Allgemeine Java-Themen 2
K Nicht alle class-Dateien im JRE? Allgemeine Java-Themen 2
D Kopieren von Dateien aus einem Ordner in einen anderen Allgemeine Java-Themen 6
C Dateien in Jar aufrufen Allgemeine Java-Themen 14
JavaWolf165 Externe .jar-Dateien in .jar-Datei intigrieren Allgemeine Java-Themen 0
X Dateien für Benutzer Sperren Allgemeine Java-Themen 4
D Dateien aus den Internet herunterladen Allgemeine Java-Themen 6
L Methoden Dateien älter als 30 Tage? Allgemeine Java-Themen 11
J .exe Dateien werden nicht gestartet obwohl Pfad richtig Allgemeine Java-Themen 6
RalleYTN Classpath Native Dateien(DLL, SO, JNILIB) Allgemeine Java-Themen 2
J Java .jar Dateien zusammenführen Allgemeine Java-Themen 1
L Best Practice Log Dateien analysieren und eventuell passende Daten am Chart darstellen Allgemeine Java-Themen 1
F Platzsparende Alternative zu .txt-Dateien Allgemeine Java-Themen 12
X Dateien von der Jar zum Ordner kopieren. Allgemeine Java-Themen 4
Ananaskirsche Input/Output Dateien im Ordner Allgemeine Java-Themen 8
A Input/Output Liste der Dateien in einem Ordner in einer Jar Datei erhalten Allgemeine Java-Themen 11
X Herunterladen von Dateien aus dem Internet Allgemeine Java-Themen 2
V Input/Output Sound Dateien aus Jar laden Allgemeine Java-Themen 18
M Dateien aus einem Verzeichnis auf einem Server auflisten Allgemeine Java-Themen 5
H PDFBox akzeptiert Dateien nicht Allgemeine Java-Themen 1
B Java - einlesen von Dateien und herausschneiden von XML Dokumenten Allgemeine Java-Themen 5
M Zwei unterschiedliche JAR Dateien mit ANT erstellen Allgemeine Java-Themen 8
Thallius Dateien Zippen und wieder heraus lesen? Allgemeine Java-Themen 4
T Dateien zur Laufzeit in Java-Programm packen? Allgemeine Java-Themen 3
Maxim6394 Jar Dateien starten nicht Allgemeine Java-Themen 7
U Eclipse Java Programm beschädigt .tar.gz dateien beim Entpacken Allgemeine Java-Themen 7
GUI-Programmer Mp3 Dateien bearbeiten und speichern Allgemeine Java-Themen 3
S Exklusive Sperre auf Dateien: FileChannel, FileLock Allgemeine Java-Themen 0
Bluedaishi Dateien löschen die älter als das aktuelle Datum sind Allgemeine Java-Themen 9
OnDemand Dateien einlesen und vergleichen Allgemeine Java-Themen 1
T Ordner samt Dateien kopieren Allgemeine Java-Themen 11
R Importieren von Txt-Dateien in AbstractTableModel Allgemeine Java-Themen 0
C Dateien komprimieren und verschlüsseln Allgemeine Java-Themen 3
F Eclipse Eclipse kompiliert nicht mehr die aktuellen Dateien Allgemeine Java-Themen 2
R Java Dateien "verschlüsseln" Allgemeine Java-Themen 2
L Passwortgeschützte Dateien Allgemeine Java-Themen 6
A Datentypen Dateien umbenennen mit Dateiendungen - Dateiendungen ausgeben Allgemeine Java-Themen 2
L Reparieren beschädigter PDF Dateien Allgemeine Java-Themen 3
F Dateien ins Array lagern und Optionen zur Auswahl, Allgemeine Java-Themen 5
J XML Dateien vergleichen Allgemeine Java-Themen 9
B Umbenennen von Dateien Allgemeine Java-Themen 2
B Erste Schritte Plugin erkennen und Class Dateien anzeigen lassen Allgemeine Java-Themen 3
W Best Practice Dateien parsen Allgemeine Java-Themen 3
B Dateien verschwinden aus bin Ordner?! Allgemeine Java-Themen 5
B Dateien prüfen auf Gleichheit Allgemeine Java-Themen 5
M Java Dateien verschieben Allgemeine Java-Themen 2
R Wav-Dateien wiederholt abspielen Allgemeine Java-Themen 2
L Methoden Verarbeitung von Größen Dateien Allgemeine Java-Themen 9
B Alt-Griechisch Zeichen in Dateien Allgemeine Java-Themen 2
M JAR Dateien nur mit Compiler Level 1.6 ausführbar Allgemeine Java-Themen 8
E Zugriff auf Dateien im Filesystem überwachen Allgemeine Java-Themen 5
G .jar Dateien lassen sich nicht mehr öffnen Allgemeine Java-Themen 2
M Datentypen Jar-Dateien öffnen nicht mit Java Allgemeine Java-Themen 4
C Mit Java PDF Dateien bearbeiten. Allgemeine Java-Themen 2
B Input/Output .java-Dateien auslesen Allgemeine Java-Themen 17
B Methoden Alle Methoden und Variablen aus Java-Dateien auslesen. Allgemeine Java-Themen 7
E Vorschläge, effizientes Hashing von Dateien für vergleich Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben