Hallo Arnd,
Post by Arnd LehnenHallo,
ich muss die Werte für eine Matrix aus einer dat-Datei auslesen und habe in
der Thematik Auslesen von Daten aus Dateien überhaupt keine Erfahrung. :-)
Die Werte für eine Zeile in der Matrix stehen in der dat-Datei auch in einer
Zeile und sind durch Leerzeichen voneinander getrennt. Kann die Trennzeichen
auch ändern, wenn dies etwas hilft.
Kann mir jemand helfen und/oder einen Link zeigen, der die Thematik
anfängergerecht erklärt?
Naja, das sollte eigentlich in jedem halbwegs vernünftigen Java-Buch
behandelt sein.
Ich versuche mich aber trotzdem einmal an einer kleinen Einführung:
Für I/O sind im wesentlichen die Pakete java.io und java.nio zuständig.
Um Text zu lesen verwendet man i.d.R. einen sog. Reader (s.
java.io.Reader), in Deinem Fall, da der Text in einer Datei steht, einen
java.io.FileReader. Bei der Ein-/Ausgabe können Fehler auftreten, die
sich in Form einer IOException bemerkbar machen. Diese muss natürlich
vom Programm behandelt werden.
Damit der Text zeilenweise eingelesen werden kann, müssen die einzelnen
Zeichen zwischengespeichert, also gepuffert (buffered) werden. Dies
erledigt z. B. ein BufferedReader.
Die Kombination aus beiden kann nun verwendet werden, um jede Zeile
einer Datei nacheinander einzulesen:
try {
FileReader fr = new FileReader("meinedatei.dat");
BufferedReader reader = new BufferedReader(fr);
String zeile;
while ( (zeile=reader.getLine()) != null ) {
// mach was mit zeile
}
reader.close();
fr.close();
}
catch ( IOException ioe ) {
e.printStackTrace(); // Stack-Trace ausgeben, wenn ein I/O-Fehler
// aufgetreten ist.
}
Jetzt musst Du nur noch jede Zeile in einzelne Zeichenketten aufteilen.
Als Trennzeichen willst Du Whitespaces (Space, Tab, Return, ...)
verwenden. Man ersetze "// mach was mit zeile" oben durch
String zahlenString[] = zeile.split("\\S");
Jetzt muss man nur noch jeden zahlenString in eine Zahl umwandeln. Z. B.
in int-Zahlen, durch
int zahlen[] = new int[zahlenString.length];
for ( int i = 0; i < zahlenString.length; i++ ) {
zahlen[i] = Integer.parseInt(zahlenString[i]);
}
Da hier eine NumberFormatException auftreten kann, muss ein
entsprechender catch-Block her. Außerdem willst Du aus den so
entstandenen Zahlenreihen eine Matrix aufbauen. Ein einfaches Beispiel
einer Matrix erhält man, wenn man eine Liste nimmt und die Einträge
dieser Liste den Zeilen der Matrix entsprechen.
try {
ArrayList matrix = new ArrayList();
FileReader fr = new FileReader("meinedatei.dat");
BufferedReader reader = new BufferedReader(fr);
String zeile;
while ( (zeile=reader.getLine()) != null ) {
String zahlenString[] = zeile.split("\\S");
int zahlen[] = new int[zahlenString.length];
for ( int i = 0; i < zahlenString.length; i++ ) {
zahlen[i] = Integer.parseInt(zahlenString[i]);
}
matrix.add( zahlen ); // Zahlenreihe zur Matrix hinzufügen.
}
reader.close();
fr.close();
// Ausgabe der Matrix
for ( int i = 0; i < matrix.size(); i++ ) {
int zahlen[] = (int[])matrix.get(i);
for ( int j = 0; j < zahlen.length; j++ )
System.out.print( zahlen[j] + " " );
System.out.println();
}
}
catch ( IOException ioe ) {
e.printStackTrace(); // Stack-Trace ausgeben, wenn ein I/O-Fehler
// aufgetreten ist.
}
catch ( NumberFormatException nfe ) {
e.printStackTrace();
}
Alles natürlich ungetestet und ohne Gewähr.
Gruß
Michael