JavaRush /Java Blog /Random-JA /キーボードから読む - 「リーダー」

キーボードから読む - 「リーダー」

Random-JA グループに公開済み
こんにちは!講義とタスクでは、コンソールにデータを出力する方法、およびその逆、キーボードからデータを読み取る方法を学びました。 キーボードからの読み取り - 「リーダー」 - 1このために複雑な構造を使用する方法も学びました。
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
しかし、私たちはまだ 1 つの質問に答えていません。

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

実際、ほとんどの場合、プログラムはそれ自体では存在しません。他のプログラム、システム、インターネットなどと通信できます。「通信する」という言葉は、まず「データを交換する」ことを意味します。つまり、外部から何らかのデータを受け取り、逆に自分のデータをどこかに送信します。プログラム間のデータ交換の例は日常生活でも数多くあります。そのため、多くのサイトでは、登録する代わりに、Facebook または Twitter アカウントを使用してログインできます。この状況では、2 つのプログラム (たとえば、Twitter と登録しようとしているサイト) が必要なデータを相互に交換し、その後、最終結果として承認が成功することがわかります。「フロー」という用語は、プログラミングにおけるデータ交換のプロセスを説明するためによく使用されます。この名前は一体どこから来たのでしょうか?「フロー」は、プログラミングよりも川や流れに関連しています。実際、これには理由がないわけではありません :) ストリームは本質的には移動するデータです。つまり、プログラミングにおいて、川に沿って「流れる」のは水ではなく、バイトや文字の形式のデータです。データ ストリームからデータを部分的に受信し、それに対して何かを行うことができます。もう一度、「水の流れ」のたとえを使ってみましょう。川から水をすくってスープを作ったり、火を消したり、花に水をあげることができます。ストリームを使用すると、インターネット、コンピューターのファイル システム、またはその他のものなど、あらゆるデータ ソースを操作できます。ストリームは普遍的なツールです。これらにより、プログラムはどこからでもデータを受信 (受信ストリーム) し、それをどこにでも送信 (送信ストリーム) することができます。彼らのタスクは 1 つです。データをある場所に取得し、それを別の場所に送信することです。 ストリームは 2 つのタイプに分類されます。
  1. 受信ストリーム (入力) - データの受信に使用されます
  2. 送信ストリーム ( Output ) - データ送信用。
Java の受信データ フローはクラスに実装されInputStream、送信データ フローはクラスに実装されますOutputStream。ただし、スレッドを分割する別の方法もあります。受信と送信だけでなく、バ​​イト文字にも分類されます。ここでの意味は説明しなくても明らかです。バイト ストリームはバイトの集合の形式で情報を送信し、文字ストリームは文字の集合の形式で情報を送信します。この講義では、受信ストリームについて詳しく説明します。最後に発信リンクに関する情報を添付します。それについては自分で読むことができます :) したがって、私たちのコードは次のとおりです。
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
講義を読んでいると、かなり怖そうだと思ったのではないでしょうか?:) しかし、これはこれがどのように機能するかを理解するまでの話です。今すぐ修正しましょう! 最後から始めましょう。 は、最初に説明したSystem.inクラスのオブジェクトです。InputStreamこれは受信ストリームであり、システム入力デバイスであるキーボードに関連付けられています。ところで、あなたは間接的に彼と知り合いです。だって、仕事の中で「同僚」ってよく使うんですよね―― System.outSystem.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 つは、文字ではなくバイトを読み取ることです。キーボードからロシア語の文字「Ya」を読んでみましょう。コンソール出力:
Я
208
175
10
ロシア語の文字は、コンピュータのメモリ内で 2 バイトを占有します (1 バイトしか占有しない英語の文字とは異なります)。この場合、ストリームから 3 バイトが読み取られました。最初の 2 バイトは文字「I」を表し、もう 1 バイトは改行 (Enter) です。したがって、「裸」を使用するという選択肢はSystem.in私たちには適していません。人間は (まれな例外を除いて) バイトを読み取ることができません。ここで次のクラスが役に立ちます - InputStreamReader! これは何の動物なのか調べてみましょう。
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
ストリームSystem.inを に渡しますInputStreamReader。一般に、その名前をロシア語に翻訳すると、「受信ストリームのリーダー」であることがすべて明らかです。実際、それがまさにそのためなのです!クラス オブジェクトを作成しInputStreamReader、データを読み取る受信ストリームをそれに渡します。この場合...
new InputStreamReader(System.in)
...「システム入力ストリーム (キーボード) からデータを読み取ることになります。」と伝えます。しかし、機能はこれだけではありません。 InputStreamReaderストリームからデータを受信するだけではありません。また、バイト ストリームを文字ストリームに変換します。言い換えれば、読み取ったデータを「コンピューター」言語から「人間」言語に翻訳することを心配する必要はもうありません。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'y.' 渡します。もちろん、このパスにファイルが存在する場合は、このファイルからデータを読み取ることができるようになります。データを読み取るために (コンソール、ファイル、または他の場所からでも)、クラスInputStreamReaderread(). System.in.read()とはどう違いますかInputStreamReader.read()?を使って同じ文字「I」を数えてみましょうInputStreamReader。思い出させてください、これが私が思ったことですSystem.in.read()
Я
208
175
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);
       }
   }
}
コンソール出力:
Я
1071
10
違いはすぐに分かります。改行のための最後のバイトは変更されませんでした (数字の 10) が、読み取られた文字「I」は単一のコード「1071」に変換されました。これは記号で読むことです!コード 1071 が文字「I」を意味すると突然信じられない場合は、これを簡単に確認できます :)
import java.io.IOException;

