0

問題は、それを使って文字を書くFileOutputStreamと読めることです。しかし、それをチェーンするとDataOutputStream、書き込まれたデータが読み取れなくなります。

何故ですか ?両方ともファイルにバイト単位で書き込むためFileOutputStreamDataInputStream処理はどのように正確に行われますか?

コード:

File newFile = new File("C:\\Jeevantest.as");
FileOutputStream outFp = new FileOutputStream(newFile);
outFp.write('X');
outFp.close();

In the file Jeevantest.as, the char 'X' can be seen. 

File newFile = new File("C:\\Jeevantest.as");
FileOutputStream outFp = new FileOutputStream(newFile);
DataOutputStream dp = new DataOutputStream(outFp);
dp.writeChar('J');
outFp.close();

この場合、次の出力が表示されます。

出力

理由を理解する必要がありますか?

4

6 に答える 6

1

writeChar は、char を UTF-16 エンコーディングの 2 バイト値として書き込みます。「J」の場合は00 4Aです。正しく表示するには、正しいエンコーディングを使用する必要があります

于 2014-02-20T07:56:53.227 に答える
1

DataOutputStream移植可能な方法でプリミティブを格納するために使用されます。
char がストリームに書き込まれる方法を見てください

public final void writeChar(int v) throws IOException {
  out.write((v >>> 8) & 0xFF);
  out.write((v >>> 0) & 0xFF);
  incCount(2);
}

char は 2 バイトを使用して、上位バイトが最初に書き込まれます。hi-byte は 0 (あなたの場合は 'J' => 004A) であるため、結果はファイルに表示されるものです。

于 2014-02-20T07:59:40.680 に答える
1

違いは ではなく、OutputStreams使用している書き込み方法にあります。それらは異なります。最初の例では を使用dp.write()し、2 番目の例では を使用しますdp.writeChar()

2 番目の例を に変更dp.writeChar()するdp.write()と、結果は期待どおりになります。

java.io.DataOutputStream.writeChar(int)メソッドは次のように実装されます。

public final void writeChar(int v) throws IOException {
    out.write((v >>> 8) & 0xFF);
    out.write((v >>> 0) & 0xFF);
    incCount(2);
}

のソースコードを参照writeChar(int)

whilejava.io.DataOutputStream.write(int)には次の実装があります。

 public synchronized void write(int b) throws IOException {
     out.write(b);
     incCount(1);
 }

のソースコードを参照write(int)

于 2014-02-20T07:52:36.020 に答える
0
File newFile = new File("C:\\Jeevantest.as");
FileOutputStream outFp = new FileOutputStream(newFile);
DataOutputStream dp = new DataOutputStream(outFp);
dp.writeChars("J");
outFp.close();
dp.close();
  • まず、writeChar は int 引数を取るため、文字列を渡す必要がある場合は、使用する必要がありますwriteChars(String arg)
  • dp ストリームを閉じます。
于 2014-02-20T07:58:52.523 に答える
0

ストリームはバイナリ データで構成され、個々の値の型やストリーム内の開始位置を示すものは何もありません。そのため、DataInputStream を使用してのみ読み取ることができます。詳細については、このリンクを確認してください http://docs.oracle.com/javase/tutorial/essential/io/datastreams.html

于 2014-02-20T08:16:23.667 に答える
0

ストリームはバイナリ データで構成され、個々の値の型やストリーム内の開始位置を示すものは何もありません。そのため、DataInputStream を使用してのみ読み取ることができます。詳細については、このオラクルの公式チュートリアルを確認してください: http://docs.oracle.com/javase/tutorial/essential/io/datastreams.html

于 2014-02-20T08:05:54.933 に答える