#注意
私はQiitaで文章を書くことが初めてです。加えてひよっこ大学生であるので間違いが含まれている可能性が大いにあることを考慮して読んでいただけるとありがたいです。
#はじめに
この記事はJavaに標準搭載されているScannerクラスについて自分用にまとめるものである。この記事を書くにあったっての経緯としては→仕様書でScannerクラスを使って作れと言われた。→そんなん知らん。→一応できた。→忘れないようにどこかにメモっとくか。という感じである。ちなみに筆者は普段BufferedReaderかFileReaderを使用している。(こっちでええやろ...)
#ファイルを読み込み
try {
Scanner scanner = new Scanner (new File ("sourceFileName"/*ここに読み込みたいファイル名(場合によってはパスも必要)*/));
} catch (FileNotFoundException e) { // 例外
// ファイルが存在しないときの処理
e.printStackTrace();
}
とりあえずファイルを読み込む部分。オブジェクト生成の際Fileクラスのオブジェクトを引数としてブチ込む。Fileクラスはファイルパスを引数としてオブジェクト生成するとそのファイル情報を保持してくれる。便利。コンストラクタでやるといいと思う。
#Scannerから一行ずつ読み込む
try {
//ファイルに未読部分が有るとき
if (scanner.hasNextLine()) {
line = scanner.nextLine() + '\n';
//無いとき
} else {
line = null;
}
//読み込みエラー
} catch (IllegalStateException e) {
e.printStackTrace();
closeFile();
System.exit (1);
}
メソッド名 | 動作 |
---|---|
hasNextLine() | スキャナに次の行がある場合はtrueを返す |
nextLine() | スキャナを先に進めて、行を返す |
lineはString型の変数で今回はフィールドとして保持している。このlineを出力すれば無事ファイルの中身が出力される。"\n"を追加しているのは出力用である。main文で改行してもいいと思う。
#Scannerから一文字ずつ読み込む
current = next;
if (next == '\0') {
//ファイル末なら共通動作だけ
} else if (next == '\n') {
//行末
readLine();
if (line != null) {
//読んだ行がnullでない
next = line.charAt (0);
number = 0;
} else {
//読んだ行がnull(ファイル末)の場合
next = '\0'; //'\0'はファイル末を表す
}
} else {
//ファイル末でも行末でもない場合,
next = line.charAt (++number);
}
return current;
変数名 | 動作 |
---|---|
current | 読み込んでいる行 |
next | 次に読み込む行 |
number | 現在の文字数 |
上述のreadLineを使用して作ってみた。動作的には一行ずつ読み込んだものを一文字ずつ切り取っていく。正直無茶苦茶だが仕様書がこうなっているのだから仕様が無い。
#最後に
とりあえず動くようには作ってみた。あとはwhile文等で出力するだけである。結論としてはめんどくさい。それに限る。同じような状況に陥った未来の学生たちが苦労しないことを祈るばかりである。
困ったらまず公式のAPIドキュメント(英語の方)を読もう!