7

現時点で暫定的に理解しているように:

DataInputStreamInputStreamサブクラスであるため、バイトを読み書きします。バイトを読み取っていて、それらがすべてints またはその他のプリミティブ データ型になることがわかっている場合は、byteを使用してそれらの s をプリミティブに直接読み取ることができますDataInputStream

  • 質問:コンテンツを読み取る前に、コンテンツの型 (int、string など) を知る必要がありますか? そして、ファイル全体がその 1 つのプリミティブ型で構成される必要があるでしょうか?

私が持っている質問は:のバイトデータInputStreamReaderをラップして使用しないのはなぜですか? InputStreamこのアプローチでは、引き続きバイトを読み取ってから、文字を表す整数に変換します。どの整数がどの文字を表すかは、指定された文字セット ("UTF-8" など) によって異なります。

  • 質問:が機能するのに が機能しないのはどのような場合ですか?InputStreamReaderDataInputStream

私の推測の答え:速度が本当に重要であり、それができる場合は、InputStreamのバイトデータをプリミティブ経由で直接変換するのDataInputStreamがよいでしょうか?これにより、バイトデータを最初Readerに「キャスト」する必要がなくなります。intまた、返された整数によってどの文字が表されているかを解釈するために、文字セットを提供することに依存しません。これがDataInputStream、基礎となるデータのマシンに依存しない読み取りを可能にするという意味だと思います。

  • 単純化:DataInputStreamバイトをプリミティブに直接変換できます。

全体に拍車をかけた質問:私は次のチュートリアルコードを読んでいました:

    FileInputStream fis = openFileInput("myFileText");

    BufferedReader reader = new BufferedReader( new InputStreamReader( new DataInputStream(fis)));

    EditText editText = (EditText)findViewById(R.id.edit_text);

    String line;

    while(  (line = reader.readline()) != null){

        editText.append(line);
        editText.append("\n");
    }

new DataInputStream(fis)...バイトからプリミティブに直接変換する機能が活用されていないように見えるため、インストラクターが使用を選択した理由がわかりませんか?

  • 何か不足していますか?

あなたの洞察に感謝します。

4

6 に答える 6

11

InputStreamReader と DataInputStream はまったく異なります。

DataInputStream は InputStream サブクラスであるため、バイトを読み書きします。

これは正しくありません。InputStream はバイトのみを読み取り、DataInputStream はそれを拡張するため、Java プリミティブも読み取ることができます。どちらもデータを書き込むことはできません。

質問:コンテンツを読み取る前に、コンテンツの型 (int、string など) を知る必要がありますか? そして、ファイル全体がその 1 つのプリミティブ型で構成される必要があるでしょうか?

DataInputStream は、DataOutputStream によって以前に書き込まれたデータを読み取るためにのみ使用する必要があります。そうでない場合、DataInputStream は読み取っているデータを「理解」する可能性が低く、ランダムなデータを返します。したがって、対応する DataOutputStream によってどのタイプのデータがどの順序で書き込まれたかを正確に把握する必要があります。

たとえば、アプリケーションの状態を保存したい場合 (いくつかの数値で構成されているとしましょう):

public void exit() {
    //...
    DataOutputStream dout = new DataOutputStream(new FileOutputStream(STATE_FILE));
    dout.write(somefloat);
    dout.write(someInt);
    dout.write(someDouble);
}

public void startup() {
    DataInputStream dout = new DataInputStream(new FileInputStream(STATE_FILE));
    //exactly the same order, otherwise it's going to return weird data
    dout.read(somefloat);
    dout.read(someInt);
    dout.read(someDouble);
}

これが基本的に DataInputStream と DataOutputStream の全体像です: プリミティブ変数をストリームに書き込み、それらを読み取ります。

さて、InputStreamReader はまったく別のものです。InputStreamReader は、エンコードされたテキストを Java 文字に「変換」します。基本的に、(エンコーディングを知っている) 任意のテキスト ストリームを使用し、InputStreamReader を使用してそのソースから Java 文字を読み取ることができます。

このアプローチでは、引き続きバイトを読み取ってから、文字を表す整数に変換します。どの整数がどの文字を表すかは、指定された文字セット ("UTF-8" など) によって異なります。

文字エンコーディングは、コード ポイントと文字の間の単純なマッピング以上のものです。さらに、コードポイントがメモリ内でどのように表現されるかを指定します。たとえば、UTF-8 と UTF-16 は同じ文字マッピングを共有しますが、UTF-8 ストリームを UTF-16 として読み取ろうとすると、InputStreamReader は劇的に失敗します。UTF-8 の 4 バイト ('a'、'a'、'b'、'b') で表される文字列 aabb は、2 文字に変換されます。2 つの a と b の値は、1 つの文字と見なされます。私はそれらがどの文字になるかを調べるのが面倒ですが、非常に奇妙です.

InputStreamReader はそのすべてを処理するため、エンコーディングがわかっている場合は (DataInputStream とは異なり) 任意のソースからテキストを読み取ることができます。

質問: DataInputStream が機能するのに、InputStreamReader が機能しないのはどのような場合ですか?

これは今ではかなり明確になっているはずです。両方のクラスの目的はまったく異なるため、この質問をするべきではありません。InputStreamReader は、DataInputStream のようにバイトを整数に変換せ、その目的のために設計されていません。

チュートリアル コードでは、DataInputStream を省略できると確信しています。

BufferedReader reader = new BufferedReader( new InputStreamReader(fis));

ただし、DataInputStream は InputStream と同じメソッドを提供するため、その中に FileInputStream をラップすることは間違いではありません (不要ではありますが)。

于 2014-08-26T17:54:51.703 に答える
0

DataInputStreamint、String、objects などのバイナリ ファイルから単純なデータを読み取るためのものですDataInputStreamInputStreamReaderバイトストリームから文字ストリームに変換するためのものです。

サンプルコードに関する限り、これは次のとおりです。

FileInputStream fis = ...;
BufferedReader reader = new BufferedReader(
    new InputStreamReader( 
        new DataInputStream(fis)
    )
);

この:

FileInputStream fis = ...;
BufferedReader reader = new BufferedReader(
    new InputStreamReader(fis)
);

最初のものは少し効率が悪いことを除いて、まったく同じことを行います。

于 2014-08-26T17:38:36.073 に答える
0

DataInputStreamたとえば、4 バイトを 32 ビット整数として読み取るなど、バイナリ データを読み取る追加のメソッドがあります。それはまだInputStreamです。

は、バイト ストリームであるをInputStreamReader受け取りInputStream、エンコーディングを使用して文字ストリーム (リーダー) に変換します。テキストファイルに使用できます。

DataInputStreamの動作は変わらないため、両方を組み合わせても効果はありませんInputStream

于 2014-08-26T17:55:23.997 に答える