Scannerクラス – エンジニアの入り口 https://eng-entrance.com 「エンジニアの入り口」は、プログラミング入門やエンジニアリング入門の知識が満載の初心者のための勉強サイトです。プログラミングやサーバ、ネットワークの基礎知識や勉強方法を習得できます。 Thu, 02 Mar 2017 09:02:00 +0000 ja hourly 1 https://wordpress.org/?v=5.2.19 【初心者でもすぐわかる】Javaでファイルを読み込む方法 https://eng-entrance.com/java-scanner-file https://eng-entrance.com/java-scanner-file#respond Mon, 24 Oct 2016 03:16:14 +0000 http://eng-entrance.com/?p=3131 Javaでプログラムを書いているとき、ファイルを読み込みを実行したいということはよくある。

CSVデータやテキストデータなどを使って、プログラムを動かしたいこともあるだろう。このページではJavaでファイルを読み込むための方法をサンプルプログラム付きで解説した。参考にしていただければと思う。

Javaでファイルから読み込みをする方法

Javaでファイルからデータを読み込むとき、Scannerクラスを使っていく。

一般的にはScannerクラスはキーボードから読み込むためのもののように思われがちだが、キーボードからでなくファイルからも入力値を読み取ることができる。実際にScannerクラスが多く使われる場面がこのファイルからの読み取りだ。よく覚えておきたい使い方だ。

それではファイルから読み込むScannerクラスの使い方をサンプルプログラムで見てみよう。

ファイル読み込みのサンプルプログラム

import java.util.Scanner;
import java.io.File;
import java.io.FileNotFoundException;

class sampleA {
    public static void main(String args[]) {
        try {
            Scanner scanner = new Scanner(new File("file.txt"));     //・・・①
            System.out.println("ファイルを読み込みました。");
            while(scanner.hasNext()) {    //・・・②
                String string = scanner.next();    //・・・③
                System.out.println(string);
            }
            System.out.println("ファイルの中身を出力しました。");
        } catch (FileNotFoundException e) {    //・・・④
            System.out.println("ファイルが存在しませんでした。");
        }
    }
} 

まず、①でScannerクラスを初期化し、読み込むファイルを指定する。今回のサンプルプログラムは「file.txt」というファイルを読み込むように指定している。

Scanner scanner = new Scanner(new File("file.txt"));

次に②でScannerクラスで読み取ったファイルの中身をwhile文で hasNextメソッドを使って、読み取った中身がある間ループして、③のnextメソッドで1行読み取って出力を行う。区切り文字を指定していないので、改行が区切り文字となるため、1行読み取って出力といった処理の流れになっている。

while(scanner.hasNext())

String string = scanner.next();

そして④でファイル読み込みのため、try catchで例外処理をする必要がある。ファイルが存在しない場合を考えてtry catch文を書かないとコンパイルエラーになるので注意が必要だ。

catch (FileNotFoundException e) 

③は「file.txt」の中身が以下のような場合、

あいうえお
かきくけこ
さしすせそ

ampleAクラスを実行すると、実行結果は以下のようになる。

ファイルを読み込みました。
あいうえお
かきくけこ
さしすせそ
ファイルの中身を出力しました。

CSVファイルの読み込み

ファイルを読み込む処理ではカンマ区切りのCSVファイルを読み込むことが多い。Scannerクラスでは区切り文字を指定してファイルを読み込むことができるので、CSVファイルの読み込みにはもってこいのクラスだ。

では、区切り文字にカンマを指定して読み込む処理を見てみよう。

import java.util.Scanner;
import java.io.File;
import java.io.FileNotFoundException;

class sampleB {
    public static void main(String args[]) {
        try {
            Scanner scanner = new Scanner(new File("file.csv"));
            scanner.useDelimiter(",");     //・・・①
            System.out.println("ファイルを読み込みました。");
            while(scanner.hasNext()) {
                String string = scanner.next(); 
                System.out.println(string);
            }
            System.out.println("ファイルの中身を出力しました。");
        } catch (FileNotFoundException e) {
            System.out.println("ファイルが存在しませんでした。");
        }
    }
}

