Text File を二次元配列(int)に格納

n=5  m=6
1, 2, 3, 4, 5, 6,
7, 8, 9, 10, 11, 12,
13, 14, 15, 16, 17, 18,
19, 20, 21, 22, 23, 24,
25, 26, 27, 28, 29, 30,
 -- Press any key to exit (Input "c" to continue) --

Text File にタイプされたデータを二次元配列(int)に格納します。

前田稔の超初心者のプログラム入門

プログラムの作成

  1. メモ帳などでタイプして LoadTT.java の名前で保存して下さい。
    //★ Text Data を入力して二次元配列(int)に格納    前田 稔
    import java.io.*;
    import java.util.StringTokenizer;
    
    class LoadTT
    {   public static void main(String args[])
        {
            DataFile dfile= new DataFile();
            dfile.LoadTT("c:\\tmp\\test.txt");
        }
    }
    
    class DataFile
    {   BufferedReader  br;     // Reader
        String          str;    // Input Buffer
        StringTokenizer token;  // トークンの切り出し
        int             TT[][]; // int Table
        int             n,m;    // TT[n][m] Size
    
        // Load File to Table
        public void LoadTT(String fname)
        {   int     nm,i,j;
            File    file = new File(fname);
            if (checkBeforeReadfile(file)==false)
            {   System.out.println("ファイルが見つからないか開けません");
                return;
            }
            try
            {   br = new BufferedReader(new FileReader(file));
                // 配列のサイズを取得
                NextRead();
                n = Val();
                m = Val();
    System.out.println("n=" + n + "  m=" + m);
                TT= new int[n][m];
                nm= n*m;
                NextRead();
                // 配列に値を格納
                for(i=0; i<nm; i++)
                {   TT[i/m][i%m] = Val();  }
                br.close();
            }
            catch(FileNotFoundException e)
            {   System.out.println(e);  }
            catch(IOException e)
            {   System.out.println(e);  }
    
            // TT[n][m] の確認
            for(i=0; i<n; i++)
            {   for(j=0; j<m; j++)  System.out.print(TT[i][j] + ", ");
                System.out.println("");
            }
        }
    
        // File Open Check
        private boolean checkBeforeReadfile(File file)
        {   if (file.exists())
            {   if (file.isFile() && file.canRead())
                {   return true;  }
            }
            return false;
        }
    
        // Read Next Line
        private boolean NextRead()
        {
            while(true)
            {   try
                {   str = br.readLine();  }
                catch(IOException e)
                {   System.out.println(e);  }
                if (str == null)
                {   System.out.println("ファイルが EOF になりました");
                    return false;
                }
                if (str.charAt(0)!='/')
                {
                    token = new StringTokenizer(str, " ,;\t\r\n()", false);
                    return true;
                }
            }
        }
    
        // Next Val(str から次の値を取得)
        private int Val()
        {   if (token.hasMoreTokens()==false)
                if (NextRead()==false)  return -1;
            return Integer.parseInt(token.nextToken());
        }
    }
    
  2. プログラムをテストしたデータファイル("c:\tmp\test.txt")です。
    先頭が「/」で始まる行はコメント行とみなして、読み捨てます。
    5, 6, が二次元配列 TT[][] のサイズです。
    以降カンマで区切られた整数が 5*6 = 30個タイプされています。
    一行に何件タイプしてもOKで、改行は自由です。
    //★ DATA FILE を入力する  前田 稔
    5, 6,
    1,2,3,4,5,6,7,8,9,10,
    //Commant
    11,12,13,14,15,16,17,18,19,20,
    21,22,23,24,25,
    26,27,28,29,30,
    
    java のソースファイルをコンパイルして class オブジェクトを実行して下さい。
    ページ先頭の画面が表示されたら完成です。

プログラムの説明

  1. ゲームプログラムでは、MapTable や Enemy の動きやモーションデータなどを TEXT FILE にタイプして入力することが良くあります。
    今回は Text File にタイプされたデータを int 型の二次元配列に格納します。
    ファイル入力の説明は 入力ファイル→コンソール(行単位) を参照して下さい。
    数字の切り出しは カンマで区切った数字を配列に格納 を参照して下さい。
  2. java.util.StringTokenizer; を import して下さい。
    Main() では new DataFile() でインスタンス化して dfile.LoadTT("c:\\tmp\\test.txt") を呼ぶだけです。
        class LoadTT
        {   public static void main(String args[])
            {
                DataFile dfile= new DataFile();
                dfile.LoadTT("c:\\tmp\\test.txt");
            }
        }
        
  3. String str は Text File から入力する1行分のバッファで、token でトークンを切り出します。
    int TT[][] はデータを格納する二次元配列で、n, m はそのサイズです。
        class DataFile
        {   BufferedReader  br;     // Reader
            String          str;    // Input Buffer
            StringTokenizer token;  // トークンの切り出し
            int             TT[][]; // int Table
            int             n,m;    // TT[n][m] Size
        
  4. NextRead() で1行分を str に入力します。
    1件目と2件目のデータは配列のサイズで n, m に格納します。
    Val() メソッドでトークンを切り出して int 型に変換します。
    二次元配列を TT= new int[n][m] で生成します。
        // Load File to Table
        public void LoadTT(String fname)
        {       ・・・
            try
            {   br = new BufferedReader(new FileReader(file));
                // 配列のサイズを取得
                NextRead();
                n = Val();
                m = Val();
    System.out.println("n=" + n + "  m=" + m);
                TT= new int[n][m];
         
  5. ファイルからデータを入力しながら TT[][] に格納します。
    Val() メソッドでは、トークンが無くなると自動的に次の行を str に読み込みます。
    TT[i/m][i%m] が二次元配列の添え字の計算式です。
                nm= n*m;
                NextRead();
                // 配列に値を格納
                for(i=0; i<nm; i++)
                {   TT[i/m][i%m] = Val();  }
                br.close();
            }
        
  6. TT[][] に格納された値を確認しています。
    不要なら削除して下さい。
            // TT[n][m] の確認
            for(i=0; i<n; i++)
            {   for(j=0; j<m; j++)  System.out.print(TT[i][j] + ", ");
                System.out.println("");
            }
        }
        
  7. ファイルからコメント行(先頭が /)をスキップして str に入力します。
        // Read Next Line
        private boolean NextRead()
        {
            while(true)
            {   try
                {   str = br.readLine();  }
                catch(IOException e)
                {   System.out.println(e);  }
                if (str == null)
                {   System.out.println("ファイルが EOF になりました");
                    return false;
                }
                if (str.charAt(0)!='/')
                {
                    token = new StringTokenizer(str, " ,;\t\r\n()", false);
                    return true;
                }
            }
        }
        
  8. str からトークンを切り出して int 型に変換する Val() メソッドです。
    token.hasMoreTokens()==false でトークンが無くなると次の行を入力します。
        // Next Val(str から次の値を取得)
        private int Val()
        {   if (token.hasMoreTokens()==false)
                if (NextRead()==false)  return -1;
            return Integer.parseInt(token.nextToken());
        }
        

超初心者のプログラム入門(Java2)