アットウィキロゴ
Javaプログラミング入門
掲示板 掲示板 ページ検索 ページ検索 メニュー メニュー

Javaプログラミング入門

20. クラスライブラリ~後編~

最終更新:

javatutorial

- view
管理者のみ編集可

今回は、クラスライブラリの「後編」として、実行中のプログラムにキーボードから文字を打ち込む機能毎回違う数字を出すランダムな機能、そしてファイルを扱うための便利な道具(クラス)を紹介します。これらを使えるようになると、プログラムが一気に本格的で楽しいものになります。

キーボードからの入力を受け取る「Scanner」クラス

ユーザーに文字や数字を打ち込んでもらい、それを使って動く対話型のプログラムを作るには、java.util.Scanner(スキャナー)クラスを使います。

Scannerクラスの使い方

Scannerクラスは「java.util(ユーティル)」というJavaが用意したパッケージに入っているため、使う前に「12. パッケージ」で学んだ import(インポート) を使って準備をする必要があります。

import java.util.Scanner; // クラスの外(一番上)に書く
実体(インスタンス)を生み出すときは、コンストラクタのカッコの中にSystem.in(標準入力=キーボードのこと)という特別なキーワードを渡します。
Scanner sc = new Scanner(System.in);
あとは、生み出した実体(上記の例ではsc)のメソッドを呼び出すだけで、キーボードからの入力を受け取ることができます。
Scannerクラスの代表的なメソッド
メソッド名 役割
nextLine() エンターキーが押されるまでに入力された文字列(String)を受け取る
nextInt() 入力された整数(int)を受け取る

サンプル:ScannerTest.java
  1. import java.util.Scanner;
  2.  
  3. public class ScannerTest {
  4. public static void main(String[] args) {
  5. // キーボード入力を受け取る準備
  6. Scanner sc = new Scanner(System.in);
  7.  
  8. System.out.println("あなたの名前を入力してください:");
  9. // キーボードで文字が打ち込まれるまで、プログラムはここで一時停止して待つ
  10. String name = sc.nextLine();
  11.  
  12. System.out.println("年齢を入力してください:");
  13. int age = sc.nextInt();
  14.  
  15. System.out.println("ようこそ、" + age + "歳の" + name + "さん!");
  16. }
  17. }
実行結果
あなたの名前を入力してください:
太郎
年齢を入力してください:
18
ようこそ、18歳の太郎さん!
💡注意!
nextInt()は整数を受け取るための専用メソッドです。
もし、年齢を聞かれているのに間違えて「あいうえお」などの文字を入力してしまうと、コンピュータが「数字じゃない!」と混乱して、プログラムがエラーで強制終了してしまいます。

サイコロのようにランダムな数字を作る「Random」クラス

おみくじアプリや、RPGゲームのダメージ計算のように、毎回違う「でたらめな数字(乱数)」を作りたいときは、java.util.Random(ランダム)クラスを使います。

Randomクラスも、Scannerクラスと同じ「java.util」パッケージに入っているので、import文が必要です。
使うときはnew Random()で実体を生み出し、nextInt()というメソッドを使います。

サンプル:RandomTest.java
  1. import java.util.Random;
  2.  
  3. public class RandomTest {
  4. public static void main(String[] args) {
  5. // ランダムな数字を作る準備
  6. Random rand = new Random();
  7.  
  8. // 【従来の書き方】
  9. // 0 から 指定した数字より「1つ小さい数字」までの範囲でランダムな整数を作る
  10. // この場合、0, 1, 2, 3, 4, 5 のどれかになる
  11. int dice1 = rand.nextInt(6);
  12.  
  13. // 実際のサイコロは1~6なので、出た結果に 1 を足してズレを直す
  14. dice1 = dice1 + 1;
  15. System.out.println("従来のサイコロの目は「" + dice1 + "」でした!");
  16.  
  17. // 【Java 21からの新しい書き方】
  18. // rand.nextInt(開始の数字, 終わりの数字) と範囲を直接指定できるようになりました!
  19. // ※終わりの数字は「その数字を含まない(未満)」ことに注意してください。
  20. // 1から7未満(つまり1~6)を直接作れるので、後から1を足す必要がありません。
  21. int dice2 = rand.nextInt(1, 7);
  22. System.out.println("新しいサイコロの目は「" + dice2 + "」でした!");
  23. }
  24. }

