CodeGym /Java Blog /ランダム /キーボードからの読み取り:「リーダー」
John Squirrels
レベル 41
San Francisco

キーボードからの読み取り:「リーダー」

ランダム グループに公開済み
やあ!レベル 3 のレッスンとタスクでは、コンソールに情報を表示する方法と、逆にキーボードからデータを読み取る方法を学びました。
キーボードからの読み取り: "readers" - 1
これを達成するために、次の複雑な構造を使用する方法も学びました。

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
しかし、まだ答えられていない質問が 1 つあります。

いったいこれはどうやって機能するのでしょうか?

実際には、プログラムが完全に独立していることはほとんどありません。これらは、他のプログラム、システム、インターネットなどと通信します。「通信する」とは、主に「データを交換する」ことを意味します。つまり、外部データを受信し、内部プログラム データもどこかに送信します。データを交換するプログラムの例は日常生活にたくさんあります。たとえば、多くの Web サイトでは、登録する代わりに Facebook または Twitter アカウントを使用してサインインできます。この状況では、2 つのプログラム (Twitter とサインインしている Web サイトなど) が必要なデータを交換します。最終的な結果は、正常にサインインしたことです。 「ストリーム」という単語データ交換のプロセスを記述するために使用されます。この名前の由来は何ですか? あなたの経験では、「ストリーム」はプログラミングよりも川と関連しているかもしれません。それは偶然ではありません:) ストリームは本質的には移動するデータです。言い換えれば、プログラミングにおいて流れるのは水ではなく、バイトや文字の形のデータです。データ ストリームからデータのビットを受信して​​、それらを使用できます。繰り返しますが、水/流れのたとえを使用します。川から水をすくってスープを作ったり、火を消したり、花に水をやることができます。ストリームを使用すると、インターネット、コンピュータのファイル システム、その他のものなど、あらゆるデータ ソースを操作できます。違いはありません。ストリームは普遍的なツールです。これらにより、プログラムはどこからでもデータを受信 (入力ストリーム) し、それをどこにでも送信 (出力ストリーム) することができます。彼らのタスクは同じです。ある場所からデータを取得し、それを別の場所に送信することです。ストリームには次の 2 種類があります。
  1. 入力ストリームはデータの受信に使用されます
  2. 出力ストリームはデータを送信するためのものです。
Java では、これらのストリームはInputStreamおよびOutputStreamクラスによって実装されます。ただし、ストリームは別の方法で分類することもできます。入力ストリームと出力ストリームに加えて、バイト ストリーム文字ストリームについても説明します。ここでの意味は十分明らかです。バイト ストリームは情報をバイトのセットとして送信し、文字ストリームは情報を文字のセットとして送信します。このレッスンでは、入力ストリームについて詳しく説明します。レッスンの最後に、出力ストリームに関する情報のリンクを貼ります。自分で読むことができます:) 次に、このコードを見てください。

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
レッスンを受けていく中で、このセリフはかなり怖いと思いませんでしたか?:) それがどのように機能するかを調べてしまえば、そうではありません。物事を正しくしましょう。最後から始めます。 System.inInputStreamオブジェクト、つまり最初に説明したクラスのインスタンスです。これは、システム入力デバイス (キーボード) にリンクされた入力ストリームです。ところで、あなたは間接的にこのストリームについてよく知っています。結局のところ、あなたはその「同僚」を頻繁に使用します— System.out! System.outはシステム出力ストリームです。これは、お気に入りのメソッドを介してコンソールにデータを出力するために使用されSystem.out.println()、常に使用します:) System.outは、コンソールにデータを送信するためのストリームです。System.inキーボードからデータを取得するためのものです。すべてシンプルです:) さらに、この巨大な構造を使わずにキーボードからデータを読み取ることができます。単純に次のように書くことができますSystem.in.read()

public class Main {

   public static void main(String[] args) throws IOException {

       while (true) {
           int x = System.in.read();
           System.out.println(x);
       }
   }
}
クラスInputStream(オブジェクトSystem.inであることを忘れないでくださいInputStream) には、read()データを読み取るためのメソッドがあります。問題が 1 つあります。それは、文字ではなくバイトを読み取ることです。英語の文字だけを使用するのは退屈なので、キーボードから漢字の「魚」を読んでみましょう (ここからこの文字をコピーし、PC の場合は Ctrl + V または Mac の場合は Command + V を使用してコンソールに貼り付けます)。ちなみにこの文字は「魚」を意味します。コンソール出力: 233 173 154 10 この記号と他の多くの中国語は、コンピュータのメモリ内で 3 バイトを占有します (わずか 1 バイトを占有するラテン文字とは異なります)。この場合、ストリームから 4 バイトが読み取られます。最初の 3 バイトは文字「魚」を表し、他のバイトは改行 (Enter) を表します。したがって、System.in飾り気のないそのままの形は私たちにとって選択肢ではありません。人間は (まれな例外を除いて) バイトの読み方を知りません。しかし、 InputStreamReaderクラスが助けに来ます!これはどんな動物なのか見てみましょう。

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
InputStreamReaderSystem.inオブジェクトに 渡します。クラス名がそれを表しています!オブジェクトを作成し、データを読み取る入力ストリームをオブジェクトに渡します。この場合... InputStreamReader

new InputStreamReader(System.in)
...「システム入力ストリーム (キーボードから) からデータを読み取ることになります」と伝えます。しかし、機能はこれだけではありません。はInputStreamReaderストリームからデータを受信するだけではありません。また、バイト ストリームを文字ストリームに変換します。言い換えれば、データを「1 と 0」から「人間が読める言語」に変換する必要がなくなりました。InputStreamreaderあなたのためにすべてをしてくれます。もちろん、InputStreamReaderコンソールからのデータの読み取りに限定されません。他の場所からデータを読み取ることもできます。たとえば、ファイルから:

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

   public static void main(String[] args) throws IOException {
       InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("C:\\Users\\username\\Desktop\\testFile.txt"));
   }
}
FileInputStreamここでは( の 1 つのフレーバー) を作成しInputStream、ファイル パスを渡し、ストリーム自体を に渡しますInputStreamReader。これで、ファイルからデータを読み取ることができるようになります (もちろん、ファイルが実際にパスに存在する場合)。また、InputStreamReaderクラスのread()メソッドを使用してデータを読み取ります (データのソースは、コンソール、ファイル、または他の場所ではありません)。System.in.read()との違いは何ですかInputStreamReader.read()?\ もう一度「魚」という文字を . で読んでみましょうInputStreamReaderSystem.in.read()実際に: 233 173 154 10が読んだ内容を思い出してください。 そして、InputStreamReader同じことがどのように機能するのでしょうか?

public class Main {

   public static void main(String[] args) throws IOException {

       InputStreamReader reader = new InputStreamReader(System.in);
       while (true) {
           int x = reader.read();
           System.out.println(x);
       }
   }
}
コンソール出力: 39770 10 違いはすぐにわかります。最後のバイト (改行を表す) は変更されません (数値 10) が、文字「魚」は 1 つのコード「39770」に変換されます。文字を読むとはこういうことだ!39770 が「魚」という文字を表しているとは信じられないとしても、納得するのは簡単です:)
import java.io.IOException;

public class Main {

   public static void main(String[] args) throws IOException {

       char x = 39770;
       System.out.println(x);
   }
}
コンソール出力: しかし、InputStreamReaderそれがとても素晴らしいなら、なぜ私たちも必要なのでしょうかBufferedReader? InputStreamReaderデータを読み取り、バイトを文字に変換する方法を知っています。これ以上何を求めることができるでしょうか?なぜ別のリーダーがいるのですか? :/ 答えは非常に簡単です。パフォーマンス利便性を向上させるためです。まずはパフォーマンスから始めましょう。データを読み取るときはBufferedReader、バッファーと呼ばれる特別な領域を使用し、そこに読み取った文字を「格納」します。最終的に、これらの文字がプログラムで必要な場合、データ ソース (キーボード、ファイルなど) から直接取得されるのではなく、バッファから取得されます。これにより、多くのリソースが節約されます。 これがどのように機能するかを理解するために、大企業の配達員を想像してください。配達員はオフィスに座って、誰かが配達用の荷物を持ってくるのを待っています。新しい荷物を受け取るたびに、すぐに出かけることができます。ただし、日中は荷物が多くなる可能性があります。彼はオフィスと配達先の間を何度も往復する必要がありました。代わりに、宅配業者はオフィスに箱を置きます。全員が荷物を箱に入れます。これで、宅配業者は落ち着いて箱を受け取り、住所から住所へと移動できます。毎回オフィスに戻る必要がないため、時間を大幅に節約できます。この例では、ボックスは単なるバッファであり、オフィスはデータ ソースです。宅配業者にとって、配達の際に毎回オフィスに戻るよりも、1 つの箱から荷物を取り出す方がはるかに簡単です。ガソリンも節約できるだろう。同様に、プログラムでは、毎回データ ソースを参照するよりも、バッファからデータを取得する方が、リソースの消費量がはるかに少なくなります。結果として、BufferedReader+は単独InputStreamReaderよりも高速ですInputStreamReader。パフォーマンスを考慮しました。利便性についてはどうでしょうか?主な利点は、Bufferedreaderデータを一度に 1 文字ずつ読み取るだけでなく (メソッドを使用すると実行できますread())、一度に行全体も読み取ることができることです。これは、readLine()メソッドを使用して行われます。

public class Main {

   public static void main(String[] args) throws IOException {

       BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
       String s = reader.readLine();
       System.out.println("We read this line from the keyboard:");
       System.out.println(s);
   }
}
コンソール出力: CodeGym は Java を学習するのに最適な Web サイトです。 キーボードから次の行を読み上げます。CodeGym は Java を学習するのに最適な Web サイトです。 これは、大量のデータを読み取る場合に特に便利です。1 行または 2 行のテキストを 1 文字ずつ読むことは依然として可能です。しかし、『戦争と平和』を一度に一文字ずつ読むのは、少々問題があるでしょう:)
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION