0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

JavaのScannerクラスを使ってファイルの読み込みを行なった件

Last updated at Posted at 2019-04-28

#注意
私はQiitaで文章を書くことが初めてです。加えてひよっこ大学生であるので間違いが含まれている可能性が大いにあることを考慮して読んでいただけるとありがたいです。

#はじめに
この記事はJavaに標準搭載されているScannerクラスについて自分用にまとめるものである。この記事を書くにあったっての経緯としては→仕様書でScannerクラスを使って作れと言われた。→そんなん知らん。→一応できた。→忘れないようにどこかにメモっとくか。という感じである。ちなみに筆者は普段BufferedReaderFileReaderを使用している。(こっちでええやろ...)

#ファイルを読み込み

FileReader
        try {
            Scanner scanner = new Scanner (new File ("sourceFileName"/*ここに読み込みたいファイル名(場合によってはパスも必要)*/));
        } catch (FileNotFoundException e) { // 例外
            // ファイルが存在しないときの処理
            e.printStackTrace();
        }

とりあえずファイルを読み込む部分。オブジェクト生成の際Fileクラスのオブジェクトを引数としてブチ込む。Fileクラスはファイルパスを引数としてオブジェクト生成するとそのファイル情報を保持してくれる。便利。コンストラクタでやるといいと思う。

#Scannerから一行ずつ読み込む

ReadLine
        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から一文字ずつ読み込む

ReadChar
        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ドキュメント(英語の方)を読もう!

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?