我编写了下面的代码来熟悉DataOutputStream。我想在我输出数据的文件中会有某种11010111
二进制文件,而只有一些可读字符串。我的问题是:当DataOutputStream用于输出数据时,文件中不应该有二进制数据吗?
代码:
FileOutputStream fos = null;
try {
fos = new FileOutputStream("myData.dat");
} catch (FileNotFoundException e) {
System.out.println("File Not Found!!");
System.exit(-1);
}
DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(fos));
try {
dos.writeChars("HELLO WORLD!!!\n");
dos.writeChars("HELLO PRETTIES!!!\n");
dos.writeChars("HELLO KITTY!!!");
dos.flush();
dos.close();
fos.close();
} catch (IOException e1) {
e1.printStackTrace();
}
FileInputStream fis = null;
try {
fis = new FileInputStream("myData.dat");
} catch (FileNotFoundException e) {
System.out.println("File Not Found!!");
System.exit(-1);
}
BufferedReader br = new BufferedReader(new InputStreamReader(
new DataInputStream(fis)));
String s;
try {
while ((s = br.readLine()) != null) {
System.out.println(s);
}
br.close();
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
答案 0 :(得分:1)
计算机中的所有数据都是二进制的。一些二进制数据可能是可读文本,这就是你的情况。
writeChars
方法将String的每个char
写为两个字节。如果您在十六进制查看器中打开文件,您会发现在每个字母的ASCII代码之前有一个NUL(00
)字节。当您在文本编辑器中打开文件时,它会将文件中的字节解释为文本,因为这是文本编辑器所做的事情:读取一堆(二进制)数据并将其作为文本显示给您。
编辑器如何做到这一点取决于编辑器。它跳过NUL字节并仅显示可读字节,或将字节解释为以UTF-16LE编码的文本。
答案 1 :(得分:0)
由于您使用writeChars()
,因此只输出字符。要小心,因为只有换行符分割数据。在字符串中间插入另一个换行符可能会导致问题。以下是可能感兴趣的docs中的一些内容:
将字符串作为字符序列写入基础输出流。每个字符都写入数据输出流,就像writeChar方法一样。如果没有抛出异常,则写入的计数器将增加s长度的两倍。