やあ!今日のレッスンは特別です!今日のレッスンでは、Java スキャナ クラスについて説明します。以前は、タスクを完了してプログラムを作成するプロセスは単純でした。コードを作成し、main()を実行します。メソッドを実行すると、プログラムが必要な処理を実行して完了です。しかし今、すべてが変わります!今日は、プログラムと実際に対話する方法を学びます。私たちのアクションにどのように応答するかをプログラムに教えます。コードの分析を開始する前に、スキャナーなどのデバイスを扱う必要があったことがありますか? おそらく。スキャナの内部は非常に複雑ですが、その仕組みの基本的な考え方は非常に単純です。スキャナは、ユーザーが提供したデータ (パスポートや保険証書など) を読み取り、この情報をメモリに (たとえば、画像として) 保存します。 )。今日は独自のスキャナーを作成します。もちろん、紙の文書は扱えませんが、テキストなら問題ありません:) さあ、行きましょう!

Javaのスキャナクラス

スキャナークラス - 1何よりもまず、 java.util.Scannerクラスについて理解する必要があります。その機能は非常にシンプルです。実際のスキャナーと同様に、指定したソースからデータを読み取ります。たとえば、文字列、ファイル、コンソールなどです。次に、情報を認識し、適切に処理します。最も単純な例を次に示します。

public class Main {

   public static void main(String[] args) {

       Scanner scanner = new Scanner("It matters not how strait the gate,\n" +
               "How charged with punishments the scroll,\n" +
               "I am the master of my fate,\n" +
               "I am the captain of my soul");
       String s = scanner.nextLine();
       System.out.println(s);
   }
}
スキャナー オブジェクトを作成し、そのデータ ソース (テキストの文字列) を指定しました。nextLine ()メソッドは、データ ソース (四行列を含むテキスト) にアクセスし、次の未読の行 (この場合は最初の行) を見つけて返します。次に、それをコンソールに表示します。 コンソール出力:

It matters not how strait the gate,
nextLine()メソッドを数回 使用して、詩の抜粋全体を表示できます。

public class Main {

   public static void main(String[] args) {

       Scanner scanner = new Scanner("It matters not how strait the gate,\n" +
               "How charged with punishments the scroll,\n" +
               "I am the master of my fate,\n" +
               "I am the captain of my soul");
       String s = scanner.nextLine();
       System.out.println(s);
       s = scanner.nextLine();
       System.out.println(s);
       s = scanner.nextLine();
       System.out.println(s);
       s = scanner.nextLine();
       System.out.println(s);
   }
}
そのたびに、スキャナは 1 歩進み、次の行を読み取ります。プログラムの出力が表示されます。

It matters not how strait the gate, 
How charged with punishments the scroll, 
I am the master of my fate, 
I am the captain of my soul
すでに述べたように、スキャナーのデータ ソースは文字列である必要はありません。たとえば、コンソールである可能性があります。いくつかのエキサイティングなニュースです。以前はそこにデータを表示するだけでしたが、これからはキーボードからデータを読み取るようになります。Scannerクラスが他に何を行うかを見てみましょう。

public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter a number:");

       int number = sc.nextInt();

       System.out.println("Thanks! You entered the number " + number);

   }
}
nextInt ()メソッドは、入力された数値を読み取って返します。私たちのプログラムでは、これを使用して変数numberに値を割り当てます。すでに本物のスキャナーに近づいています。プログラムはユーザーに任意の数値を入力するよう求めます。ユーザーがこれを行った後、プログラムはユーザーに感謝し、結果を表示して終了します。しかし、私たちにはまだ深刻な問題が残っています。ユーザーが間違いを犯して間違った内容を入力する可能性があります。 現在のプログラムが動作しなくなる例を次に示します。

public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter a number:");

       int number = sc.nextInt();

       System.out.println("Thanks! You entered the number " + number);

   }
}
数字の代わりに文字列「CodeGym」を入力してみましょう: コンソール出力:

