Java 入 門 5 - ファイルを 書 く - 2010-09-23 Version 1.0 Kyosuke Yanai Copyright(c) 2010 Kyosuke Yanai
目 次 Java 入 門 5 1 はじめに...1 1.1 ファイルを 書 き 出 すために 使 うクラス...1 2 テストファイルを 書 く 手 順...2 2.1 テキストファイルを 書 くための 概 略 手 順...2 2.1.1 File インスタンスを 作 成 する...2 2.1.2 テキストファイルを 作 成 する...2 2.1.3 PrintWriter インスタンスを 作 成 する...3 2.1.4 テキストファイルの 内 容 を 書 き 出 す...3 2.1.4.1 print メソッド...4 2.1.4.2 println メソッド...4 2.1.4.3 printf メソッド...5 2.1.4.4 書 式 文 字 列...5 2.1.4.5 printf の 使 用 例...6 2.1.5 close()メソッドを 呼 び 出 して テキストファイルを 閉 じる...7 3 テキストファイル 書 き 込 みプログラムを 作 成...8 3.1 プログラムの 概 要...8 3.2 ソースコード 例...8 3.3 eclipse でクラスを 作 成...10 4 テキストファイル 読 み 込 みプログラムを 実 行... 11 4.1 ディレクトリの 作 成... 11 4.2 実 行... 11 5 テキストファイルの 読 み 込 みと 書 き 込 み... 12 5.1 String クラスのメソッド...12 5.1.1 文 字 列 の 比 較...12 5.1.2 文 字 列 の 検 索...13 5.1.3 文 字 列 の 抽 出 編 集...17 5.1.3.1 正 規 表 現 の 概 要...19 6 テキストファイルの 読 み 込 みと 編 集 出 力... 22 6.1 クラス 構 成...22 6.2 ソースコード...23 6.3 eclipse でクラスを 作 成 実 行...28 7 演 習... 29 7.1 CSV ファイルの 読 み 込 みと 編 集 出 力...29 7.2 2 つの CSV ファイルの 読 み 込 みと 編 集 出 力...29 Copyright(c) 2010 Kyosuke Yanai i
8 付 録... 30 8.1 TBD...30 9 改 定 履 歴... 31 10 索 引... 32 Copyright(c) 2010 Kyosuke Yanai ii
1 はじめに 本 テキストでは テキストファイルを 書 く 方 法 を 学 びます また テキストファイルを 読 み 内 容 を 抽 出 変 換 して 別 のファイルに 書 き 出 すこともやってみます これに 関 連 して 以 下 のことも 学 びます File クラス PrintWriter クラス String クラスの 主 なメソッド 正 規 表 現 1.1 ファイルを 書 き 出 すために 使 うクラス テキストファイルを 書 くのによく 使 われるクラスをリストします Java のさまざまなクラスの 仕 様 の 詳 細 は 下 記 のサイトに 載 っていますのでご 覧 ください http://java.sun.com/javase/ja/6/docs/ja/api/index.html (1) File クラス( 正 式 名 = java.io.file) ファイルとディレクトリを 扱 うためのクラスです このクラスを 使 って ディレクトリの 作 成 ディレクトリ 配 下 のファイルの 一 覧 パスの 処 理 などを 行 います このクラスだけでは ファイルの 内 容 を 読 んだり 書 いたりすることはできません (2) FileWriter クラス( 正 式 名 = java.io.filewriter) テキストファイルを 書 くための 基 本 的 な 機 能 を 持 ったクラスです (3) BufferedWriter クラス( 正 式 名 = java.io.bufferedwriter) FileWriter に newline()メソッドが 追 加 されたクラスです (4) PrintWriter クラス( 正 式 名 = java.io.printwriter) System.out と 同 じような 感 覚 で 使 用 できるメソッド(println など)を 持 ったクラスです 本 テキストでは PrintWriter クラスを 使 用 します 1
2 テストファイルを 書 く 手 順 ここでは テキストファイルを 書 く 基 本 的 な 手 順 を 学 びます 先 に 説 明 した File PrintWriter クラスを 使 用 します 2.1 テキストファイルを 書 くための 概 略 手 順 テキストファイルを 書 くための 概 略 手 順 を 図 に 示 します (1) ファイルパスを 指 定 して File インスタンスを 作 成 する (2) File の createnewfile()メソッドで 新 たにファイルを 作 成 する (3) File インスタンスを 指 定 して PrintWriter インスタンス を 作 成 する (4) PrintWriter の println()などのメソッドを 使 って テキ ストを 書 く (5) PrintWriter の close()メソッドを 呼 び 出 して テキスト ファイルを 閉 じる 図 2-1 テキストファイルに 内 容 を 書 き 出 す 概 略 手 順 各 ステップについて 詳 しく 説 明 します 2.1.1 File インスタンスを 作 成 する File クラスのコンストラクタに ファイルパスを 指 定 します String filepath = "ファイルパス"; File file = new File(filepath); 図 2-2 (1) File インスタンスを 作 成 する 2.1.2 テキストファイルを 作 成 する File の createnewfile()メソッドで 新 たにファイルを 作 成 します 2
file.creaenewfile(); 図 2-3 (2) 新 たにファイルを 作 成 する createnewfile 宣 言 : public boolean createnewfile() throws IOException 引 数 : なし 機 能 : File インスタンスが 持 つパス 名 の 空 (から)の 新 しいファイルを 生 成 します 戻 り 値 : true - ファイルの 生 成 に 成 功 した 場 合 false - 示 されたファイルがすでに 存 在 する 場 合 例 外 : IOException - 入 出 力 エラーが 発 生 した 場 合 2.1.3 PrintWriter インスタンスを 作 成 する PrintWriter クラスのコンストラクタに 生 成 した File インスタンスを 指 定 します PrintWriter pw = new PrintWriter(file); 図 2-4 (3) PrintWriter インスタンスを 作 成 する 2.1.4 テキストファイルの 内 容 を 書 き 出 す PrintWriter クラスには テキストを 書 き 出 すために 色 々なメソッドが 備 わっています よく 使 われるメソッドを 紹 介 します メソッド print() println() printf() format() 表 2-1 PrintWriter クラスの 主 なメソッド 概 要 文 字 列 数 値 などを 書 き 出 します 文 字 列 数 値 などを 書 き 出 し 行 を 終 了 させます 書 式 付 き 文 字 列 を 書 き 出 します 書 式 付 き 文 字 列 を 書 き 出 します 書 式 付 き 文 字 列 文 字 列 を 表 示 / 出 力 するときに その 文 字 列 の 中 に 日 付 や 金 額 などの 値 を 含 めたいことが あります 数 値 を 文 字 列 にして 表 示 / 出 力 するのですが 頭 に 金 額 の" "をつけたり 3 桁 ご とに","(カンマ)を 付 けたり といったことをします このように 文 字 列 に 数 値 などを 文 字 列 に 変 換 する 場 合 どのような 文 字 列 に 変 換 するかを 示 すものを 書 式 といいます その 書 式 を 含 んだ 文 字 列 を 書 式 付 き 文 字 列 といいます 具 体 的 には このあと 見 ていきましょう 3
各 メソッドの 仕 様 を 少 し 詳 しく 見 てみましょう なお printf()と format()はほとんど 同 じ 役 割 をしますので ここでは format メソッドの 詳 細 は 省 略 します 2.1.4.1 print メソッド 引 数 によって 機 能 が 異 なる 同 名 のメソッドがあります ここでは 主 なものを 紹 介 します print boolean 宣 言 : public void print(boolean b) 引 数 : boolean 型 機 能 : boolean 型 の 値 (true/false)を 出 力 します 戻 り 値 : なし print int 宣 言 : public void print(int i) 引 数 : int 型 機 能 : 整 数 型 の 値 を 出 力 します 戻 り 値 : なし print String 宣 言 : public void print(string s) 引 数 : String 型 機 能 : 文 字 列 を 出 力 します 戻 り 値 : なし 2.1.4.2 println メソッド print メソッドの 動 作 に 行 の 終 了 が 追 加 されます print()を 使 った 場 合 と println()を 使 った 場 合 の 違 いは 次 のようになります print() pw.print("abc"); pw.print("def"); pw.print("ghi"); println() pw.println("abc"); pw.println("def"); pw.println("ghi"); 出 力 結 果 ABCDEFGHI 出 力 結 果 ABC DEF GHI pw は PrintWriter のインスタンスを 参 照 しているものとします 図 2-5 print()と println()の 違 い 4
println()では 改 行 されているのがわかりますね 2.1.4.3 printf メソッド 書 式 付 き 文 字 列 を 書 き 出 します printf 宣 言 : public PrintWriter printf(string format, Object... args) 引 数 : format 書 式 付 き 文 字 列 (String 型 ) args オブジェクト 省 略 可 能 です また 複 数 個 の 指 定 ができます 機 能 : 書 式 付 き 文 字 列 を 出 力 します このとき args で 指 定 したオブジェクトを 文 字 列 に 変 換 して 出 力 します 戻 り 値 : PrintWriter 自 身 例 外 : IllegalFormatException 書 式 文 字 列 が 正 しくないときにスローされます printf でサポートしている 書 式 付 き 文 字 列 は 豊 富 ですが 比 較 的 よく 使 われるものを 紹 介 します 2.1.4.4 書 式 文 字 列 書 式 を 構 成 する 文 字 列 は 次 のような 形 式 をとります 書 式 文 字 列 %[argument_index$][flags][width][,presision]conversion (1) % 書 式 文 字 列 は "%"(パーセント)で 始 まります (2) argument_index$ 引 数 args の 何 番 目 の 引 数 を 表 示 対 象 とするかを 示 します たとえば 1$は 引 数 args の 最 初 の 引 数 を 示 します 同 様 に 2$, 3$, 4$,... と 記 述 します なお args の 引 数 がひとつだけの 場 合 には argument_index$は 不 要 です (3) flags 対 象 の 引 数 の 表 示 をどう 変 更 するかを 指 定 します "-" : 左 そろえします "+" : 符 号 ( + か - ) を 付 与 します "0" : "0"(ゼロ)で 埋 めます "," : ","(カンマ)を 付 与 します "(" : マイナスを"(" と")" の 括 弧 でくくります (4) width 出 力 する 最 小 の 文 字 数 を 指 定 します (5),presision 5
引 数 が 浮 動 小 数 点 (float)の 場 合 にだけ 有 効 です 小 数 点 の 右 の 桁 数 を 指 定 します (6) conversion 対 象 とする 引 数 のデータ 型 を 示 します "b" : boolean "c" : 文 字 型 "d" : 整 数 型 "f" : 不 動 小 数 点 型 "s" : 文 字 列 型 2.1.4.5 printf の 使 用 例 printf の 使 用 例 をいくつか 載 せます 引 数 は 整 数 型 を 使 用 しています (1) 書 式 文 字 列 %d 整 数 型 の 引 数 がひとつのときに 使 用 できます ( 例 -1) 記 述 int arg = 456789; pw.printf(" 引 数 の 値 は %d です ", arg); 実 行 結 果 引 数 の 値 は 456789 です (2) 書 式 文 字 列 %1$d %2$d 整 数 型 の 引 数 が2つのときに 使 用 できます ( 例 -2) 記 述 int number = 15; int value = 123456; pw.printf("%1$d 番 目 の 値 は %2$d です ", number, value); 実 行 結 果 15 番 目 の 値 は 123456 です (3) 書 式 文 字 列 %+d 整 数 型 の 引 数 に 符 号 を 付 与 して 出 力 します ( 例 -3) 記 述 int value = 123456; 6
pw.printf("データの 値 は %+d です ", value); 実 行 結 果 データの 値 は +123456 です (4) 書 式 文 字 列 %,d 整 数 型 の 引 数 をカンマ 付 きで 出 力 します ( 例 -4) 記 述 int population = 410341; pw.printf(" 藤 沢 市 の 人 口 は %,d 人 です ", population); 実 行 結 果 藤 沢 市 の 人 口 は 410,341 人 です 2.1.5 close()メソッドを 呼 び 出 して テキストファイルを 閉 じる PrintWriter の close()メソッドを 呼 び 出 して テキストファイルを 閉 じます close 宣 言 : public void close() 引 数 : なし 機 能 : PrintWriter を 閉 じます 戻 り 値 : なし 7
3 テキストファイル 書 き 込 みプログラムを 作 成 Java 入 門 5 では これまでの 内 容 を 元 に テキストファイル 読 み 込 みプログラムを 作 成 しましょう 本 テキストに 基 づいて 先 に 作 成 したサンプルの jp.lites.study.java パッケージが 残 ってい る 場 合 は パッケージ 作 成 までの 作 業 をスキップしてください 3.1 プログラムの 概 要 以 下 のようなプログラムを 作 ってみましょう 出 力 内 容 はお 好 きなように 書 いてみてくださ い プロジェクト 名 : java_05 パッケージ 名 : jp.lites.study.java クラス 名 : WriteSample 出 力 するテキストファイルパス: c: tmp sample.txt 出 力 内 容 : Java 入 門 5 ファイルを 書 く サンプルプログラムです お 好 きなように 書 いてみてください 以 上 です 注 意 出 力 するテキストファイル 名 は すでに 存 在 しているファイルではないようにしましょう 思 いがけずに 重 要 なテキストファイルを 壊 してしまわないように 十 分 注 意 しまょう 3.2 ソースコード 例 ソースコード 例 を 示 します line 1 2 3 4 5 6 7 8 9 10 11 リスト 3-1 WriteSample.java WriteSample.java package jp.lites.study.java; import java.io.file; import java.io.filenotfoundexception; import java.io.ioexception; import java.io.printwriter; public class WriteSample { public static void main(string[] args) { 8
line 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 32 32 33 34 35 36 37 38 39 40 41 42 43 Java 入 門 5 WriteSample.java String filepath = "c:/tmp/sample.txt"; File file = new File(filePath); try { file.createnewfile(); PrintWriter pw = new PrintWriter(file); pw.println("java 入 門 5 ファイルを 書 く"); pw.println("サンプルプログラムです "); int population = 410341; pw.printf(" 藤 沢 市 の 人 口 は %,d 人 です n", population); pw.println(" 以 上 です "); pw.close(); System.out.println("ファイルを 作 成 しました "); catch (FileNotFoundException e) { System.out.println("ファイルを 生 成 できません "); e.printstacktrace(); catch (IOException e) { System.out.println("ファイルの 書 き 込 みでエラーが 発 生 しました "); e.printstacktrace(); 12 行 目 作 成 するテキストファイルのパスを "c:/tmp/sample.txt"とします 14 行 目 File インスタンスを 生 成 します 17 行 目 新 たにファイルを 生 成 します 9
19 行 目 file を 指 定 して PrintWriter インスタンスを 生 成 します 21~27 行 目 PrintWriter のメソッドを 使 用 して テキストを 書 き 出 します 29 行 目 PrintWriter を close します 33~39 行 目 例 外 をキャッチし メッセージを 表 示 します 3.3 eclipse でクラスを 作 成 上 記 のクラスを eclipse で 作 成 してください 作 成 したら 休 憩 しましょう 10
4 テキストファイル 読 み 込 みプログラムを 実 行 では 作 成 したプログラムを 実 行 して テキストファイルを 作 成 してみましょう Java 入 門 5 4.1 ディレクトリの 作 成 実 行 する 前 に 下 記 のディレクトリを 作 成 しておきましょう 作 成 ディレクトリ: c: tmp 4.2 実 行 eclipse での 実 行 結 果 の 例 を 示 します 図 4-1 WriteSample 実 行 結 果 作 成 されたテキストファイルを 見 てみましょう 図 に 例 を 示 します 図 4-2 作 成 されたテキストファイル 11
5 テキストファイルの 読 み 込 みと 書 き 込 み これまでに 作 成 したサンプルは 単 に 決 まりきった 文 字 列 をテキストファイルに 書 き 出 すだ けでした 実 際 には あるテキストファイルを 読 んで その 内 容 を 編 集 の 上 別 のファイルに 書 き 出 す ということがよくあります ここでは そのような 例 をやってみましょう テキストファイルを 読 むことと 書 くことの 基 礎 は 学 びました ここでは 文 字 列 の 編 集 に ついて 学 びましょう 5.1 String クラスのメソッド 文 字 列 を 扱 う 基 本 的 なクラスは String クラスです String クラスには じつにさまざまな メソッドがあります 次 に 主 なメソッドを 紹 介 します 5.1.1 文 字 列 の 比 較 二 つの 文 字 列 が 同 一 かどうかを 調 べるメソッドとして equals()メソッドがあります equals 宣 言 : public boolean equals(object anobject) 引 数 : anobject - String と 比 較 するオブジェクト( 通 常 は String オブジェクトを 指 定 します) 機 能 : String オブジェクト(の 文 字 列 )と 指 定 されたオブジェクト(の 文 字 列 )を 比 較 し ます 戻 り 値 : true - String オブジェクトと 指 定 されたオブジェクトとが 同 じ 文 字 列 であ る 場 合 false - String オブジェクトと 指 定 されたオブジェクトとが 異 なる 文 字 列 であ る 場 合 記 述 例 を 示 します String line = null; String astring = " 終 了 "; line = breader.readline(); if ( astring.equals(line) ) { // 文 字 列 が 一 致 else { // 文 字 列 が 不 一 致 //テキストファイルから 読 み 込 んだ 行 データ 図 5-1 equals メソッドの 記 述 例 12
NOTE if ( astring == line ) ではだめなのでしょうか この 場 合 には astring と line 変 数 が 同 じオブジェクトを 参 照 しているかどうか を 判 断 します ですから astring と line の 文 字 列 が 同 じであっても 別 のオブジェクトを 示 してい ますから false になってしまいます ケース A astring == line -----> true astring.eauals(line) -----> true astring String オブジェクト " 終 了 " line ケース B astring == line -----> false astring.eauals(line) -----> true astring line String オブジェクト " 終 了 " " 終 了 " ケース C astring == line -----> false astring.eauals(line) -----> false astring line String オブジェクト " 終 了 " "Java 入 門 " 図 5-2 == と equals の 違 い 5.1.2 文 字 列 の 検 索 String オブジェクトが 持 つ 文 字 列 の 中 から 指 定 の 文 字 / 文 字 列 を 検 索 するメソッドがい くつかあります startswith 宣 言 : public boolean startswith(string prefix) 引 数 : prefix - 検 索 する 文 字 列 を 指 定 します 機 能 : String オブジェクト(の 文 字 列 )が 指 定 された 文 字 列 で 始 まるかどうかを 判 定 します 戻 り 値 : true - String オブジェクト(の 文 字 列 )が 指 定 された 文 字 列 で 始 まる 場 合 false - String オブジェクト(の 文 字 列 )が 指 定 された 文 字 列 で 始 まらない 場 合 13
記 述 例 を 示 します String filepath = "c:/tmp/sample.txt"; if (filepath.startswith("c:")) { System.out.println("c ドライブです "); else { System.out.println("c ドライブではありません "); 図 5-3 startswith メソッドの 記 述 例 endswith 宣 言 : public boolean endswith(string suffix) 引 数 : suffix - 検 索 する 文 字 列 を 指 定 します 機 能 : String オブジェクト(の 文 字 列 )が 指 定 された 文 字 列 で 終 了 するかどうかを 判 定 します 戻 り 値 : true - String オブジェクト(の 文 字 列 )が 指 定 された 文 字 列 で 終 了 する 場 合 false - String オブジェクト(の 文 字 列 )が 指 定 された 文 字 列 で 終 了 しない 場 合 記 述 例 を 示 します String filepath = "c:/tmp/sample.txt"; if (filepath.endswith(".txt")) { System.out.println("テキストファイルです "); else { System.out.println("テキストファイルではありません "); 図 5-4 endswith メソッドの 記 述 例 contains 宣 言 : public boolean contains(charsequence s) 引 数 : s - 検 索 する 文 字 列 (を 持 つオブジェクト)を 指 定 します 機 能 : String オブジェクト(の 文 字 列 )が 指 定 された 文 字 列 を 含 むかどうかを 判 定 し ます 戻 り 値 : true - String オブジェクト(の 文 字 列 )が 指 定 された 文 字 列 を 含 む 場 合 false - String オブジェクト(の 文 字 列 )が 指 定 された 文 字 列 を 含 まない 場 合 例 外 : NullPointerException - s が null の 場 合 NOTE CharSequence は 具 体 的 には String などです 14
記 述 例 を 示 します String address = " 神 奈 川 県 藤 沢 市 藤 沢 1-1"; if (address.contains(" 藤 沢 市 ")) { System.out.println(" 藤 沢 市 です "); else { System.out.println(" 藤 沢 市 ではありません "); 図 5-5 contains メソッドの 記 述 例 indexof 宣 言 : public int indexof(string str) 引 数 : str - 検 索 する 文 字 列 を 指 定 します 機 能 : String オブジェクト(の 文 字 列 )が 指 定 された 部 分 文 字 列 が 最 初 に 出 現 する 位 置 のインデックスを 返 します 戻 り 値 : インデックス 値 - 引 数 で 指 定 した 文 字 列 がこの String オブジェクト 内 にあ る 場 合 は 最 初 の 部 分 文 字 列 の 最 初 の 文 字 のインデックス -1 - String オブジェクト(の 文 字 列 )が 指 定 された 文 字 列 を 含 まない 場 合 NOTE ( 文 字 列 の)インデックスは 文 字 列 内 の 各 文 字 の 位 置 を 示 し 0 から 始 まる 値 で す この indexof()メソッドで 取 得 したインデックスを 使 って 後 述 の substring()メソッドを 使 って 文 字 列 を 抽 出 することができます 記 述 例 と 実 行 結 果 例 を 示 します String address = " 神 奈 川 県 藤 沢 市 藤 沢 1-1"; int index = address.indexof(" 藤 沢 "); if (index > 0) { System.out.println(" 最 初 の " 藤 沢 "のインデックス = " + index ); else { System.out.println(" " 藤 沢 "を 含 みません "); 実 行 結 果 例 最 初 の" 藤 沢 "のインデックス = 4 図 5-6 indexof メソッドの 記 述 例 NOTE 文 字 列 内 に "(ダブルコーテーション) を 含 めたいときには " と 書 きます 15
lastindexof 宣 言 : public int lastindexof(string str) 引 数 : str - 検 索 する 文 字 列 を 指 定 します 機 能 : String オブジェクト(の 文 字 列 )が 指 定 された 部 分 文 字 列 が 最 後 に 出 現 する 位 置 のインデックスを 返 します 戻 り 値 : インデックス 値 - 引 数 で 指 定 した 文 字 列 がこの String オブジェクト 内 にあ る 場 合 は 最 後 の 部 分 文 字 列 の 最 初 の 文 字 のインデックス -1 - String オブジェクト(の 文 字 列 )が 指 定 された 文 字 列 を 含 まない 場 合 NOTE ( 文 字 列 の)インデックスは 文 字 列 内 の 各 文 字 の 位 置 を 示 し 0 から 始 まる 値 で す この indexof()メソッドで 取 得 したインデックスを 使 って 何 をするかは 後 で 学 びます 記 述 例 を 示 します String address = " 神 奈 川 県 藤 沢 市 藤 沢 1-1"; int index = address.lastindexof(" 藤 沢 "); if (index > 0) { System.out.println(" 最 後 の " 藤 沢 "のインデックス = " + index ); else { System.out.println(" " 藤 沢 "を 含 みません "); 実 行 結 果 例 最 後 の" 藤 沢 "のインデックス = 7 図 5-7 lastindexof メソッドの 記 述 例 NOTE ここで 示 した 文 字 列 のインデックスを 図 で 確 認 しておきましょう 文 字 列 インデックス 神 奈 川 県 藤 沢 市 藤 沢 1-1 0 1 2 3 4 5 6 7 8 9 10 11 最 初 の" 藤 沢 "のインデックス = 4 最 後 の" 藤 沢 "のインデックス = 7 図 5-8 文 字 列 のインデックス 16
5.1.3 文 字 列 の 抽 出 編 集 String オブジェクトが 持 つ 文 字 列 の 中 から 文 字 列 を 抽 出 したり 文 字 列 を 編 集 するメソ ッドもあります concat 宣 言 : public String concat(string str) 引 数 : str - 文 字 列 を 指 定 します 機 能 : String オブジェクト(の 文 字 列 )の 最 後 に 指 定 された 文 字 列 を 連 結 します 戻 り 値 : String- 連 結 した 文 字 列 を 表 す 新 しい String オブジェクト 記 述 例 と 実 行 結 果 例 を 示 します String title = " 住 所 : "; String address = " 神 奈 川 県 藤 沢 市 藤 沢 1-1"; System.out.println( title.concat(address) ); 実 行 結 果 例 住 所 : 神 奈 川 県 藤 沢 市 藤 沢 1-1 図 5-9 concat メソッドの 記 述 例 trim 宣 言 : public String trim() 引 数 : なし 機 能 : String オブジェクト(の 文 字 列 )の 先 頭 と 最 後 の 空 白 を 省 略 した 文 字 列 を 生 成 し ます 戻 り 値 : String- 先 頭 と 最 後 の 空 白 を 省 略 した 文 字 列 を 表 す 新 しい String オブジェ クト 記 述 例 と 実 行 結 果 例 を 示 します String address = " 神 奈 川 県 藤 沢 市 藤 沢 1-1 "; System.out.println(" 住 所 は" + address + "です "); System.out.println(" 住 所 は" + address.trim() + "です "); 実 行 結 果 例 住 所 は 神 奈 川 県 藤 沢 市 藤 沢 1-1 です 住 所 は 神 奈 川 県 藤 沢 市 藤 沢 1-1 です 図 5-10 trim メソッドの 記 述 例 17
substring 宣 言 : public String substring(int beginindex) 引 数 : beginindex - 開 始 インデックス 機 能 : String オブジェクト(の 文 字 列 )の 指 定 されたインデックスで 始 まり この 文 字 列 の 最 後 までの 文 字 列 を 生 成 します 戻 り 値 : 部 分 文 字 列 を 表 す 新 しい String オブジェクト 記 述 例 と 実 行 結 果 例 を 示 します たとえば 開 始 インデックスに 先 の indexof()メソッ ドで 取 得 したインデックスを 使 うことができます String address = " 神 奈 川 県 藤 沢 市 藤 沢 1-1"; int index = address.indexof(" 藤 沢 市 "); if (index > 0) { System.out.println(" 住 所 は 市 内 " + address.substring(index + 3) + "です "); else { System.out.println(" 住 所 は 市 内 ではありません "); 実 行 結 果 例 住 所 は 市 内 藤 沢 1-1 です 図 5-11 substring メソッドの 記 述 例 split 宣 言 : public String[] split(string regex) 引 数 : regex - 区 切 り 文 字 / 文 字 列 の 正 規 表 現 機 能 : String オブジェクト(の 文 字 列 ) を 指 定 された 正 規 表 現 に 一 致 する 位 置 で 分 割 します 戻 り 値 : String オブジェクト(の 文 字 列 )を 指 定 された 正 規 表 現 に 一 致 する 位 置 で 分 割 された 文 字 列 の 配 列 例 外 : PatternSyntaxException - 正 規 表 現 の 構 文 が 無 効 な 場 合 記 述 例 と 実 行 結 果 の 例 を 見 る 前 に ここで 示 されている 正 規 表 現 について 簡 単 に 学 んでおきましょう 18
5.1.3.1 正 規 表 現 の 概 要 正 規 表 現 とは いくつかの 文 字 列 の 集 まりを 一 つの 文 字 列 形 式 で 表 現 するための 方 法 で す 特 に 文 字 列 の 中 から 部 分 文 字 列 を 検 索 する 場 合 によく 用 いられます たとえば 次 の 文 字 列 を 見 てください no, name, tel, mail 100011, K.Sato, 090-9876-5432, sato@east.lites.jp 100023, S.Tanaka, 090-1234-5678, tanaka@west.lites.jp 100052, H.Watanabe, 03-111-9876, watanabe@mid.lites.jp これらは 従 業 員 番 号 氏 名 電 話 番 号 メールアドレスのデータと 考 えましょう こ れらの 文 字 列 データの 中 から 氏 名 だけを 見 つけるとか メールアドレスだけを 見 つけ るような 場 合 検 索 文 字 列 をどう 表 現 したらよいでしょうか そのような 場 合 見 つけたい 文 字 列 がどんな 文 字 で 構 成 されているか という 点 に 着 目 して その 文 字 列 のパターンのようなものを 表 現 できたら 便 利 ですね たとえば 次 のようなパターンで 区 別 できないでしょうか (1) 従 業 員 番 号 は 数 字 だけで 構 成 されて しかも 6 桁 と 決 まっている (2) 氏 名 は 英 文 字 "."(ドット) 英 文 字 の 順 に 構 成 されている (3) 電 話 番 号 は 数 字 と "-"(ハイフン)で 構 成 されている (4) メールアドレスは 英 文 字 列 と"."(ドット)が"@"(アットマーク)でつながっている まずは よく 使 われる 基 本 的 な 文 字 のパターンを 見 ておきましょう これらのパターン を 構 成 する 要 素 として メタキャラクタ が 用 意 されています メタキャラクタ は 文 字 や 数 字 の 種 類 文 字 の 位 置 文 字 数 などを 表 現 するための 特 殊 な 文 字 列 です 代 表 的 なメタキャラクタを 表 に 示 します 表 5-1 文 字 や 数 字 の 種 類 を 示 すメタキャラクタ メタキャラクタ 意 味 d 数 字 1 文 字 s 任 意 の 空 白 文 字 (スペース タブ 改 行 復 帰 )1 文 字 w 任 意 の 英 数 字 と_(アンダースコア: underscore) 1 文 字 [ 文 字 セット] 文 字 セットのいずれかの 文 字 1 文 字 文 字 セットを 使 った 例 [0-9] 数 字 0-9 の 任 意 1 文 字 [a-z] 英 小 文 字 a-z の 任 意 1 文 字 [A-Z] 英 大 文 字 A から Z の 任 意 1 文 字 [ABC] A, B, C いずれかの 文 字 1 文 字 19
表 5-2 メタキャラクタ ^ 行 頭 $ 行 末 文 字 の 位 置 を 示 すメタキャラクタ 意 味 ( 例 ) ^a 行 頭 の a z$ 行 末 の z 表 5-3 文 字 数 を 示 すメタキャラクタ メタキャラクタ 意 味 * 直 前 の 文 字 が 0 個 以 上 + 直 前 の 文 字 が 1 個 以 上? 直 前 の 文 字 が 0 個 か 1 個 {n 直 前 の 文 字 が n 個 文 字 や 数 字 の 種 類 を 示 すメタキャラクタの 直 後 に 文 字 数 を 示 すメタキャラクタを 使 用 し ます ( 例 ) [a-za-z]+ 1 文 字 以 上 の 英 字 [0-9]{7 7 桁 の 数 字 さて 上 の 例 に 戻 りましょう パターンの 例 を 考 えてみましょう あくまでも 例 ですの で 次 に 示 したパターン 以 外 も 考 えられます (1) 従 業 員 番 号 は 数 字 だけで 構 成 されて しかも 6 桁 と 決 まっている パターン: [0-9]{6 (2) 氏 名 は 英 文 字 "."(ドット) 英 文 字 の 順 に 構 成 されている パターン: [a-za-z]+.[a-za-z]+ (3) 電 話 番 号 は 数 字 と "-"(ハイフン)で 構 成 されている [0-9]+-[0-9]+-[0-9]+ (4) メールアドレスは 英 文 字 列 と"."(ドット)が"@"(アットマーク)でつながっている [a-za-z]+@[a-za-z.]+ 正 規 表 現 はなかなか 奥 深 く それだけで 一 冊 の 本 になるほどですが 実 用 面 では 比 較 的 簡 単 なパターンの 使 用 で 問 題 が 解 決 することが 多 いので あまり 深 刻 にならずとも 良 20
いと 思 います さて split()メソッドに 戻 り spilit()メソッドの 記 述 例 と 実 行 例 を 見 てみましょう この 例 では 引 数 に ","(カンマ)を 指 定 していますので 図 のように String 配 列 が 生 成 さ れます String data = " no,name,tel,mail"; String[] tokens = data.split(","); for (int i = 0; i < tokens.length;i++) { System.out.println("token[" + i + "] = " + tokens[i]); 実 行 結 果 例 token[0] = no token[1] = name token[2] = tel token[3] = mail tokens tokens[0] tokens[1] tokens[2] tokens[3] "no" "name" "tel" "mail" 図 5-12 split メソッドの 記 述 例 さんざん 正 規 表 現 のことを 言 っておきながら split()メソッドの 記 述 例 と 実 行 例 は 実 に 簡 単 で 正 規 表 現 を 使 っていません でも このような 例 は CSV ファイルの 処 理 など には 有 効 ですので ご 容 赦 ください NOTE CSV ファイルは Comma Separated Value ファイルの 略 です ","(カンマ)でデータを 区 切 って 記 述 するルールがあります 詳 しくは http://www.rfc-editor.org/rfc/rfc4180.txt を 参 照 してください 代 表 的 な 例 として Excel データを CSV 形 式 ファイルに 変 換 して 他 のアプリケーションで 利 用 するケースがあります 21
6 テキストファイルの 読 み 込 みと 編 集 出 力 これまでの 学 習 で テキストファイルの 読 み 込 み 書 き 込 み そして String クラスの 各 種 メ ソッドなどについて 学 びました この 章 では これまで 学 んだことをベースに 次 のような 演 習 をやってみましょう 演 習 課 題 テキストファイルを 読 み 各 行 のデータの 先 頭 に 行 番 号 を 追 加 して 別 のテキ ストファイルとして 書 き 出 すプログラムを 作 成 実 行 してください ( 例 ) 元 のテキストファイル テキストファイルです This is the sample text file. end of the file. 出 力 されるテキストファイル 1: テキストファイルです 2: This is the sample text file. 3: end of the file. 6.1 クラス 構 成 まず クラス 構 成 を 考 えます 読 み 出 すテキストファイルを 扱 うためのクラスと 書 き 出 す テキストファイルを 扱 うクラスが 必 要 ですね それと 行 を 編 集 するためのメソッドがどこ かに 必 要 です 今 回 は 制 御 を 担 当 する main()メソッドを 持 つクラスに 含 ませましょう 図 に この 演 習 課 題 のクラス 構 成 を 示 します - String filepath TextFileReader SampleFileConverter + TextFileReader(String filepath) + readline(): boolean + close(): void + iserroroccurred() + main(string[] args): void - addlineno(string line): String - String filepath TextFileWriter + TextFileWriter(String filepath) + write(): void + close(): void + iserroroccurred() 図 6-1 演 習 課 題 のクラス 構 成 ( 概 要 ) 図 を 見 て だいたいのイメージはつかめますね 22
(1) SampleFileConverter クラスの addlineno()メソッド 宣 言 : public String addkineno(string line) 引 数 : line - 1 行 分 の 文 字 列 を 持 つ String オブジェクト 機 能 : 指 定 された String オブジェクト(の 文 字 列 ) の 先 頭 に 行 番 号 を 追 加 します 戻 り 値 : 先 頭 に 行 番 号 を 追 加 された 文 字 列 を 持 つ String オブジェクト (2) TextFileReader と TextFileWriter のコンストラクタ TextFileReader と TextFileWriter のコンストラクタでは それぞれ 指 定 されたファイ ルの 読 み 出 し 書 き 出 しのための 準 備 を 行 います この 際 に IOException などの 例 外 が 発 生 することがあります コンストラクタでは 戻 り 値 を 返 せませんので コール 元 (ここでは SampleFileConverter)が コンストラクタ でエラーが 発 生 したかどうかを (このままでは)すぐには 判 断 できません 対 策 として 次 のようなことが 考 えられます 案 -1) 例 外 発 生 で stacktrace してプログラムを 終 わらせる つまり 何 らの 対 処 もしな い 方 法 です 案 -2) コンストラクタでエラーを 再 スローし SampleFileConverter でキャッチする ただし この 方 法 についてはまだ 学 んでいませんね 案 -3) TextFileReader と TextFileWriter にエラーが 発 生 したことを 示 す 属 性 をもたせ コール 元 (ここでは SampleFileConverter)から 問 い 合 わせるこどできるメソッド を 用 意 する 案 -4) TextFileReader と TextFileWriter にエラーが 発 生 したことを 示 す 属 性 をもたせ readline() write()でエラーを 返 す ここでは 案 -3) を 採 用 しています その 他 不 都 合 があったらクラスのメソッドやメンバー 変 数 を 変 更 追 加 しましょう 6.2 ソースコード まずは SampleFileConverter のソースコードを 書 いてみましょう line 1 2 3 4 5 6 7 リスト 6-1 SampleFileConverter.java SampleFileConverter.java package jp.lites.study.java; public class SampleFileConverter { static int lineno = 0; public static void main(string[] args) { 23
line 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 32 32 33 34 35 36 37 38 39 40 41 Java 入 門 5 SampleFileConverter.java String inputfilepath = "d:/tmp/nosample.txt"; String outputfilepath = "d:/tmp/outsample.txt"; TextFileReader inputfile = new TextFileReader(inputFilePath); if (inputfile.iserroroccurred()) { System.out.println(" 入 力 ファイルにエラーがあったのでファイル 変 換 を 中 止 しました "); return; TextFileWriter outputfile = new TextFileWriter(outputFilePath); if (outputfile.iserroroccurred()) { System.out.println(" 出 力 ファイルにエラーがあったのでファイル 変 換 を 中 止 しました "); return; String line = null; while ((line = inputfile.readline())!= null) { line = addlineno(line); outputfile.write(line); inputfile.close(); outputfile.close(); System.out.println("ファイルを 変 換 しました "); private static String addlineno(string str) { String no = String.format("%d: ", ++lineno); return no.concat(str); 37 行 目 String にも format()メソッドがあります 24
line 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 32 32 33 34 35 36 リスト 6-2 TextFileReader.java TextFileReader.java package jp.lites.study.java; import java.io.file; import java.io.filenotfoundexception; import java.io.filereader; import java.io.bufferedreader; import java.io.ioexception; public class TextFileReader { private boolean error = true; private String filepath = ""; private File file = null; private FileReader filereader = null; private BufferedReader breader = null; public TextFileReader(String filepath) { this.filepath = filepath; file = new File(this.filePath); try { filereader = new FileReader(file); breader = new BufferedReader(fileReader); error = false; catch (FileNotFoundException e) { System.out.println(" 指 定 されたファイルが 見 つかりません "); public String readline() { String line = null;; try { line= breader.readline(); 25
line 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 Java 入 門 5 TextFileReader.java return line; catch (IOException e) { System.out.println("ファイル 読 み 込 みでエラーが 発 生 しました "); return null; public void close() { String line = null;; try { breader.close(); catch (IOException e) { System.out.println("ファイルクローズでエラーが 発 生 しました "); public boolean iserroroccurred() { return error; line 1 2 3 4 5 6 7 8 9 リスト 6-3 TextFileWriter.java TextFileWriter.java package jp.lites.study.java; import java.io.bufferedreader; import java.io.file; import java.io.filenotfoundexception; import java.io.filereader; import java.io.ioexception; import java.io.printwriter; 26
line 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 32 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 TextFileWriter.java public class TextFileWriter { private boolean error = true; private String filepath = ""; private File file = null; private PrintWriter pw = null; public TextFileWriter(String filepath) { this.filepath = filepath; file = new File(this.filePath); try { file.createnewfile(); pw = new PrintWriter(file); error = false; catch (FileNotFoundException e) { System.out.println("ファイル 作 成 できませんでした "); catch (IOException e) { System.out.println("ファイル 作 成 でエラーが 発 生 しました "); public void write(string line) { pw.println(line); public void close() { pw.close(); public boolean iserroroccurred() { return error; 27
6.3 eclipse でクラスを 作 成 実 行 上 記 のクラスを eclipse で 作 成 実 行 してください 実 行 結 果 の 例 を 示 します 図 6-2 SampleFileConverter 実 行 結 果 の 例 28
7 演 習 7.1 CSV ファイルの 読 み 込 みと 編 集 出 力 下 記 の CSV ファイルを 読 み 込 んで 名 前 メールアドレスを 抽 出 して 指 定 の CSV 形 式 で ファイルに 出 力 するプログラムを 作 成 実 行 してください (1) CSV ファイルの 形 式 メンバー 番 号, 名 前, 住 所, 電 話 番 号,メールアドレス, 備 考 (2) 出 力 CSV 形 式 名 前,メールアドレス 7.2 2 つの CSV ファイルの 読 み 込 みと 編 集 出 力 7.1 の 演 習 で 出 力 CSV 形 式 を 示 した CSV ファイルを 読 んで 出 力 CSV 形 式 を 決 定 するよ うに 変 更 してください (1) CSV ファイルの 形 式 メンバー 番 号, 名 前, 住 所, 電 話 番 号,メールアドレス, 備 考 (2) 出 力 CSV 形 式 を 示 した CSV ファイル 名 前,メールアドレス 29
8 付 録 8.1 TBD. 30
9 改 定 履 歴 (1) 2010/09/23 K.Yanai ドラフト 作 成 31
10 索 引 32