ObjectOutputStream写入额外的字符

时间:2014-03-13 11:12:15

标签: java file outputstream writer

我知道在编写文本时应该使用编写器代替输出流,但我仍然不明白为什么在运行此程序后文件outputStream.txt中有额外的字符:

public static void main(String[] args) throws FileNotFoundException, IOException
    {
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("C:\\Data\\tmp\\outputStream.txt")));
        oos.writeObject("SomeObject");
        oos.writeUTF("SomeUTF");
        oos.flush();
        oos.close();
        BufferedWriter writer = new BufferedWriter(new FileWriter(new File("C:\\Data\\tmp\\outputWriter.txt")));
        writer.write("SomeObject");
        writer.write("SomeUTF");
        writer.flush();
        writer.close();
    }

文件outputWriter.txt正如预期的那样是17字节,但outputStream.txt是28,包括一些无法识别的文本。那是为什么?

3 个答案:

答案 0 :(得分:7)

ObjectOutputStream用于将Java对象写入流。这意味着不会将String的值写入流中;相反,如果会写"下一个对象是String,其值为SomeObject"。

因此,如果您需要纯文本文件,则必须使用Writer API。

注意:您的代码取决于平台。如果您想使其与平台无关,那么您必须使用:

    FileOutputStream stream = new FileOutputStream( file );
    return new BufferedWriter( new OutputStreamWriter( stream, Charset.forName("UTF-8") ) );

答案 1 :(得分:1)

outputStream.txt文件包含" SomeObject"的二进制(流)格式。在对象序列化中。这可以使用ObjectInputStream作为原始对象回读。这称为反序列化过程。

但是,BufferedWriter以文本格式写入数据与序列化无关。因此,在回读时,您需要阅读文本,并且必须手动重新创建对象。

答案 2 :(得分:0)

ObjectOutputStream写入二进制数据。

来自API:

public void writeUTF(String str) throws IOException
  

以修改的UTF-8格式写入此String的原始数据。

额外字节可能来自修改后的UTF-8编码。