2016-11-22 20 views
-1

Java用のタイルマップエディタを作成しようとしていますが、ファイルオープンに固執しています。ファイル自体を開くことはそれほど大したことではありませんが、テキストファイルに空白を入れるとすぐにランタイムエラーが発生します。各タイルは、イメージ(黒または灰色の四角形のatm)とソリッド(1)かどうか(0)で構成されています。現在、このような形式で保存されますタイルマップ:例えば繰り返しパターンのテキストファイルをリストに読み込みます

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 

これは固体であり、プレイヤーをブロックします黒の壁とシンプルな部屋である可能性があります。 6x4タイルマップになります。 Format x:x(ここでは空白)をどのように定義できますか?

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

リストの各要素を正確に保存しようとしていますか?単一の1:1またはそれらの全ライン?コロンでいっぱいの行を解析しようとすると、例外が発生します。コロンを含むこの行を解析しようとしているのはなぜですか?あなたのintを解析したいなら、リストの各要素をどのように見せたいでしょうか? –

+0

上記のコード例は、より基本的なレベルで動作させるためのものです。実際のケースでは私はList TileMapを持っています。 Tileはgetter()とsetters()でint型とint型からなるクラスです。だから、最初の1をIDとして格納し、2番目のIDをタイプとして保存し、リストの各Tile要素のように処理したいと思います。 編集:私が探しているのは、C#scanfのようなものです。引数%dまたは%rなど... –

答えて

0

あなたがちょうど空白に悩まされている場合...そして、これはあなたが求めているものであることを

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

パーフェクト!ほぼ1対1で実装できます。ストリームとその可能性を改訂する時間を費やします:)変更する唯一の方法は、プログラムがtxtファイル内の行の終わりを認識することです。私はどのような文字が改行に使用されているかを私のプログラムで確認する16進エディタを使ってそれを行うことができると思います。ありがとう! –

+0

もう1つ:BufferedReaderを閉じるべきではないですか? –

+0

BufferedReaderは自動的に閉じられます。 try-with-resources実装(JDK7以降で使用可能)を使用してインスタンス化される方法に注目してください。また、BufferedReaderはAutoCloseableを実装しています。 AutoCloseableを実装するものは、try-with-resourcesステートメントの内部で使用できます。はい、Streamsを使用してこれを行うことは素晴らしいことです。 –

0

をこのような何かを推測しながら、

while ((text = reader.readLine()) != null) 
{ 
    list.add(Integer.parseInt(text.trim())); 
} 
にコードを変更します

しかし、私は整数として行全体を変換することができないので、これはうまくいきません。

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

あなたは間違いなく私を正しい道に導いてくれてありがとう。私はちょうど上記のコメントで言ったように、私はtxtファイルの行が終了したときにbufferedreaderがどのように知っているかを知る必要があります。 –

関連する問題