私が出力されるように、同じデータにDataOutputStream
とObjectOutputStream
の出力を比較しようとしています:同じデータ上の `DataOutputStream`と` ObjectOutputStream`の出力が異なるのはなぜですか?
Random random = new Random();
int[] numbers = new int[100];
for (int i=0; i<100; i++){
numbers[i] = random.nextInt();
}
System.out.println("Output");
try(FileOutputStream fout = new FileOutputStream("Object.txt");
ObjectOutputStream oout = new ObjectOutputStream(fout)){
oout.writeObject(numbers);
} catch (IOException e){
System.err.println(e);
}
System.out.println("Output");
try(FileOutputStream fout = new FileOutputStream("Data.txt");
DataOutputStream dout = new DataOutputStream(fout)){
for (int i=0; i<100; i++){
dout.writeInt(numbers[i]);
}
} catch (IOException e){
System.err.println(e);
}
なぜ彼らが作成したファイルが異なるのですか?
$ diff Data.txt Object.txt
Binary files Data.txt and Object.txt differ
両方の出力ストリームがバイナリでデータを書き込むのではありませんか?彼らの出力は同じでなければならないのではないでしょうか?
ありがとうございました。
ObjectOutputStream 'writeObject'はデータではなく、ObjectInputStreamを読み込んでオブジェクトに復元できるオブジェクトのシリアル化されたバージョンを書き込みます。そしてシリアル化されたバージョンは、オブジェクト内のデータだけではありません。基本的なJavaのドキュメントを最初に読んでください:-) – Vadim
ありがとう。 「シリアライズ版はオブジェクト内のデータだけではない」と私は思った。何が良い読み物ですか? –
これは、Serializable InterfaceとwriteObjectメソッドに関する標準のJavaDoc APIですが、実際に詳細を知る必要はありますか? writeObjectによって生成されたファイルを見てください。私はそれで十分だろうと思う。ほとんどの場合、writeObject/readObjectを使用する必要はありません。制限があります - オブジェクトはSerializableインターフェイスを実装する必要があります。オブジェクトを書き込んだり読み込んだりすると、JDK/JREのバージョンが同じである必要があります。Java 8でオブジェクトを書き込むと、Java 7 ...などで読み込めません。シリアル化されたオブジェクトの代わりに必要なデータを保持する方がはるかに優れています。 – Vadim