先ほどのサンプルプログラムに1行追加して、区切り文字にカンマ「,」を指定することで、CSVファイルを読み込むことができる。

scanner.useDelimiter(",");

「file.csv」の中身が以下のような場合、

あいうえお,かきくけこ,さしすせそ

ampleBクラスを実行すると、実行結果は以下のようになる。

ファイルを読み込みました。
あいうえお
かきくけこ
さしすせそ
ファイルの中身を出力しました。

まとめ

このページではJavaでCSVなどのファイルを読み込む方法についてお伝えした。Scannerクラスを使うことで実現出来る。

ファイルの読み込みは活躍場面が多いため、ぜひ使い方を覚えてしまおう。

]]>
https://eng-entrance.com/java-scanner-file/feed 0
【JavaのScannerクラス】読み込み時の区切り文字を変更する方法 https://eng-entrance.com/java-scanner-delimiter https://eng-entrance.com/java-scanner-delimiter#respond Sun, 23 Oct 2016 01:08:18 +0000 http://eng-entrance.com/?p=3128 Javaでキーボードやファイルから入力をするときには、Scannerクラスを使う。

このときに、区切りの文字を変えてインポートしたいということはよくある。例えば、csvファイルを一括で読み込みたいときなどだ。

このページでは、区切り文字を変更する方法についてお伝えしよう。

Scannerクラスの区切り文字

デフォルトは空白区切り

Scannerクラスでは読み取るときに区切り文字を指定することができる。

以下のプログラムを実行してみるとわかるが、デフォルトでは空白と改行で区切るようになっている。

import java.util.Scanner;
class sampleA {
  public static void main(String args[]) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("何か入力してください。");
        String string = scanner.next();
        System.out.println("入力した文字列は " + string + " です。");
        string = scanner.next();
        System.out.println("入力した文字列は " + string + " です。");
  }
}

 sampleAクラスを実行して、「あいうえお かきくけこ」と入力して、改行した場合の実行結果は以下のようになる。

何か入力してください。
あいうえお かきくけこ
入力した文字列は あいうえお です。
入力した文字列は かきくけこ です。

この実行結果から区切り文字がデフォルトでは空白と改行になっていることがわかる。

もちろん、Scannerクラスではこの区切り文字を自由に変更することができる。 

区切り文字の変更

区切り文字を指定した以下のプログラムをみていこう。区切り文字には「,」と改行を指定するようにした。「,」で区切ることはCSVファイルなどでよく使われるので是非覚えておきたい。

import java.util.Scanner;
class sampleB {
  public static void main(String args[]) {
        Scanner scanner = new Scanner(System.in);
        scanner.useDelimiter(",|¥n");	//・・・①
        System.out.println("何か入力してください。");
        String string = scanner.next();
        System.out.println("入力した文字列は " + string + " です。");
        string = scanner.next();
        System.out.println("入力した文字列は " + string + " です。");
  }
}

区切り文字を指定するのは簡単だ。①のように Scannerクラスの「useDelimiter」メソッドを使い、区切り文字を指定するだけだ。 useDelimiterメソッドの使い方は簡単だが、指定する文字列については少し複雑だ。

一文字だけを指定する場合は単純に区切りたい文字を指定するだけなので、例えば「,」とだけ指定すればよいが、複数の文字を指定したい場合などは正規表現で書かなければならない。

正規表現は他にも色々な書き方があり、例えば「[a-z]」と書けばそれだけでaからzまでの文字を表していて、「[a-z]」を区切り文字に指定すればaからzの文字のどれを入力されても区切り文字として実行できる。

正規表現はプログラムではよく使う文字列マッチングの表記方法なので時間があるときに是非覚えたい。

今回区切り文字に指定したのは「,|¥n」で、この一文で「,」または改行を意味している。正規表現で「|」は、「〜または〜」の場合に使う。「¥n」は改行を意味する。

scanner.useDelimiter(",|¥n"); 

sampleBクラスを実行して、「あいうえお,かきくけこ」と入力して、改行した場合の実行結果は以下のようになる。

何か入力してください。
あいうえお,かきくけこ
入力した文字列は あいうえお です。
入力した文字列は かきくけこ です。

