Umwandlung ByteArrayOutputStream in InputStream

M

M8

Gast
Hallo, ich habe folgendes Problem

vor einiger Zeit habe ich einen Entzipper für TGZ Dateien geschrieben, der so aussah, dass ich zuerst die tgz-Datei auf
Platte abgelegt habe, dann diese ausgelesen, uncompressed und als tar-Datei wieder auf Platte abgelegt, dann die tar-Datei ausgelesen wieder uncompressed und an den Zielort gespeichert
anschließend hab ich die tgz und tar Datei gelöscht

jetzt möchte ich es so machen, dass ich die beiden Zwischendateien garnicht habe sondern die Inhalte über die Streams im Speicher halte

aktuell habe ich es so, dass ich das tgz-file nicht abspeichere, sondern das byte[] direkt in die methode liefere, das tarFile wird dann nochmal abgelegt, ausgelesen und wieder abgespeichert
aber eigentlich soll auch das nicht mehr passieren

aktuelle Lösung:
(nicht auf das exceptionhandling achten, hab das fast ganz gelöscht der übersicht halber)

Java:
private String extractArchive(byte[] documentTGZ, String destinationPfad, String suchString) {
		int BUFFER = 2048;

		try {
			// ***Entpacken TGZ und Speichern TAR**********************

			// TAR-Archiv in TEMP ablegen
			
			String tarPfad = TEMPDIR + "\\"
					+ GzipUtils.getUncompressedFilename("file");
			File tar = new File(tarPfad);
			OutputStream out = new FileOutputStream(tar);
			
			InputStream is = new ByteArrayInputStream(documentTGZ);
			CompressorInputStream cis = new CompressorStreamFactory()
					.createCompressorInputStream("gz", is);

			// Wegschreiben des TAR-Archivs
			final byte[] buffer = new byte[BUFFER];
			int n = 0;
			while (-1 != (n = cis.read(buffer))) {
				out.write(buffer, 0, n);
			}
			logger.debug("TarFile weggeschrieben");
			out.close();
			is.close();
			cis.close();

			// **********Entpacken TAR und Speichern der beinhalteten Dateien******

			InputStream ins = new FileInputStream(tar);
			ArchiveInputStream in = new ArchiveStreamFactory()
					.createArchiveInputStream("tar", ins);
			TarArchiveEntry entry;

			while ((entry = (TarArchiveEntry) in.getNextEntry()) != null) {

				if (entry.isDirectory()) {
					// Hauptverzeichnis ablegen, restliche Verzeichnise darunter 
                                        // entsprechend der Struktur

					File verzeichnis = new File(destinationPfad + File.separatorChar
							+ entry.getName());
					verzeichnis.mkdirs();
				} else {

					OutputStream outs = new FileOutputStream(destinationPfad
							+ File.separatorChar + entry.getName());
					org.apache.commons.compress.utils.IOUtils.copy(in, outs);
					outs.close();
				}
			}
			logger.debug("TarFile entpackt");
			ins.close();
			in.close();
			tar.delete();

		} catch (DiverseExceptions ex) {
			throw new Exception(
					"Fehler");
		
		return destinationPfad;
	}

ich habe es auch einmal versucht das tarFile auch in einem Stream zu halten, es wird dann auch entpackt, also alle entries sind richtig vorhanden, aber es ist kein Inhalt darin, ich habe also leere PDF-Dateien am Ende
hat jemand eine Idee wie ich das lösen kann ohne temporär ein file abzulegen?
Java:
private String extractArchive(byte[] documentTGZ, String destinationPfad, String suchString) {
		int BUFFER = 2048;

		try {
			// *******Entpacken TGZ und Rüberreichen in TAR***************
	
			OutputStream out = new ByteArrayOutputStream();
			
			InputStream is = new ByteArrayInputStream(documentTGZ);
			CompressorInputStream cis = new CompressorStreamFactory()
					.createCompressorInputStream("gz", is);

			// Wegschreiben des tarInhalts in OutputStream
			final byte[] buffer = new byte[BUFFER];
			int n = 0;
			if(buffer==null) {
				throw Exception("Fehler");
			}
			while (-1 != (n = cis.read(buffer))) {
				out.write(buffer, 0, n);
			}
			logger.debug("Stream mit Inhalt tarFile erstellt");
			out.close();
			is.close();
			cis.close();


			// *******Entpacken TAR und Speichern der beinhalteten Dateien**********
			
			InputStream ins = new ByteArrayInputStream(out.toString().getBytes());
			ArchiveInputStream in = new ArchiveStreamFactory()
					.createArchiveInputStream("tar", ins);
			TarArchiveEntry entry;

			//  bei Verzeichnis >> erstellen, bei Dateien >> abspeichern

			while ((entry = (TarArchiveEntry) in.getNextEntry()) != null) {

				if (entry.isDirectory()) {
					// Hauptverzeichnis ablegen,
					// restliche Verzeichnise darunter entsprechend der Struktur
	
					File verzeichnis = new File(destinationPfad + File.separatorChar
							+ entry.getName());
					verzeichnis.mkdirs();
				} else {

					OutputStream outs = new FileOutputStream(destinationPfad
							+ File.separatorChar + entry.getName());
					org.apache.commons.compress.utils.IOUtils.copy(in, outs);
					outs.close();
				}
			}
			logger.debug("TarFile entpackt");
			ins.close();
			in.close();
			tar.delete();


		} catch (DiverseExceptions ex) {
			throw new Exception("Fehler");
		} 
		return destinationPfad;
	}


wie gesagt nur habe ich das Problem, dass in meinen entpackten Dateien kein Inhalt mehr ist...
ich hoffe jemand hat ne Idee wie das funktionieren kann!
Danke schonmal
 

irgendjemand

Top Contributor
hmm ... TAR wird glaube ich von java nicht native unterstützt ... aber GZIP auf jeden fall -> java.util.zip.* ...

das ganze on-the-fly ... hmm ... sollte eigentlich auch funktionieren wenn du die variante die mit den temp-daten auf der platte arbeitet durch ByteArray*Stream ersetzt ... in wie weit du da aber mit speicher-problemen zu kämpfen haben wirst lässt sich so nicht sagen ... würde aber mal grob 2 x TGZ oder mehr annehmen ...

von apache commons bin ich kein freund und kann daher nicht dierekt helfen ... wäre besser wenn du ZIP oder nur GZip als ausgangsformat hättest ... das kann java native ..

*TAR unterscheidet sich leider von ZIP ... auch wenn TAR in dem sinne nur das zusammenpacken von vielen daten in eine container-datei darstellt und damit ZIP ohne kompression gleichkommen würde ... aber die formate sind anders ... sollte auf jeden fall mal bei Sun/Oracle gemeldet werden das das native in java implementiert wird*
 
M

M8

Gast
@irgendjemand:

hmm irgendwie hat mir dein Eintrag nicht weitergeholfen...dass es einfacher wär wenn ich zip-Archive hätte hab ich schon gewusst als ich den Entzipper geschrieben hab, aber das steht nunmal nicht zur Debatte...
ich bekomme tgz-Dateien und muss damit umgehen können

und ja ich weiß, dass es eigentlich auch funktionieren sollte wenn ich ByteArrayStreams benutze nur das tut es gerade nicht und ich weiß nicht warum deswegen hab ich ja meine frage gepostet

ich könnte mich ja mal bei sun/oracle bewerben und ihnen anbieten das native zu implementieren ^^
 
S

SlaterB

Gast
out.toString() für ByteArrayOutputStream ist doch glatter Irrsinn, was soll das denn?
gibt auch ne Methode toByteArray() in ByteArrayOutputStream,

müsste eigentlich der Fehler sein, siehe auch Testprogramm unten, aber wenn du dennoch alle Dateinamen erhälst, bin ich minimal skeptisch

dass du diesen offensichtlichen Fehler nicht selbst gefunden hast, erlaubt mir dennoch die drastische Ausdrucksweise am Anfang,
du codest so komplizierte Sachen, da denkst du nicht daran, das wichtige byte[] als Zwischenschritt mit einer Datei auf der Festplatte zu vergleichen?

Java:
public class Test {
    public static void main(String[] args) throws Exception  {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        out.write(-44);
        out.write(5);
        out.write(6);
        out.write(5);
        out.write(4);
        System.out.println(out.toString());
        System.out.println(Arrays.toString(out.toString().getBytes()));
        System.out.println(Arrays.toString(out.toByteArray()));
    }
}
 
M

M8

Gast
@SlaterB

ja bei mir hat das "out." die Methode toByteArray() nicht angeboten weil ich das so instanziiert hatte
Java:
OutputStream out = new ByteArrayOutputStream();

cool danke für den Hinweis...jetzt gehts =)))
das mit dem "codest so komplizierte Sachen" fass ich mal als Kompliment auf ^^
 