Enter a number: 
CodeGym 
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 Main.main(Main.java:10) Process finished with exit code 1
ええとああ。大変なことになっています -_- このような状況を避けるためには、ユーザーが入力したデータを検証する方法を考え出す必要があります。例えば、ユーザーが数字以外を入力した場合、入力された情報は数字ではない旨の警告を表示するとよいでしょう。情報に問題がない場合は、確認をさせていただきます。しかし、これには、ストリームに何が入ってくるかを確認するために「将来を見据える」必要があります。スキャナーでこんな事ができるのでしょうか?そしてどうやって!そして、これを行うためのメソッドが多数あります。 hasNextInt() — このメソッドは、入力データの次のチャンクが数値かどうかをチェックします (必要に応じて true または false を返します)。 hasNextLine() — このメソッドは、入力の次のチャンクが文字列かどうかをチェックします。 hasNextByte()hasNextShort()hasNextLong()hasNextFloat()hasNextDouble() — これらのメソッドはすべて、残りのデータ型に対して同様のチェックを実行します。数値読み取りプログラムを変更してみましょう。

public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter a number:");

       if (sc.hasNextInt()) {
           int number = sc.nextInt();
           System.out.println("Thanks! You entered the number " + number);
       } else {
           System.out.println("Sorry, but this is clearly not a number. Restart the program and try again!");
       }

   }
}
ここで、プログラムは入力された次の文字が数字であるかどうかをチェックします。そして、そうである場合にのみ確認が表示されます。入力がチェックに合格しない場合、プログラムはそれを記録し、ユーザーに再試行するよう求めます。基本的に、Scannerオブジェクトと通信して、どのようなデータ型が待っているかを事前に知ることができます。数値、文字列、またはその他のものですか? 数?そして何の種類ですか?int 、shortlong ?" この柔軟性により、ユーザーの動作に依存するプログラム ロジックを構築する機会が得られます。もう 1 つの重要なメソッドuseDelimiter()に注意してください。このメソッドには文字列を渡します。文字列には、区切り文字または区切り文字として使用する文字。 たとえば、私たちが突然日本の詩に興味を持ち、スキャナーを使って偉大な詩人、松尾芭蕉の俳句を読んでみようと思ったとします。3 つの異なる詩が 1 つの扱いにくい文字列として渡された場合でも、それらを簡単に分割して美しくレンダリングできます。

public class Main {
   public static void main(String[] args) {
       Scanner scan = new Scanner("On a withered branch'" +
               "A crow has alighted.'" +
               "Nightfall in autumn." +
               "''***''" +
               "Such a moon above,'" +
               "Like a tree cut at the root:'" +
               "he fresh cut is white." +
               "''***''" +
               "How the river floods!'" +
               "A heron wanders on short legs,'" +
               "Knee-deep in the water.");

       scan.useDelimiter("'");

       while (scan.hasNext()) {
           System.out.println(scan.next());
       }

       scan.close();
   }
}
区切り文字として「\ n /*/*/*」(改行文字と 3 つのアスタリスク)を 使用します。その結果、まるで書籍のような美しいコンソール出力が得られます。
On a withered branch 
A crow has alighted. 
Nightfall in autumn. 

*** 

Such a moon above, 
Like a tree cut at the root: 
The fresh cut is white. 

*** 

How the river floods! 
A heron wanders on short legs, 
Knee-deep in the water.
この例には、絶対に指摘しなければならないメソッドがもう 1 つあります: close()。I/O ストリームを処理する他のオブジェクトと同様に、スキャナは、コンピュータのリソースの消費を停止するために、処理が完了したら閉じる必要があります。close()メソッドを決して忘れないでください。

public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter a number:");

       int number = sc.nextInt();

       System.out.println("Thanks! You entered the number " + number);
      
       sc.close(); // Now we've done everything right!

   }
}
それでおしまい!ご覧のとおり、Scannerクラスは非常に便利ですが、非常に使いやすいです。:) 学んだことを強化するには、Java コースのビデオ レッスンを視聴することをお勧めします。