我知道在编写文本时应该使用编写器代替输出流,但我仍然不明白为什么在运行此程序后文件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,包括一些无法识别的文本。那是为什么?
答案 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编码。