Erste Schritte Einlesen / Auslesen funktioniert nicht

supertux

Mitglied
Hallo Leute , ich spiele mich gerade mit diversen Tutorials herum und hab mal eines nachgemacht zum Thema Ein und auslesen von Dateien (video2brain) .



Allerdings habe ich folgendes Problem nachdem ich ein Beispiel nachgebaut habe.
Augenscheinlich ist es 1:1 mit dem Videobeispiel übereinstimmend. Ich bekomme auch keine compiler Fehler aber weder das erstellen der Datei noch das Auslesen der Datei (klar wenn er nichts erstellt gibts nichts zu lesen)

funktioniert -.-


Eventuell seht ihr ja den Fehler an dem ganzen?

Java:
package DatenLesen;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class StreamDemo {

	public static void main(String[] args) {
		String dateiName = "streamtest.bin";
		schreiben(dateiName);
		lesen(dateiName);
	}

	private static void schreiben(String dateiName) {
		try (DataOutputStream out = new DataOutputStream(
				new BufferedOutputStream(new FileOutputStream(dateiName)))) {

			String name = "Klaus";
			int alter = 42;
			double größe = 1.82;
			out.writeUTF(name);
			out.write(alter);
			out.writeDouble(größe);
		} catch (FileNotFoundException ex) {
			// TODO: handle exception
			System.out.println("Problem: " + ex.getMessage());
		} catch (IOException ex) {
			System.out.println("Fehler 1" + ex.getMessage());
		}

	}

	private static void lesen(String dateiName) {
		try (DataInputStream in = new DataInputStream(new BufferedInputStream(
				new FileInputStream(dateiName)))) {

			String name = in.readUTF();
			int alter = in.readInt();
			double größe = in.readDouble();
		}
		catch(FileNotFoundException ex) {
			System.out.println("Fehler 2: "+ex.getMessage());
		}
		catch (IOException ex){
			
			System.out.println("Fehler3:" + ex.getMessage());
		}
	}

}
 
Zuletzt bearbeitet:
Hast du das:

Java:
package DatenLesen;
nur so abgeschrieben, oder gibts das bei dir wirklich?
 
Grundsätzlich finde ich es grenzwertig in Tutorial einen solchen Umgang mit Exceptions zu zeigen. Meiner Meinung sollte bei einer Exception immer der komplette StackTrace ausgegeben werden.

Zweiter Schwachpunkt des Tutorials (falls es auch so gezeigt wurde): Der Stream wird nach dem Schreiben nicht geschlossen, hier fehlt ein
Code:
close()

Ein weiterer Fehler liegt darin (vermutlich falsch abgeschrieben), dass beim Schreiben des Alters nur
Code:
write
statt
Code:
writeInt
verwendet wird. Während write(int) nur ein Byte in den Stream schreibt werden bei writeInt vier Bytes geschrieben. Umgekehrt ist es beim Lesen genause readInt() liest vier Bytes, d.h. in Deinem Fall bleiben für readDouble() nicht genügend Bytes zur Verfügung.
 
Zeile 28/44:
Java:
out.write(alter);
Java:
int alter = in.readInt();
 
woher weißt du das es nicht funktioniert?
Naja laut Video wird ein File angelegt... Das File kann ich irgendwie nirgends finden obwohl ja eines angelegt werden müsste nachdem ich ja schreibe und hier kein Fehler auftritt beim Starten des Programms.


Beim Lesen bekomme ich dann natürlich eine IO exception weil das File noch nicht existiert.



Hast du das:

Java:
package DatenLesen;
nur so abgeschrieben, oder gibts das bei dir wirklich?

Das Package hab ich mir selbst angelegt das gibt es ^^, da liegt mein klassenfile drinnen .
 
Grundsätzlich finde ich es grenzwertig in Tutorial einen solchen Umgang mit Exceptions zu zeigen. Meiner Meinung sollte bei einer Exception immer der komplette StackTrace ausgegeben werden.



Zweiter Schwachpunkt des Tutorials (falls es auch so gezeigt wurde): Der Stream wird nach dem Schreiben nicht geschlossen, hier fehlt ein
Code:
close()

close() fehlt, ohne close nix los, besonders wenn Buffer mit im Spiel ist

Nein das ist hier kein Fehler, ich bin zwar nicht der try catch Profi (Hab mir vorher die Lehrvideos dazu angesehen und ein wenig damit rumgespielt, kann es aber noch nicht perfekt ) ... in der Art wie es hier angeschrieben ist schließt das try nach ausführung automatisch die Verbindung.

Wenn man ein" normales "try catch macht dann muss man die Verbindung auch wieder manuell schließen. (Fragt mich jetzt nicht nach den genauen details ^^ ich muss das ganze erst öfters anwenden um mehr im Kopf zu haben 😀 )

Ein weiterer Fehler liegt darin (vermutlich falsch abgeschrieben), dass beim Schreiben des Alters nur
Code:
write
statt
Code:
writeInt
verwendet wird. Während write(int) nur ein Byte in den Stream schreibt werden bei writeInt vier Bytes geschrieben. Umgekehrt ist es beim Lesen genause readInt() liest vier Bytes, d.h. in Deinem Fall bleiben für readDouble() nicht genügend Bytes zur Verfügung.

Ui , danke für den Tipp , das war wohl ein Tippfehler von mir beim autovervollständigen lassen da hatte eclipse mir diverse male einen Streich gespielt gehabt. Da habe ich beim Fehlersuchen x-mal darüber gelesen 🙁 .

Nun läuft es durch und auch das lesen gibt keinen Fehler aus.
Auch die Ausgabe läuft super 🙂 . Einzig was mich noch wundert... wo liegt das File? Bzw. Kann ich beim Dateinamen auch gleich den Pfad mit angeben?


Und danke an alle für die kompetente und schnelle Hilfe 🙂
 
Zuletzt bearbeitet von einem Moderator:
Das mit der neuen try catch Syntax und dem automatisch close() kann ich nicht beurteilen, dazu kenne ich Java 1.7 zu wenig.

Die Datei sollte relativ zu dem Verzeichnis liegen aus dem das Programm ausgeführt wurde. Grundsätzlich kann man bei einem FileOutputStream auch absolute Pfade angeben.
 

Zurück
Oben