まとめ

このページでは、Scannerクラスでテキストなどのデータを読み込むときの区切り文字変更方法についてお伝えした。

CSVの読み込みなど、既存データのインポートなどに役立てていただければと思う。

]]>
https://eng-entrance.com/java-scanner-delimiter/feed 0
【Java】指定した型の値でキーボード入力を読み込む方法 https://eng-entrance.com/java-scanner-type https://eng-entrance.com/java-scanner-type#comments Sat, 22 Oct 2016 02:58:05 +0000 http://eng-entrance.com/?p=3121 Javaでキーボード入力を読み取るときScannerクラスを利用する。

しかし、通常使うnextメソッドを使うとすべて文字列として認識してしまう。このページでは、キーボード入力の型を指定する方法についてお伝えした。

特定の型のみ読み込む

Javaでキーボードから入力された文字や数字を読み取るには、Scannerクラスのnextメソッドを使う。

nextメソッドでは何を入力しても、例えば数値「123」と入力しても、全てを文字列として認識して出力する。そのため、何を入力しても問題ないのだが、数値だけを入力したい場合などは困ってしまう。Scannerクラスにはそういった場合に数値だけを入力できるメソッドが用意されている。

数値型のnextIntメソッド

まず、入力された値を数値の型「int」として出力するScannerクラスのnextIntメソッドをみてみよう。 

import java.util.Scanner;
class sampleA {
  public static void main(String args[]) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("数値を入力してください。");
        int num = scanner.nextInt();	//・・・①
        System.out.println("入力した数値は " + num + " です。");
  }
}

①でnextIntメソッド使って読み込んだ値を変数numに保存している。nextメソッドを使うときと比べてみよう。nextメソッドを使うときは以下のように書く。

String num = scanner.next();

以下のnextIntを使うときとnextメソッドを使うときの違いは、まずメソッド名(nextとnextInt)の違いと読み込んだ値を格納する変数の型が違うという2点だ。nextIntを使うときは保存する変数の型をStringなどにするとコンパイルエラーになる。

int num = scanner.nextInt();

sampleAクラスを実行して、「1234567」と入力して、改行した場合の実行結果は以下のようになる。

数値を入力してください。
1234567
入力した数値は 1234567 です。

int以外のnext~メソッド

サンプルプログラムのsampleAクラスではint型のnextIntメソッドの処理を確認したが、Scannerクラスにはint型以外の型を指定できるメソッドが用意されている。

小数点の型のみを指定するnextDoubleメソッドや、trueかfalseのnextBooleanメソッドなど状況に応じて型を指定するものなどがある。

要するにそのまま書けばいい。  

型違いのエラーに注意

nextIntメソッドなど型を指定する読み込みは、int型の数値以外の値を入力されたときを考えてプログラミングしなければならない。先ほどのsampleAクラスを実行して「あいうえお」と入力してみよう。

すると以下のようなエラーになる。

数値を入力してください。
あいうえお
Exception in thread "main" java.util.InputMismatchException
     at java.util.Scanner.throwFor(Scanner.java:864)
     at java.util.Scanner.next(Scanner.java:1485)
     at java.util.Scanner.nextInt(Scanner.java:2117)
     at java.util.Scanner.nextInt(Scanner.java:2076)
     at sampleA.main(sampleA.java:6)

このエラーはsampleAクラスのnexIntメソッドで数値以外が入力されたので発生したエラーだ。このように指定した型以外が入力されるとエラーでプログラムが終了してしまうので、try catchでエラーが発生してもプログラムが終了しないようにしなければならない。

try catchを追加したのが以下のサンプルコードだ。

import java.util.Scanner;
import java.util.InputMismatchException;
class sampleB {
  public static void main(String args[]) {
        Scanner scanner = new Scanner(System.in);
        try {
        	System.out.println("数値を入力してください。");
        	int num = scanner.nextInt();
        	System.out.println("入力した数値は " + num + " です。");
        } catch (InputMismatchException e) {
        	System.out.println("数値以外が入力されました。");
        }
  }
}

sampleBクラスを実行して、「あいうえお」と入力して、改行した場合の実行結果は以下のようになる。