実行結果
従来のサイコロの目は「4」でした!
新しいサイコロの目は「2」でした! 
(※実行するたびに結果は変わります)

カッコの中に数字を入れるだけで、その範囲内でランダムな整数を自動的に作ってくれるため、ゲーム作りなどには欠かせない非常に便利なクラスです。

ファイルの情報を調べる「File」クラス

パソコンの中にある「テキストファイル」や「画像ファイル」などの情報を調べたいときは、java.io.File(ファイル)クラスを使います。
このクラスは「java.io(Input/Outputの略)」という、データの入出力を担当するパッケージに入っています。

Fileクラスのコンストラクタには、調べたいファイルの「場所と名前(パス)」を文字列で渡して実体を作ります。
Fileクラスの代表的なメソッド
メソッド名 役割
exists() ファイルが実際に存在しているか(true / false)
length() ファイルのサイズ(大きさ)をバイト単位で返す
isDirectory() ファイルではなく、フォルダ(ディレクトリ)かどうか(true / false)

サンプル:FileTest.java
  1. import java.io.File;
  2.  
  3. public class FileTest {
  4. public static void main(String[] args) {
  5. // 調べたいファイルを指定して実体を作る
  6. // ※プログラムを実行している場所に「sample.txt」というファイルがあると仮定します
  7. File f = new File("sample.txt");
  8.  
  9. // ファイルが本当に存在するかどうかを条件分岐でチェックする
  10. if (f.exists()) {
  11. System.out.println("ファイルは存在します!");
  12. System.out.println("ファイルの大きさは " + f.length() + " バイトです。");
  13. } else {
  14. System.out.println("残念ながら、ファイルが見つかりません。");
  15. }
  16. }
  17. }
💡注意!
Fileクラスは、あくまで「ファイルそのものの外側からの情報(大きさや、存在するかどうか)」を調べるためのクラスです。
ファイルの中に書かれている文章(テキストの中身)を読み込んだり、新しい文章を書き込んだりするには、また別の特別なクラスを使用する必要があります。
詳しくは以下のクラスに関して調べてみましょう。
※FileReader、FileWriter、BufferedReader、BufferedWriter、InputStream、OutputStream

コラム

Randomクラスは本当に「ランダム」なのか?(擬似乱数)

私たちがサイコロを振るとき、その結果は風の向きや手の振り方など、物理的な要因で決まる完全なランダムです。しかし、コンピュータは「あらかじめ決められた計算」しかできないため、本来「でたらめ」を作り出すことはできません。

では、Randomクラスはどうやって乱数を作っているのでしょうか?
実は、現在の時刻(ミリ秒単位などの非常に細かい時間)などの「実行するたびに毎回変わる数字(これをシード値と呼びます)」を元にして、特殊で複雑な計算式(線形合同法など)に当てはめることで、「人間から見たらでたらめに並んでいるように見える数字の列」を作り出しているのです。

このように、計算によって作られた偽物の乱数のことを「擬似乱数(ぎじらんすう)」と呼びます。そのため、もし意図的に「全く同じシード値」をRandomクラスに与えるようにプログラムを書くと、何度実行しても毎回全く同じ順序でサイコロの目が出るという面白い現象が起きます(ゲームのタイムアタックなどで「乱数調整」と呼ばれるテクニックは、この仕組みを利用したものです)。
Javaの深い仕様(JVMやクラスライブラリの裏側)では、よりセキュリティの高い(予測不可能な)乱数が必要な暗号通信などのために、java.security.SecureRandomという、OSの機能も利用した強力なクラスも別に用意されています。

最近更新されたスレッド
人気記事ランキング
ウィキ募集バナー