Einlesen von Ints aus Datei...
-
Hi
Ich habe ein kleines Prob, und bräuchte mal kurz Hilfe...
Hier meine Aufgabe... ich möchte gerne aus einer Datei, die so aussieht:
test.dat:
12 13 14 15
16 17 18 19Zahlen herauslesen (Zahlbereich 0..255), also hier würd ich gern nacheinander die 12,13, 14 usw. in Variablen speichern...
Mein Programm fängt folgendermaßen an :
File test = new File ("test.dat");
DataInputStream in = new DataInputStream(
new BufferedInputStream(
new FileInputStream(test)));und dann habe ich die Methoden in.readInt(), in.readByte(), in.readline() ausprobiert, jedoch bekomme ich das Problem, dass in der Datei die einzelnen Ziffern und Zeichen als ASCII-Bytes vorhanden sind, d.h. wenn ich readbyte mache, bekomme ich für das Zeichen "1" die Zahl 49 geliefert und wenn ich readInt mache, natürlich eine Zahl, die gar nichts damit zu tun hat, da einfach die 4 ersten Bytes zusammengeklebt werden ...
Bei readline bekomme ich zwar nen String mit der ganzen Zeile, weiss aber net, wie es dann weitergeht, also wie ich da die Zahlen rausbekommen könnte...Theoretisch ist es ja nun möglich, dass über die einzelnen Bytes zu machen, sehe ich aber als etwas umständliche Lösung an...daher meine Frage, ob es noch eine einfachere Lösung für dieses Problem gibt ?
Danke schonmal für die Hilfe
gruß soul
-
Wenn du über readLine den String hast, kannst du ihn mit "split" oder mit einem StringTokenizer nach dem Trennzeichen " " (Leerzeichen) auftrennen. Dann bekommst du eine Liste von Strings, die du mit Integer.parseInt oder Integer.valueOf umwandeln kannst.
-
Jo mit dem String sollte das ganz einfach sein.
Du kannst dann jede Zeile mit Hilfe der Klasse java.util.StringTokenizer in die Zahlen aufteilen und mit der statischen Methode parseInt(String) der Klasse Integer aus den Teilstring die Integer kriegen:while ((line = in.readLine()) != null) { StringTokenizer str = new StringTokenizer(line, " "); numbers[i][0] = Integer.parseInt(str.nextToken()); numbers[i][1] = Integer.parseInt(str.nextToken()); numbers[i][2] = Integer.parseInt(str.nextToken()); numbers[i][3] = Integer.parseInt(str.nextToken()); ++i; }
Also StringTokenizer teilt Strings in Teile auf, wobei der 2. Parameter (hier ein Leerzeichen) das/die Trennzeichen ist/sind.
-
Danke schonmal sehr für die Hilfe, hat sehr gut geklappt...ich wusste halt einfach net, ob es schon irgendwo ne passende Klasse dafür gibt
gruß soul
-
Joho, ich bin nun doch noch über ein schwerwiegendes Problem gestoßen und es wäre nett, wenn ihr mir nochmal helfen könntet...
Also ersmal vorweg...ich versuche ein Programm zu schreiben, dass jeweils pro "Takt" x und y Koordinate aus einer Datei einließt und dann in einem Fenster ein dementsprechendes Quadrat zeichnet...es soll schließlich so aussehen, dass sich das Quadrat über den Bildschirm bewegt,also niemals doppelt da ist, und immer an der gerade ausgelesenen x,y-Koordinate steht ...
Insgesamt sollen dann bis zu 10 Quadraten so über den Bildschirm laufen ...Bisher habe ich folgendes geschrieben:
Main-Methode
public static void main(String[] args) throws Exception { File robot = new File ("Robots.dat"); DataInputStream in = new DataInputStream( new BufferedInputStream( new FileInputStream(robot))); Visual wnd = new Visual(); wnd.startAnimation(); String line; int x,y = 0; while ((line = in.readLine()) != null) { StringTokenizer str = new StringTokenizer(line, " "); while(str.hasMoreTokens() == true) { x = Integer.parseInt(str.nextToken())+5; y = Integer.parseInt(str.nextToken())+30; wnd.setkoord(x,y); //System.out.println(x); //System.out.println(y); } } }
Visual-Methode
public class Visual extends Frame { /** Creates a new instance of Visual */ public Visual() { super("Multi Robot Visualisierung"); addWindowListener(new WindowClosingAdapter(true)); setSize(550,550); setVisible(true); } public void paint(Graphics g) { g.fillRect(xkoord,ykoord, 20,20); } public void setkoord (int x, int y) { this.xkoord = x; this.ykoord = y; } public void startAnimation() { while (true) repaint(); } private int xkoord = 50,ykoord = 50, cnt = 0; }
Leider malt er halt immer nur das gleiche Quadrat wieder und wieder, was mir nich ganz klar ist...
Wie gesagt, wär klasse, wenn ihr mir nochmal helfen könntet
gruß soul
-
Das liegt daran, dass du in startAnimation() eine Endlosschleife gebaut hast, diese wird vom Hauptthread ausgeführt und dem zur Folge wird nie damit angefangen, Koordinaten einzulesen.
public void startAnimation() { while (true) repaint(); // wird unendlich oft ausgeführt, bis der Thread gekillt wird }
Also normalerweise sollte das Zeichnen in einem separaten Thread ablaufen.
Jedoch denke ich, dass es bei dir auch erstmal ausreichen würde, einfach nach jeder neueingelesenen Koordinate repaint() aufzurufen:while ((line = in.readLine()) != null) { StringTokenizer str = new StringTokenizer(line, " "); while(str.hasMoreTokens() == true) { x = Integer.parseInt(str.nextToken())+5; y = Integer.parseInt(str.nextToken())+30; wnd.setkoord(x,y); wnd.repaint(); /* Die Animation wird ohne eine kleine Pause zwischen dem Einlesen ** der Koordinaten wohl etwas schnell ablaufen. Also solltest du ** den Thread nach jedem Paar kurz schlafen legen. */ try { Thread.sleep(20); // 20 Millisekunden schlafen } catch (InterruptedException e) { // dann eben nich } } }
Den Aufruf von startAnimation() aolltest du dann also sein lassen.
-
Jo super dank dir schonmal Pogo...
Als ich nen bissle drüber nachgedacht hatte, fiel mir das auch auf...ich dachte dann einfach drüber nach, ungefähr das, was du mir geschrieben hast einfach ind startanimation zu packen, was aufs selbe rauskommen würde
-
Hi Pogo, hab da doch noch ne Frage...
Ich schreibe gerade ein Programm, bei dem ich Reaktionen in Form von Mausklicks auswerten will...mir fehlt nur im Moment eine Funktion, mit der ich eine abgerundete Systemzeit als Startzeit und als Schlusszeit auslesen kann, also brauch halt einfach irgendwas, womit ich folgendes hinbekomme:
int startzeit = "funktion"
//warten auf Mausklick (den teil hab ich schon)
int stoppzeit = "funktion"int zeit = stoppzeit-startzeit;
thx 4 help nochmal
gruß soul
-
Welche Java Version benutzt du? Wenn du Java 5 benutzt würde ich die statische Methode nanoTime() der Klasse java.lang.System empfehlen.
long timeInMs = System.nanoTime(); //... timeInMs = (System.nanoTime() - timeInMs) / 1000000;
Wenn du eine ältere Version benutzt dann bleibt nur System.currentTimeMillis(), jedoch ist diese Methode nicht grad so genau (~50ms).