0

DataOutputStreamに慣れるために、以下のコードを記述しました。データを出力するファイルには、ある種の11010111バイナリがあると思いますが、代わりに、読み取り可能な文字列がいくつかあります。私の質問は、DataOutputStreamがデータの出力に使用されている間、ファイルにバイナリデータがあるべきではないかということです。

コード:

FileOutputStream fos = null;
try {
    fos = new FileOutputStream("myData.dat");
} catch (FileNotFoundException e) {
    System.out.println("File Not Found!!");
    System.exit(-1);
}
DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(fos));
try {
    dos.writeChars("HELLO WORLD!!!\n");
    dos.writeChars("HELLO PRETTIES!!!\n");
    dos.writeChars("HELLO KITTY!!!");
    dos.flush();
    dos.close();
    fos.close();
} catch (IOException e1) {
    e1.printStackTrace();
}
FileInputStream fis = null;
try {
    fis = new FileInputStream("myData.dat");
} catch (FileNotFoundException e) {
    System.out.println("File Not Found!!");
    System.exit(-1);
}
BufferedReader br = new BufferedReader(new InputStreamReader(
        new DataInputStream(fis)));
String s;
try {
    while ((s = br.readLine()) != null) {
        System.out.println(s);
    }
    br.close();
    fis.close();
} catch (IOException e) {
    e.printStackTrace();
}
4

2 に答える 2

1

コンピューター内のすべてのデータはバイナリです。一部のバイナリデータ読み取り可能なテキストである可能性があり、これがあなたの場合に起こります。

このメソッドは、各文字列を2バイトとしてwriteChars書き込みます。charファイルを16進ビューアで開いた場合00、各文字のASCIIコードの前にNUL()バイトがあることがわかります。テキストエディタでファイルを開くと、ファイル内のバイトがテキストとして解釈されます。これは、テキストエディタが行うことであるためです。つまり、一連の(バイナリ)データを読み取り、テキストとして表示します。

編集者がこれをどのように行うかは、編集者によって異なります。NULバイトをスキップして読み取り可能なバイトのみを表示するか、UTF-16LEでエンコードされたテキストとしてバイトを解釈します。

于 2012-10-23T07:27:52.870 に答える
0

使用writeChars()するので、文字のみを出力します。改行文字のみがデータを分割するため、注意してください。文字列の途中に別の改行を挿入すると、問題が発生する可能性があります。興味があるかもしれないドキュメントのいくつかはここにあります:

文字列を文字のシーケンスとして基になる出力ストリームに書き込みます。各文字は、writeCharメソッドのようにデータ出力ストリームに書き込まれます。例外がスローされない場合、書き込まれるカウンターはsの長さの2倍にインクリメントされます。

于 2012-10-23T07:03:19.930 に答える