テキストファイルを読み込む方法です.
基本的にファイルは入力ストリームなので,内容は先頭から順番に読み込まれます.
ここでは次の3つの方法を順番に説明します.
1) ファイルから「1バイトづつ」読み込む方法
2) ファイルから「1文字(多国語含む)づつ」読み込む方法
3) ファイルから「1行づつ」読み込む方法
次ような内容のファイル “text1.txt” があるものとして,この内容を読み込む方法を説明します.
1 2 3 | Alphabet 日本語 English and 日本語 混在 |
【ファイルから「1バイトづつ」読み込む方法】
ファイルを FileInputStream として開き,それに対して read() メソッドを実行すると1バイトづつ読み込むことができます.読み取ったデータは int 型整数として与えられます.(下記:”FileRead1.java”)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | import java.io.*; class FileRead1 { public static void main( String argv[] ) { FileInputStream fi; int c, i = 0; try { fi = new FileInputStream("text1.txt"); while ( (c = fi.read()) != -1 ) { i++; System.out.println( i+":"+(char)c ); } fi.close(); } catch( IOException e ) { System.out.println("ファイルがオープンできません\n"); System.exit(-1); } } } |
この方法は最も基本的ですが,1バイトづつ読むため能率がよくありません.また多バイトからなる多国語文字を認識しないため実行すると文字化けが起こります.実行結果の表示を下に示します.
1:A 2:l 3:p 4:h 5:a 6:b 7:e 8:t 9: 10:æ 11: 12:¥ 13:æ 14: 15:¬ 16:è 17:ª 18: 19: 20:E 21:n 22:g 23:l 24:i 25:s 26:h 27: 28:a 29:n 30:d 31: 32:æ 33: 34:¥ 35:æ 36: 37:¬ 38:è 39:ª 40: 41:ã 42: 43: 44:æ 45:· 46:· 47:å 48: 49:¨ 50: |
【ファイルから「1文字(多国語含む)づつ」読み込む方法】
入力するデータを「文字データ」として認識して1文字づつ読み取る方法です.ファイルを FileInputStream として開き,更にそれを元にして InputStreamReader というオブジェクトを生成し,それに対して read() メソッドを実行すると「1文字づつ」読み込むことができます.読み取ったデータは int 型整数として与えられます.(下記:”FileRead2.java”)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | import java.io.*; class FileRead2 { public static void main( String argv[] ) { FileInputStream fi; InputStreamReader isr; int c, i = 0; try { fi = new FileInputStream("text1.txt"); isr = new InputStreamReader(fi,"UTF-8"); while ( (c = isr.read()) != -1 ) { i++; System.out.println( i+":"+(char)c ); } fi.close(); } catch( IOException e ) { System.out.println("ファイルがオープンできません\n"); System.exit(-1); } } } |
この方法では多バイトからなる多国語文字を認識するため,文字化けは起こりません.実行結果の表示を下に示します.
1:A 2:l 3:p 4:h 5:a 6:b 7:e 8:t 9: 10:日 11:本 12:語 13: 14:E 15:n 16:g 17:l 18:i 19:s 20:h 21: 22:a 23:n 24:d 25: 26:日 27:本 28:語 29: 30:混 31:在 32: |
また,ファイルを FileReader として開いてそれに対して read() メソッドを実行する方法(下記;”FileRead3.java”)もあり,同じ結果を得ることができます.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | import java.io.*; class FileRead3 { public static void main( String argv[] ) { FileReader fr; int c, i = 0; try { fr = new FileReader("text1.txt"); while ( (c = fr.read()) != -1 ) { i++; System.out.println( i+":"+(char)c ); } fr.close(); } catch( IOException e ) { System.out.println("ファイルがオープンできません\n"); System.exit(-1); } } } |
【ファイルから「1行づつ」読み込む方法】
おそらく一番実用的な方法かと思います.テキストファイルを「1行づつ」読み取って String クラスの文字列オブジェクトとして取り出す方法です.(下記:”FileRead4.java”)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | import java.io.*; class FileRead4 { public static void main( String argv[] ) { FileReader fr; int i = 0; String b; try { fr = new FileReader("text1.txt"); BufferedReader br = new BufferedReader(fr); while ( (b = br.readLine()) != null ) { i++; System.out.println( i+":"+b ); } fr.close(); } catch( IOException e ) { System.out.println("ファイルがオープンできません\n"); System.exit(-1); } } } |
これを実行すると次のようになります.
1:Alphabet 2:日本語 3:English and 日本語 混在 |
【コンマ区切りの文字列(CSVデータ)の分離】
コンマ区切りデータ(CSVデータ)を1行づつ読み取った場合に,その行をコンマ毎に区切ってバラバラの文字列にする方法を説明します.今回例に使用するのは,総務省が配布する「標準地域コード」です.このデータは次のように8つの項目からなり,それをCSVデータにしたファイル “ChiikiCode.csv” を読み込む例です.
1. 都道府県コード
2. 市町村コード
3. 地域コード
4. 都道府県名
5. 市町村名1
6. 市町村名2
7. 市町村名3
8. 読みがな
このファイルの内容は次のようなものです.
1,0,1000,北海道,,,,ほっかいどう 1,100,1100,北海道,札幌市,,,さっぽろし 1,101,1101,北海道,札幌市,,中央区,ちゅうおうく 1,102,1102,北海道,札幌市,,北区,きたく (以下省略) |
このデータを読み取って,3〜8の項目を表示するプログラム “CSVtest1.java” を下に示します.
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 | import java.io.*; class CSVtest1 { public static void main( String argv[] ) { FileReader fr; int i = 0; String b; String csv[] = new String[20]; try { fr = new FileReader("ChiikiCode.csv"); BufferedReader br = new BufferedReader(fr); while ( (b = br.readLine()) != null ) { i++; csv = b.split(","); System.out.print("("+i+")"); System.out.printf("\t地域コード: %s\n",csv[2]); System.out.printf("\t%s%s%s%s",csv[3],csv[4],csv[5],csv[6]); System.out.printf("(%s)\n",csv[7]); } fr.close(); } catch( IOException e ) { System.out.println("ファイルがオープンできません\n"); System.exit(-1); } } } |
このプログラムを実行した様子を下に示します.
(1) 地域コード: 1000 北海道(ほっかいどう) (2) 地域コード: 1100 北海道札幌市(さっぽろし) (3) 地域コード: 1101 北海道札幌市中央区(ちゅうおうく) (4) 地域コード: 1102 北海道札幌市北区(きたく) (以下省略) |