FileInputStream in FileOutputStream leiten

Colt45

Aktives Mitglied
Moin allerseits,
ich stehe vor folgender Aufgabe:
Daten von einem USB-Stick lesen, während des Lesens komprimieren und die komprimierten Daten auf einer SD-Karte UND glz. auf dem internen Speicher ablegen.
Gibt es die Möglichkeit quasi die Daten eines FileInputStreams direkt in einen OutputStream zu leiten und wie löse ich die Aufgabe mit dem glz. Speichern an 2 Orten? (Habe dabei an Threads gedacht)
Das Problem bei der Sache ist, dass es sich um relativ große Datenmengen handelt (>1GB) und der Benutzer nicht unbedingt eine Stunde warten sollte 🙂
Die Komprimierung erfolgt mittels der Apache Commons Compress Bibliothek und sieht momentan so aus:

Java:
public void compressBZip2(List<File> source, File target) throws FileNotFoundException, IOException,
			ArchiveException, CompressorException
	{
		OutputStream out = new BufferedOutputStream(new FileOutputStream(target));
		BZip2CompressorOutputStream cos = (BZip2CompressorOutputStream) new CompressorStreamFactory()
				.createCompressorOutputStream(CompressorStreamFactory.BZIP2,out);
		ArchiveOutputStream logical_zip = new ArchiveStreamFactory().createArchiveOutputStream(
				ArchiveStreamFactory.TAR,cos);
		for (File file : source)
		{
			TarArchiveEntry entry = new TarArchiveEntry(file.getPath());
			entry.setSize(file.length());
			logical_zip.putArchiveEntry(entry);
			IOUtils.copy(new FileInputStream(new File(file.getPath())),logical_zip);
			logical_zip.closeArchiveEntry();
		}
		logical_zip.finish();
		cos.close();
	}
 
Den TeeOutputStream kennst Du ja schon. Ist mit dem internen Speicher das RAM gemeint? Wenn ja, erzeug doch zusätzlich einen ByteArrayOutputStream und häng den zum FileOutputStream in einem TeeOutputStream. Gib dann z.B. das erzeugte byte-Array aus der Funktion zurück.

Also Zeile 4:
Java:
ByteArrayOutputStream bos = new ByteArrayOzutputStream();
 OutputStream out = new BufferedOutputStream(new TeeOutputStream(new FileOutputStream(target),bos)));


...

return bos.tyByteArray();
 
Zuletzt bearbeitet:
Mit dem internen Speicher war der eingebaute (Festplatten)-Speicher vom Endgerät gemeint, da das ganze für ein Tablet entwickelt wird. Aber ich habs mittlerweile gelöst, werd morgen mal dazu den Code posten, wenn ich wieder im Büro bin
 

Neue Themen


Zurück
Oben