Inputstream kopieren

Maik639

Erfahrenes Mitglied
Hi Leute,

ich habe ein Problem beim kopieren eines InputStreams, glaube ich, waurm es nicht läuft weiß ich nicht. Ich habe ein kleines Beispielprogramm geschrieben das mein Probem verdeutlicht.

Beispielprogramm:
Java:
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.imageio.ImageIO;

public class Test {

	public Test() {
		try {
			File originalImageFile = new File("C:/Temp/b/123.jpg");
			InputStream is = new FileInputStream(originalImageFile);

			// InputStream kopieren
			InputStream is2 = is;

			BufferedImage buffImage = scale(is);
			copyFile(buffImage, "1");
			System.out.println("Kopie 1 abgeschlossen!");

			buffImage = scale(is2);
			copyFile(buffImage, "2");
			System.out.println("Kopie 2 abgeschlossen!");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	private void copyFile(BufferedImage buffImage, String nameSuffix)
			throws IOException {
		ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
		ImageIO.write(buffImage, "PNG", byteArrayOutputStream);
		byteArrayOutputStream.flush();
		byte[] imageSource = byteArrayOutputStream.toByteArray();
		byteArrayOutputStream.close();
		FileOutputStream fileOutputStream = new FileOutputStream(
				"C:/Temp/b/copy" + nameSuffix + ".png");
		fileOutputStream.write(imageSource);
		fileOutputStream.close();
	}

	private BufferedImage scale(InputStream originalImageFile)
			throws IOException {
		// Skalierung findet im Beispiel nicht statt.
		return ImageIO.read(originalImageFile);
	}

	public static void main(String[] args) throws IOException {
		new Test();
	}
}
Einfach Bilddatei an die richtige Stelle Packen, compilen und ihr werdet den Fehler/die Exception sehen. Leider weiß ich nur nicht warum diese kommt :X.

Viele Grüße,

Maik
 
Zuletzt bearbeitet:
Hi,

danke für deine Antwort, es kommt die folgende Exception:
Kopie 1 abgeschlossen!
Exception in thread "main" java.lang.IllegalArgumentException: im == null!
at javax.imageio.ImageIO.write(Unknown Source)
at javax.imageio.ImageIO.write(Unknown Source)
at Test.copyFile(Test.java:36)
at Test.<init>(Test.java:26)
at Test.main(Test.java:53)
Allerdings erst beim zweiten BufferedImage.

Viele Grüße,

Maik
 
Hallo!

Java:
ImageIO.read(originalImageFile);
Hier wird ja der Stream in ein Bild geschrieben, der Inhalt des Streams geht dabei verloren.
So versuchst du, den Stream zu kopieren:
Java:
InputStream is2 = is;
Bei einem solchen Vorgehen ist das Problem, dass weiterhin nur ein Objekt besteht, es allerdings sozusagen einen zweiten Namen erhält. Wenn du also ein Bild aus is liest, gehen nicht nur die Infos aus is verloren, sondern auch die aus is2. Ein anders Beispiel:
Java:
public static void copy() {
    Point punkt_bei_1_1 = new Point(1, 1);
    Point kopie = punkt_bei_1_1;
    kopie.setLocation(2, 2); // Da "kopie" intern nur ein Verweis auf "punkt_bei_1_1" ist, 
    // wird auch die Position von "punkt_bei_1_1" verändert. Sieh selbst:
    System.out.println(punkt_bei_1_1); // java.awt.Point[x=2,y=2]
}
Im Beispiel mit den Point Objekten lässt sich das Problem einfach beheben, z.B. mit der Methode Point.getLocation(), die ein neues Point-Objekt liefert, welches die gleichen Werte hat.
Bei Streams ist das meistens komplizierter, in diesem Fall benutzt du aber einfach erneut
Java:
InputStream is2 = new FileInputStream(originalImageFile);

Ich hoffe ich konnte helfen, Grüße
Cymatoxa
 
Zuletzt bearbeitet:
Hi,

ja das ist jetzt peinlich... ist eigentlich klar das ich dann nur eine neue Referenz auf das Objekt habe :X.
Aber ich bräuchte eigentlich schon eine Kopie des Streams, zumindest würde das einiges leichter machen. Es wäre nur eine Notlösung die Datei dann nochmal zu öffnen, da ich im Programm die Datei auch erst habe nachdem ich den Stream gespeichert habe.

Viele Grüße,

Maik
 
Zurück