web-dev-qa-db-ja.com

Java I / Oで「ストリーム」と「バッファ」は正確に何を意味しますか?

BufferedReaderを使用して入出力について学習しました。

StreamおよびBufferという用語の意味は正確に知りたいと思いましたか?

また、このコード行は何を提供しますか:

BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
75
user122345656

Javaには、入力と出力(I/O)の2種類のクラスがあります:streamsおよびreaders/writers

ストリーム(InputStreamOutputStreamおよびこれらを拡張するすべて)は、ファイル、ネットワーク、またはその他のデバイスからバイナリデータを読み書きするためのものです。

リーダーとライターは、テキスト(文字)を読み書きするためのものです。これらは、ストリームの最上位にある層であり、バイナリデータ(バイト)を文字に変換し、 文字エンコード を使用して文字に変換します。

ディスクからバイト単位でデータを読み取ることは非常に非効率的です。これを高速化する1つの方法は、バッファーを使用することです。一度に1バイトずつ読み取るのではなく、一度に数千バイトを読み取り、メモリー内のバッファーに入れます。その後、バッファ内のバイトを1つずつ確認できます。

OracleのJavaチュートリアル I/Oについて で詳細に説明されています。

あなたが提供したコードの行を見て:

BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

System.inInputStreamです。 System.inからバイトを読み取るInputStreamReaderを作成します。次に、それをBufferedReaderでラップします。

したがって、最終的には、BufferedReaderから読み取り、InputStreamReaderから読み取り、System.inから読み取ります。

182
Jesper

それは、Java.ioパッケージの作業を開始する人の疑問です。あなたの質問用語に答えるために、InputStreamReaderとBufferedReaderはJavaオブジェクトのみを表します(それらについて特別なものはありません)が、ファイル、オブジェクトなどのさまざまな入力/出力の読み書きなどのio操作用に作成されます

さあ、行こう

BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

InputStreamReaderは、バイトの入力ストリームを読み取るためのクラスですが、各バイトを読み取るのは高価な操作なので、BufferedReaderをラップしてバッファリングするようにします(これはデコレータパターンです)

そのため、読み取りを開始する前でも、bufferedReaderはバイトチャンクをレジスタに格納し、読み取り操作を実行します。コンソール/ファイルから読み取るよりもはるかに安価な場所から読み取られますが、InputStreamReaderの場合、ディスクアクセス操作が行われるたびに読み取り操作を実行すると

14
M Sach

バッファ:

regionの物理メモリストレージは、ある場所から別の。その物理メモリstorageは、ほとんどの場合RAM(ランダムアクセスメモリ)になります。

しかし、この質問のコンテキストから、データの読み取り/書き込み中にBufferが使用されます。ある場所から別の場所にデータを移動するときに使用する必要はありません。

バッファの例:システムに4 GBのRAMがある場合、4 KBのメモリ(RAM)がシステムによってBufferに割り当てられます。 KB-キロバイト、GB-ギガバイト

I/Oストリーム (または)ストリーム:

I/O Streamは、入力ソースまたは出力宛先を表します。ストリームは、ディスクファイル、デバイス、その他のプログラム、メモリアレイなど、さまざまな種類のソースと宛先を表すことができます。

I/Oは入力/出力を意味します。

したがって、入力ストリームは、ディスクファイル、ネットワーク接続などの入力ソースになります。

また、出力ストリームは、ディスクファイル、ネットワーク接続などの出力先にすることができます。

Java公式ドキュメント によると、ストリームには3つのタイプがあります。

  1. バイトストリーム (バイトの読み取りまたは書き込み)
  2. 文字ストリーム (文字の読み取りまたは書き込み)
  3. Buffered Streams (効率のためにBufferからの読み取りまたは書き込み)

バイトストリーム:

これらは、8ビットバイトの入出力を実行します。すべてのバイトストリームクラスは、 InputStream および OutputStream から派生しています。