public class Main {

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

       char x = 1071;
       System.out.println(x);
   }
}
コンソール出力:

Я
しかし、InputStreamReaderそれがとても良いのであれば、なぜさらに多くのものが必要なのでしょうかBufferedReader? InputStreamReaderデータの読み取りとバイトの文字への変換の両方が可能ですが、他に何が必要でしょうか? なぜ別のリーダーがいるのですか? :/ 答えは非常に簡単です。生産性利便性を向上させるためです。パフォーマンスから始めましょう。 データを読み取るとき、 BufferedReader は特別な領域、つまりバッファーを使用し、そこに読み取った文字を「追加」します。その結果、プログラムでこれらの文字が必要な場合、データ ソース (キーボード、ファイルなど) から直接ではなく、バッファーから文字が取得されるため、多くのリソースが節約されます。これがどのように機能するかを理解するために、たとえば、大企業の宅配便の仕事を想像してください。配達員はオフィスに座って、配達のために荷物が運ばれてくるのを待ちます。新しい荷物を受け取るたびに、すぐに出かけることができます。しかし、日中は荷物がたくさんある可能性があり、そのたびにオフィスと住所の間を移動する必要があります。代わりに、宅配業者はオフィスにボックスを置き、誰もが荷物を入れることができました。これで、宅配業者は落ち着いて箱を受け取って住所に行くことができます。毎回オフィスに戻る必要がないため、時間を大幅に節約できます。この例のボックスはまさにバッファであり、オフィスがデータ ソースです。宅配業者にとって、毎回オフィスに行くよりも、配達するときに共通のボックスから手紙を取り出すほうがはるかに簡単です。ガスの節約にもなります。プログラムでも同様です。毎回データ ソースにアクセスするよりも、バッファからデータを取得する方が、リソースの消費がはるかに少なくなります。これが、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);
   }
}
コンソール出力:
JavaRush is the best site to learn Java!
Мы считали с клавиатуры эту строку:
JavaRush — лучший сайт для изучения Java!
これは、大量のデータを読み取る場合に特に便利です。1 行または 2 行のテキストは 1 文字ずつ読むことができます。しかし、「戦争と平和」を 1 文字ずつ数えるのは少々問題があります:) これで、スレッドの働きがより明確になりました。さらに詳しく学習するには、次の追加情報源を参照してください。 ここでは、受信フローと送信フローについて詳しく読むことができます。BufferedReader生徒によるビデオレビュー。はい、はい、私たちの生徒は自分自身を学ぶだけでなく、他の人のために教育ビデオを録画します。「いいね!」とチャンネル登録を忘れないでください:)
勉強を始めた当初から公式ドキュメントを読むことに慣れておくとよいでしょう。これは言語に関する主な知識源であり、ほとんどの答えは常にそこにあります。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION