ImageIO.read() zweimal hintereinander aus ObjectInputStream funktioniert nicht

Status
Nicht offen für weitere Antworten.

BigSnake

Mitglied
Folgendes Problem : Ich schreibe eine Projektdatei, welche ersteinmal eine ganze Reihe von Textinformationen enthält (mit dem ObjectOutputStream als String gespeichert), danach zwei Grafiken im PNG Format. Beim Schreiben tritt kein Fehler auf.
Beim Einlesen werden sowohl die Textinformationen, als auch die erste Grafik fehlerfrei eingelesen. Das zweite Bild wird nicht gelesen und ich bekomme nur eine NULL Referenz zurück.

Hier ist der Code zum Lesen der Projektdatei

Java:
public void readFromProject() throws MapFileException {
		try {
			FileInputStream fis = new FileInputStream(fileName);
			ObjectInputStream ois = new ObjectInputStream(fis);
			
			int lines = ois.readInt();
			// Liest die Text Zeilen ein
			for (int i=0; i<lines; i++) {
				String line = (String)ois.readObject();
				String[] l = Parser.parseString(line,'~');
				// Auf korrektes Token testen
				if (l[0].equals(MapFileHandler.TOKEN_BACKGROUND_FILE)) {
					background = l[1];
				}
				if (l[0].equals(MapFileHandler.TOKEN_FOREGROUND_FILE)) {
					foreground = l[1];
				}
				if (l[0].equals(MapFileHandler.TOKEN_DESCRIPTION)) {
					description = l[1];
				}
				if (l[0].equals(MapFileHandler.TOKEN_MASK)) {
					// Die eigentliche Maske wird später erstellt
					maskList.add(line);
				}
				if (l[0].equals(MapFileHandler.TOKEN_PART)) {
					// Parts werden erst erstellt, nachdem die gesamte Masken Liste geladen wurde
					partList.add(line);
				}
				if (l[0].equals(MapFileHandler.TOKEN_TEXT)) {
					// Parts werden erst erstellt, nachdem die gesamte Masken Liste geladen wurde
					textList.add(line);
				}
				if (l[0].equals(MapFileHandler.TOKEN_PROJECT_FOLDER)) {
					projectFolder = l[1];
				}
				if (l[0].equals(MapFileHandler.TOKEN_SIZE)) {
					width = l[1];
					height = l[2];
				}
				if (l[0].equals(MapFileHandler.TOKEN_TITLE)) {
					title = l[1];
				}
			}			
			// Liest die Images ein
			ImageInputStream ios = ImageIO.createImageInputStream(fis);			
			BufferedImage test = null;
			test = ImageIO.read(ios);
			if (test == null)
				throw new MapFileException("Background nicht geladen");
			model.setBackground(test);			
			test = null;
			test = ImageIO.read(ios);
			if (test == null)
				throw new MapFileException("Foreground nicht geladen");
			model.setForeground(test);			
			fis.close();
		} catch (Exception e) {
			e.printStackTrace();
			throw new MapFileException("Konnte das Projekt nicht laden");
		}
}

Hier ist der Code zum Schreiben der Projektdatei

Java:
protected void saveToProject() throws MapFileException {
		// Schreibt die eigentliche Projektdatei
		try {			
			FileOutputStream fos = new FileOutputStream(fileName);
			ObjectOutputStream oos = new ObjectOutputStream(fos);
			// Schreibt die Texturellen Informationen
			// Schreibt die Anzahl Zeilen
			
			int lines = 6 + maskList.size() + textList.size() + partList.size();
			oos.writeInt(lines);
			oos.writeObject(title);
			oos.writeObject(description);
			oos.writeObject(size);
			oos.writeObject(projectFolderToken);
			oos.writeObject(foreground);
			oos.writeObject(background);
			for (int i=0; i<maskList.size(); i++) {
				oos.writeObject(maskList.get(i));				
			}
			for (int i=0; i<partList.size(); i++) {
				oos.writeObject(partList.get(i));				
			}
			for (int i=0; i<textList.size(); i++) {
				oos.writeObject(textList.get(i));				
			}
			// Schreibt Hintergrund und Vordergrund Layer in den Stream
			ImageOutputStream ios = ImageIO.createImageOutputStream(fos);
			boolean b = ImageIO.write(model.getBackgroundLayer(), "png", ios);
			if (!b)
				throw new MapFileException("Konnte Background Layer nicht speichern.");
			b = ImageIO.write(model.getForegroundLayer(), "png", ios);
			if (!b)
				throw new MapFileException("Konnte Foreground Layer nicht speichern.");			
			fos.close();
		} catch (Exception e) {
			e.printStackTrace();
			throw new MapFileException("Konnte Projekt nicht speichern");			
		}
}

Ich habe bereits herumprobiert, ob ein zusätzliches close beim Schreiben notwendig sein könnte, das hat aber nichts gebracht :autsch:
 
S

SlaterB

Gast
das close ist das Problem, ImageIo führt selber ein close() aus, danach geht nix mehr,
zwei Bilder in einem Stream ist aber auch ungewöhnlich, muss das sein?

wahrscheinlich musst du dann entweder die Bilder in zwei Byte-Arrays laden und diese je einzeln als Stream anbieten
oder du brauchst einen Wrapper um den ursprünglichen Stream, der den close-Befehl von ImageIO empfängt, aber nicht weiteleitet,
und beim zweiten Lesevorgang die korrekten weiteren Daten liefert, kann kompliziert werden..