数値を入力してください。
あいうえお
数値以外が入力されました。

まとめ

このページではキーボード入力の際に、型を指定する方法についてお伝えしてきた。

Javaは厳密な言語なので、こういった指定にも方法が用意されている。数字などとして読み込みたいときのために認識しておこう。

]]>
https://eng-entrance.com/java-scanner-type/feed 1
サンプル付きですぐわかる!Javaでキーボード入力を読み取る方法 https://eng-entrance.com/java-scanner-keybord https://eng-entrance.com/java-scanner-keybord#respond Fri, 21 Oct 2016 00:31:08 +0000 http://eng-entrance.com/?p=3117 Javaでキーボードから入力された文字や数字を読み取るには、ScannerクラスまたはBufferedReaderクラスを使用する。

このページではScannerクラスについて確認していこう。キーボード入力について知りたい方は参考にしていただければと思う。

Javaでのキーボード入力

キーボード入力のサンプルプログラム

Javaでキーボード入力を読み取るにはScannerクラスを使う。使い方は簡単だ。

説明の前に、先にScannerクラスを使用した簡単なサンプルプログラムを確認してみよう。これだけでなんとなくわかってしまう人も多いはずだ。

import java.util.Scanner;	//・・・①
class sampleA {
  public static void main(String args[]) {
        Scanner scanner = new Scanner(System.in);	//・・・②
        System.out.println("何か入力してください。");
        String string = scanner.next();	//・・・③
        System.out.println("入力した文字列は " + string + " です。");
  }
}

まず、Scannerクラスを使用するには、 Scannerクラスを使用することをimport構文でファイルの先頭に書く必要があるので、①で以下のように書く。

import java.util.Scanner;

Scannerクラスを使用するための変数「scanner」を初期化して、Scannerクラスを使う準備を整えるのが②の1文だ。初期化するときの引数に「System.in」と書いているが、これはキーボードからの入力を使うことを指定している。

Scanner scanner = new Scanner(System.in);

③はScannerクラスの「next」メソッドを使っている。nextクラスはキーボードから改行されるまでの文字を取得してくれる。nextメソッドで取得したキーボードから入力された文字をString型の変数に格納しているのが以下だ。

String string = scanner.next();

sampleAクラスを実行して、「あいうえお」と入力して、改行した場合の実行結果は以下のようになる。

何か入力してください。
あいうえお
入力した文字列は あいうえお です。

複数の入力をしたい場合

先ほどのサンプルプログラムのsampleAクラスは1行入力して終了するプログラムだったが、複数行のキーボード入力の読み取り方法を確認しよう。

以下はampleAクラスを少し変更したプログラムだ。

import java.util.Scanner;
class sampleB {
  public static void main(String args[]) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("何か入力してください。");
        while(scanner.hasNext()){	//・・・①
        	String string = scanner.next();	//・・・②
            System.out.println("入力した文字列は " + string + " です。");	//・・・③
        }
        System.out.println("入力終了です。");
  }
}

①のwhile文のループの終了条件に、Scannerクラスの「hasNext」メソッドを使っている。hasNextメソッドは入力の終わりを検出してくれるメソッドだ。つまり、①は入力の終了を検知するまでループして、②のnextメソッドでキーボードの入力を読み取り、③で出力する処理だ。ちなみに入力の終了は、Windowsのコマンドプロンプトの場合は「Ctl+Z」、Macの場合は「Ctl+D」を入力する。

while(scanner.hasNext())

sampleBクラスを実行して、「あいうえお」と入力して改行、「かきくけこ」と入力して改行、そして終了を入力した場合の実行結果は以下のようになる。

何か入力してください。
あいうえお
入力した文字列は あいうえお です。
かきくけこ
入力した文字列は かきくけこ です。
入力終了です。

まとめ

このページではJavaでのキーボード入力についてまとめてきた。Scannerクラスをインポートすればすぐに使用できるのがお分かりいただけたと思う。

インタラクティブなアプリケーションを作るのは楽しいので、キーボード入力も使い方を覚えておこう。

]]>
https://eng-entrance.com/java-scanner-keybord/feed 0