【问题标题】:Why Bytes written by writeByte() of DataOutputStream and writeByte() of ObjectOutputStream are different?为什么 DataOutputStream 的 writeByte() 和 ObjectOutputStream 的 writeByte() 写入的字节不同?
【发布时间】:2017-02-13 23:18:07
【问题描述】:

因为 writeByte() 的目的在两个类中是相同的。但两者都在写不同的内容。

import java.io.*;
class First
{
        public static void main(String[] args) throws IOException
        {
                FileOutputStream fos = new FileOutputStream("b.txt");
Line 1:         ObjectOutputStream oos = new ObjectOutputStream(fos);
Line 2:         DataOutputStream oos = new DataOutputStream(fos);
                oos.writeByte(65);
                oos.close();
                FileInputStream fis = new FileInputStream("b.txt");
                int x=0;
                System.out.println("Output");
                while((x=fis.read())!=-1)
                {
                        System.out.println(x);
                }
                fis.close();
        }
}

如果第 1 行被注释掉,则输出为:

65

如果第 2 行被注释掉,输出为:

172
237
0
5
119
1
65

为什么会有这种差异?

【问题讨论】:

  • 阅读ObjectOutputStream Javadoc的最后一段。最重要的是,您的代码缺少所有必要的 close 语句。
  • 应该有更多的输出。 ObjectOutputStream 应该以 0xAC 和流标头的其余部分开头,并以 65 字节结束。您忘记关闭输出流。
  • @EJP 谢谢,我更正了。

标签: java io objectoutputstream dataoutputstream


【解决方案1】:

对象流用于写入对象。这意味着它具有格式信息来说明您编写的内容以及您编写的数据。对象流在开始时还有一个标头,用于检查数据是否为对象流。

数据流只写入您要求它写入的数据。没有额外的信息。

顺便说一句,如果您想查看写入 Stream 的内容,您可以写入 ByteArrayOutputStream 并在完成后调用 toByteArray()。无需将其写入您必须读回的文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-13
    • 1970-01-01
    • 2012-07-16
    • 2012-09-14
    • 1970-01-01
    • 2016-02-23
    • 2012-10-17
    • 2017-04-10
    相关资源
    最近更新 更多