java - 为什么相同数据上 `DataOutputStream` 和 `ObjectOutputStream` 的输出不同?

标签 java

我试图在要输出的相同数据上比较 DataOutputStreamObjectOutputStream 的输出:

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 写入可序列化的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“Serialized”类对象。

DataOutputStream、DataInputStream可以写入和读取java原始值(int、boolean、char、double、float、short)

因此,如果您想编写java类对象,请使用ObjectOutputStream,或者只是编写原始值,请使用DataOutputStream。

关于java - 为什么相同数据上 `DataOutputStream` 和 `ObjectOutputStream` 的输出不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47434742/

相关文章:

java - 使用 Jackson 使用循环创建 Json 字符串

java - 在此代码中如何选择一种方法而不是另一种方法?

java - java中的时间戳转换

java - 反序列化 bean 需要范围依赖

java - Spring 无法找到 JpaRepository

java - 在 mssql 的情况下,metadata.getTables 结果集为空

java - 如何允许桌面应用程序在同一台机器上调用 Java 应用程序的方法

java - Spring 启动测试: Is it a good idea to have Application class per module?

java - Tapestry 5.3 - 表单验证跟踪器

java - 如何限制JVM的创建?