edit:
gleichzeitig ein ObjectInputStream + dann noch den ImageStream auf eine Datei ist ja noch schlimmer..
 

BigSnake

Mitglied
Alles in einer Datei ist schon nötig, da der User ja nicht immer ganze Ordner mit Dateien weitergeben soll, wenn er sein Projekt jemand anderem geben will.

Habe gerade auf der Seite von sun was über den Iterator Image Reader gelesen. Ich probiers mal damit.

Java:
Iterator readers = ImageIO.getImageReadersByFormatName("png");
			ImageReader reader = (ImageReader)readers.next();
			ImageInputStream iis = ImageIO.createImageInputStream(fis);
			reader.setInput(iis, false);
			BufferedImage buf = reader.read(0);
			if (buf == null)
				throw new MapFileException("Konnte Background Layer nicht laden");
			model.setBackground(buf);			
			buf = reader.read(1);
			if (buf == null)
				throw new MapFileException("Konnte Foreground Layer nicht laden");
			model.setForeground(buf);
			fis.close();

Mhh funktioniert auch nicht so recht ;(

EDIT

Also das Problem scheint jetzt beim Speichern zu liegen

Java:
Iterator writers = ImageIO.getImageWritersByFormatName("png");
			ImageWriter writer = (ImageWriter)writers.next();			
			ImageOutputStream ios = ImageIO.createImageOutputStream(fos);
			writer.setOutput(ios);			
			
			IIOImage first_IIOImage = new IIOImage(model.getBackgroundLayer(), null, null);
			IIOImage second_IIOImage = new IIOImage(model.getForegroundLayer(), null, null);
			writer.write(null, first_IIOImage, null);
			if (writer.canInsertImage(1)) {
				writer.writeInsert(1, second_IIOImage, null);
			} else {
				System.err.println("Writer can't append a second image!");
			}
			fos.close();

Es kann kein zweites Bild in den Stream geschrieben werden
 
Zuletzt bearbeitet:
S

SlaterB

Gast
ich kann jetzt grad nicht mehr in den Quellcode reinschauen, vielleicht macht das write() auch wieder ein close(),
du könntest doch einen neuen Writer anlegen?

wobei ich immer noch nicht glaube, dass das alles funktioniert,
entweder mehrere Dateien in ein Zip oder selber die eine Datei kurz vor der Verarbeitung an bekannten Bruchstellen in mehrere Temp-Dateien zerteilen
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M "ImageIO.read()" liest Bild nicht richtig ein AWT, Swing, JavaFX & SWT 3
B Probleme bei ImageIO.read (?!) AWT, Swing, JavaFX & SWT 9
U ImageIO.read verursacht heap space AWT, Swing, JavaFX & SWT 15
M Bild Beschreibung mit ImageIO speichern AWT, Swing, JavaFX & SWT 1
B Problem mit ImageIO.write() AWT, Swing, JavaFX & SWT 7
B ImageIO und animerte gifs? AWT, Swing, JavaFX & SWT 4
N ImageIO Endung mitgeben AWT, Swing, JavaFX & SWT 4
M ImageIO, Bilderordner durchblättern AWT, Swing, JavaFX & SWT 4
B ImageIO gif Dateien laden AWT, Swing, JavaFX & SWT 7
S toolkit vs. imageIO AWT, Swing, JavaFX & SWT 4
T Swing ImageIO - nicht abfangbare IOException AWT, Swing, JavaFX & SWT 5
B Problem mit imageIO und ImageIcon AWT, Swing, JavaFX & SWT 5
G Problem mit BufferedImage und imageIO AWT, Swing, JavaFX & SWT 2
H ImageIO.write-Probleme, Speicherüberlauf und Absturz AWT, Swing, JavaFX & SWT 12
I BMP mit ImageIO schreiben AWT, Swing, JavaFX & SWT 1
Umb3rus JavaFX Problem mit PropertyValueFactory: can not read from unreadable property AWT, Swing, JavaFX & SWT 1
G textarea.read funzt net in Jar-Datei AWT, Swing, JavaFX & SWT 7
S ChangedCharSetException bei HTMLEditorKit.read() AWT, Swing, JavaFX & SWT 2
U Warum wird zweimal die Affinetransformation estellt (2Dgraphics, Java)? AWT, Swing, JavaFX & SWT 31
S Objekt einmal laden zweimal anzeigen 3d AWT, Swing, JavaFX & SWT 6
P LayoutManager BorderLayout - Zweimal Norden ? AWT, Swing, JavaFX & SWT 4
O Login Dialog zweimal öffnen AWT, Swing, JavaFX & SWT 2
O Swing Button löst zweimal aus, obwohl nur einmal geklickt AWT, Swing, JavaFX & SWT 3
kodela AWT eine Seite - zweimal print() AWT, Swing, JavaFX & SWT 7
T paint() wird zweimal ausgeführt AWT, Swing, JavaFX & SWT 6
P Einen Komponent zweimal zu einem Panel hinzufügen? AWT, Swing, JavaFX & SWT 18
V Zweimal klicken um Modalen Dialog zu beenden? AWT, Swing, JavaFX & SWT 15
S Einfacher Klick aber mouseClicked() zweimal aufgerufen AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben