2017-11-22 5 views
0

私が出力されるように、同じデータにDataOutputStreamObjectOutputStreamの出力を比較しようとしています:同じデータ上の `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 

両方の出力ストリームがバイナリでデータを書き込むのではありませんか?彼らの出力は同じでなければならないのではないでしょうか?

ありがとうございました。

+1

ObjectOutputStream 'writeObject'はデータではなく、ObjectInputStreamを読み込んでオブジェクトに復元できるオブジェクトのシリアル化されたバージョンを書き込みます。そしてシリアル化されたバージョンは、オブジェクト内のデータだけではありません。基本的なJavaのドキュメントを最初に読んでください:-) – Vadim

+0

ありがとう。 「シリアライズ版はオブジェクト内のデータだけではない」と私は思った。何が良い読み物ですか? –

+0

これは、Serializable InterfaceとwriteObjectメソッドに関する標準のJavaDoc APIですが、実際に詳細を知る必要はありますか? writeObjectによって生成されたファイルを見てください。私はそれで十分だろうと思う。ほとんどの場合、writeObject/readObjectを使用する必要はありません。制限があります - オブジェクトはSerializableインターフェイスを実装する必要があります。オブジェクトを書き込んだり読み込んだりすると、JDK/JREのバージョンが同じである必要があります。Java 8でオブジェクトを書き込むと、Java 7 ...などで読み込めません。シリアル化されたオブジェクトの代わりに必要なデータを保持する方がはるかに優れています。 – Vadim

答えて

2

ObjectOutputStreamは、シリアル化可能なJavaオブジェクトを書き込みます。 ObjectInputputStreamで読み込むと、javaオブジェクトが返されます。

DataOutputStream書き込みバイトとDataInputputStream読み出しバイト。ここで

class MyClass implements Serializable { 
    String myData = "Hello?"; 
    int myInt = 12345; 
    long myLong = 12412412412L; 
} 

変則)直列化可能クラスです。

try { 

     ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("datafile")); 

     MyClass myClass = new MyClass(); 

     oos.writeObject(myClass); 

     ObjectInputStream ois = new ObjectInputStream(new FileInputStream("datafile")); 

     MyClass read = (MyClass) ois.readObject(); 

    } catch (IOException | ClassNotFoundException e) { 
     e.printStackTrace(); 
    } 

ObejectOutputStreamでは、ObjectInputStreamを使用すると、Javaの「Serializable」クラスオブジェクトを作成して読み取ることができます。

DataOutputStreamを、DataInputStreamのは、Javaプリミティブ値(int型、boolean型、char型、ダブル、フロート、短い)を読み書きすることができます

だから、JavaのクラスオブジェクトはObjectOutputStreamのを使用し、書き込み、または単にプリミティブ値はDataOutputStreamをを使用して書きたい場合。

+0

ありがとうございます。 (1)シリアル化は 'ObjectOutputStream.writeObject'だけでできますか?他のIOストリームクラスのメソッドではありませんか? (2) 'ObjectOutputStream.writeObject()'が 'DataOutputStream'のメソッドに関して行うことをシミュレートできますか?だから私はその違いをよりよく理解することができます。 –

+0

主な違いは、DataOutputStreamではプリミティブなJavaデータ型を記述できますが、ObjectOutputStreamはJavaオブジェクトのグラフを記述することも可能です。 –

関連する問題