S

SlaterB

Gast
dass du ByteArrayOutputStream so wie er ist verwenden musst ist eine Selbstverständlichkeit,
als weiteres Lob nicht extra erwähnt ;)

dass du es erwähnst und gar als Grund angibst warum du die Methode nicht verwenden wolltes oder gar nicht kennst/ nachgeschaut hast,
trübt das Bild wiederum,
aber genug dieser Spielereien ;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Input/Output Unicode Umwandlung Allgemeine Java-Themen 2
H Unicode ausgeben ohne Umwandlung - geht das? Allgemeine Java-Themen 3
A Umwandlung String --> Int un umgekehrt Allgemeine Java-Themen 18
A Umwandlung von Text/Zeichen in Polynome Allgemeine Java-Themen 8
O Problem bei der Umwandlung von Hex-Werten Allgemeine Java-Themen 5
G Umwandlung Byte in Integer Allgemeine Java-Themen 12
G Umwandlung Hex nach Dezimal Allgemeine Java-Themen 3
R Umwandlung Farbe in Schwarz/Weiss Allgemeine Java-Themen 2
L String umwandlung Allgemeine Java-Themen 3
A Probleme Umwandlung Ausdruck String in double Allgemeine Java-Themen 4
I Performance bei "String <-> Byte"-Umwandlung Allgemeine Java-Themen 4
G Umwandlung in Stream Allgemeine Java-Themen 5
M Umwandlung eines Long-Wertes in einen String Allgemeine Java-Themen 2
S Hex und Dezimal Umwandlung? Allgemeine Java-Themen 3
Seikuassi Input/Output Java transferTo ByteArrayOutputStream-Problem Allgemeine Java-Themen 4
N Suchen in InputStream/ByteArrayOutputStream Allgemeine Java-Themen 11
X Input/Output InputStream/Scanner(System.in) read()/hasNextLine() block unterbrechen Allgemeine Java-Themen 7
krgewb Problem mit Umlauten und Eszett bei InputStream Allgemeine Java-Themen 3
W Mal ein paar generelle Fragen zu InputStream und OutputStream Allgemeine Java-Themen 4
L Input/Output InputStream öffnen? Allgemeine Java-Themen 12
P Input/Output Inputstream verhält sich verschieden Allgemeine Java-Themen 9
R Inputstream lesen mit Pointer Allgemeine Java-Themen 0
M InputStream auslesen Allgemeine Java-Themen 1
M String aus InputStream Allgemeine Java-Themen 3
C Threading mit BufferedReader/InputStream & sockets Allgemeine Java-Themen 0
B BufferedWriter in InputStream oder Zeichen-Stream in Byte-Stream Allgemeine Java-Themen 5
P Scanner als Inputstream für Java Prozess Allgemeine Java-Themen 4
E POI-InputStream selber wählen Allgemeine Java-Themen 2
S RandomAcessFile das einen InputStream wrappt..? Allgemeine Java-Themen 2
1 InputStream hängt Allgemeine Java-Themen 4
H Input/Output InputStream: 32-Bit-Ganzzahl (DWORD) binär lesen Allgemeine Java-Themen 5
D Datentypen Reader/InputStream wiederverwenden? Allgemeine Java-Themen 11
K Inputstream -> Bilder Allgemeine Java-Themen 23
1 InputStream liest die letzte Zeile nicht ein Allgemeine Java-Themen 2
J Java Datei aus FTP in ein INputstream Allgemeine Java-Themen 2
J InputStream Zip-File Allgemeine Java-Themen 3
F ImageIO cant create InputStream Allgemeine Java-Themen 9
S InputStream "weiterleiten" Allgemeine Java-Themen 12
T Integer aus InputStream lesen Allgemeine Java-Themen 3
T Undwandlung eines String in einen InputStream? Allgemeine Java-Themen 3
M Selbst geschriebener InputStreamReader über einen beliebigen InputStream Allgemeine Java-Themen 4
T OutputStream to InputStream Allgemeine Java-Themen 8
S von OutputStream in InputStream schreiben ohne das es blockiert..? Allgemeine Java-Themen 2
reibi BufferedImage nach InputStream Allgemeine Java-Themen 10
R InputStream zweimal lesen Allgemeine Java-Themen 2
G InputStream und File Allgemeine Java-Themen 11
B InputStream zu URL umwandeln Allgemeine Java-Themen 2
F Teile vom InputStream schreiben Allgemeine Java-Themen 9
J InputStream aus URL funktioniert nicht Allgemeine Java-Themen 7
H InputStream Problem mit externem Kommandozeilenprogramm Allgemeine Java-Themen 2
W InputStream öfters nutzen Allgemeine Java-Themen 9
R The mark method of InputStream does nothing. Allgemeine Java-Themen 4
V String oder doch InputStream? Allgemeine Java-Themen 9
A Inputstream in Outputstream umleiten Allgemeine Java-Themen 7
Nils_Langner InputStream soll sich bei neuen Daten melden Allgemeine Java-Themen 2
R InputStream - seltsamer Output Allgemeine Java-Themen 2
S java.io.InputStream.read(byte[] b) überschreiben Allgemeine Java-Themen 33
N InputStream erst ab gegebener Position Allgemeine Java-Themen 4
R InputStream Allgemeine Java-Themen 5
G InputStream kopieren? Allgemeine Java-Themen 6
D Inputstream aus StringBuffer Allgemeine Java-Themen 3
G inputstream() to imageicon() Allgemeine Java-Themen 7
D Durch OutpustStream und InputStream dateien in eine jar sch Allgemeine Java-Themen 3
G aus String einen InputStream erstellen Allgemeine Java-Themen 2
C Wie kann man im InputStream nach einer Zeichenkette suchen? Allgemeine Java-Themen 4
R Aus InputStream wieder eine Datei erzeugen? Allgemeine Java-Themen 2
N String als Inputstream Allgemeine Java-Themen 4
M InputStream.read abbrechen Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben