2016-11-22 3 views
-1

Ich versuche, einen Tile Map Editor für Java zu erstellen, und ich bin auf der Dateiöffnung stecken. Das Öffnen der Datei selbst ist nicht viel, aber es erzeugt Laufzeitfehler, sobald ich Leerzeichen in die Textdatei lege. Jede Kachel besteht aus einem Bild (schwarz oder weiß quadratisch atm) und ob es fest (1) oder nicht (0) sein wird. Die tilemaps werden derzeit in einem Format wie folgt gespeichert werden:Textdatei mit wiederholten Muster in Liste lesen

1:1 1:1 1:1 1:1 1:1 1:1 
1:1 0:0 0:0 0:0 0:0 1:1 
1:1 0:0 0:0 0:0 0:0 1:1 
1:1 1:1 1:1 1:1 1:1 1:1 

Dieses zum Beispiel ein einfaches Zimmer mit schwarzen Wänden sein könnte, die fest sind und die Spieler blockieren. Es wäre eine 6x4-Kachelkarte. Wie kann ich das Format x: x (Leerzeichen hier) definieren?

List<Integer> list = new ArrayList<Integer>(); 
File file = new File("file.txt"); 
BufferedReader reader = null; 
try 
{ 
    reader = new BufferedReader(new FileReader(file)); 
    String text = null; 
    while ((text = reader.readLine()) != null) 
    { 
    list.add(Integer.parseInt(text)); 
    } 
} 
catch (FileNotFoundException e) 
{ 
    e.printStackTrace(); 
} 
catch (IOException e) 
{ 
    e.printStackTrace(); 
} 
+0

Was genau möchten Sie in jedem Element Ihrer Liste speichern? Eine einzelne 1: 1 oder die ganze Linie von ihnen? Die Ausnahme tritt auf, wenn Sie versuchen, eine Zeile mit Doppelpunkten zu analysieren. Warum versuchst du parsInt in dieser Zeile, die Doppelpunkte enthält? Wenn Sie Ihre Ints analysieren möchten, wie soll dann jedes Element in der Liste aussehen? –

+0

Nun, das obige Codebeispiel dient dazu, es auf einer viel grundlegenderen Ebene arbeiten zu lassen. Im wirklichen Fall habe ich eine Liste TileMap. Tile ist eine Klasse bestehend aus int ID und int Type mit ihren getters() und setter(). Also möchte ich die erste 1 als ID und die zweite 1 als Typ speichern und so für jedes Tile-Element in der Liste weitermachen. Edit: Was ich suche ist wie die C# scanf Argumente% d oder% r usw. ... –

Antwort

0

Während vermutet, dass das ist, was Sie für Fragen, dann ist dies so etwas wie ...

import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileReader; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.List; 

public class ReadTextFile { 

    public static void main(String[] args) { 
     List<Tile> list = new ArrayList<Tile>(); 
     String path = "C:/whatever/your/path/is/"; 
     File file = new File(path + "file.txt"); 
     try (BufferedReader reader = new BufferedReader(new FileReader(file))) { 
      String text = null; 
      while ((text = reader.readLine()) != null) { 
       String[] pairs = text.split(" "); 
       for(String pair : pairs) { 
        String[] chars = pair.split(":"); 
        int id = Integer.parseInt(chars[0]); 
        int type = Integer.parseInt(chars[1]); 
        list.add(new Tile(id, type)); 
       } 
      } 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 
} 

class Tile { 
    int id; 
    int type; 

    Tile(int id, int type) { 
     this.id = id; 
     this.type = type; 
    } 

    @Override 
    public String toString() { 
     return "Tile [id=" + id + ", type=" + type + "]"; 
    } 


} 
+0

Perfekt! Könnte es fast eins zu eins implementieren. Ich werde meine Zeit damit verbringen, die Streams und ihre Möglichkeiten zu überarbeiten :) Das einzige, was geändert wird, ist, dass das Programm das Ende einer Zeile in der TXT-Datei erkennt. Ich denke, dass ich das mit einem hexadezimalen Editor tun kann, der mir zeigen wird, welche Art von Charakter für Newline verwendet wird und dann in meinem Programm überprüfen. Vielen Dank! –

+0

Noch eine Sache: Sollte ich den BufferedReader nicht schließen? –

+0

Der BufferedReader wird automatisch geschlossen. Beachten Sie, wie es mithilfe der Implementierung von try-with-resources (seit JDK7 verfügbar) instanziiert wird. Beachten Sie außerdem, dass BufferedReader AutoCloseable implementiert; Alles, was AutoCloseable implementiert, kann in einer Try-with-Resources-Anweisung verwendet werden. Ja, dies mit Streams zu tun wäre großartig. –

0

Wenn Sie durch die Whitespaces nur gestört,

while ((text = reader.readLine()) != null) 
{ 
    list.add(Integer.parseInt(text.trim())); 
} 
den Code ändern

Aber ich nehme an, das wird nicht funktionieren, weil Sie nicht die gesamte Zeile als Integer konvertieren kann, so würde ich empfehlen:

while ((text = reader.readLine()) != null) 
{ 
    String[] values = text.split(":") 
    for(String val : values) 
    { 
     list.add(Integer.parseInt(val.trim())); 
    } 
} 
+0

Danke, du hast mich auf jeden Fall auf den richtigen Weg gebracht. Wie ich oben im Kommentar gesagt habe, muss ich nur herausfinden, wie der Bufferedreader weiß, wenn die Zeile in der TXT-Datei fertig ist. –