Byte Input Streamクラスは、入力をraw bytesとして取得します。バイト出力ストリームクラスは、出力をraw bytesとして提供します。

InputStream-直接既知のサブクラス

AudioInputStream, ByteArrayInputStream, FileInputStream, FilterInputStream, InputStream, ObjectInputStream, PipedInputStream, SequenceInputStream, StringBufferInputStream.

OutputStream-直接既知のサブクラス

ByteArrayOutputStream, FileOutputStream, FilterOutputStream, ObjectOutputStream, OutputStream, PipedOutputStream

Character Streams:バイトストリームの最上層です。文字エンコードを使用して、バイト(バイナリデータ)を文字に、文字をバイトに変換します。

すべての文字ストリームクラスは、 Reader および Writer から派生しています。

Reader-既知の直接サブクラス

BufferedReader, CharArrayReader, FilterReader, InputStreamReader, PipedReader, StringReader

Writer-既知の直接サブクラス

BufferedWriter, CharArrayWriter, FilterWriter, OutputStreamWriter, PipedWriter, PrintWriter, StringWriter

バイトストリームおよび文字ストリーム使用アンバッファードI/O

つまり、各読み取りまたは書き込み要求は、基盤となるOSによって直接処理されます。これにより、各要求がディスクアクセス、ネットワークアクティビティ、または比較的高価な他の操作をトリガーすることが多いため、プログラムの効率が大幅に低下する可能性があります。この種のオーバーヘッドを削減するために、JavaプラットフォームはバッファーI/Oストリームを実装しています。

バッファリングされたストリーム:

バッファリングされた入力ストリームデータの読み取り元として知られるメモリ領域バッファ;ネイティブ入力APIは、バッファーが空の場合にのみ呼び出されます。

同様に、バッファリングされた出力ストリームバッファにデータを書き込むであり、ネイティブ出力APIは、バッファがいっぱいになったときにのみ呼び出されます。

プログラムは、ラッピングイディオムを使用して、unbufferedストリームをbufferedストリームに変換できます。unbufferedストリームオブジェクトは、bufferedストリームクラスのコンストラクターに渡されます。

例:

inputStream = new BufferedReader(new FileReader("xanadu.txt"));
outputStream = new BufferedWriter(new FileWriter("characteroutput.txt"));

バッファリングされていないストリームをラップするために使用される4つのバッファリングされたストリームクラスがあります。

作成するにはbufferedByte Streams use、BufferedInputStreamおよびBufferedOutputStreamクラス。

作成するにはbufferedCharacter Streams use、BufferedReaderおよびBufferedWriterクラス。

12
AnV

ストリームとは、ポイント間で渡される接続と実際の情報です。バッファは、ストリーミングデータの一部またはすべてを保存し、これを出力デバイスに供給するストレージコンテナです。

もちろん、ポイントは、データの表示に必要なデータレートを超えてストリームが遅くなると、出力が一時停止することです。バッファはこれを防ぎます。

3
PGallagher

バッファは、周辺機器からのデータのストリームを保存するために使用されるメモリ内の部分です。次に、このバッファからこのデータストリームが収集され、変数に保存されます。ストリームは、データの連続的な流れとして定義できます。

「入力/出力」という用語は、データをバッファに出し入れすることを意味します。常にこれを心に留めておいてください。プロセスは、オペレーティングシステムに、バッファからデータを排出する(書き込み操作)か、バッファにデータを書き込む(読み取り操作)ように要求することにより、I/Oを実行します。
データの移動方法の論理図

簡単に言えば、キーボードでデータを入力すると、データはパイプ(stream)を介してバッファーに移動し、次にバッファーからディスク(書き込み操作)。同様に、データがディスクからbufferに移動し、バッファからコンソールに移動すると、読み取り操作になります。

リンクを読んで理解を深めることができます。それが役に立てば幸い!。
Javaのバッファとは
リンクの説明をここに入力

0
Kushagra