关于DataOutputStream的困惑

时间:2012-10-23 06:57:57

标签: java dataoutputstream inputstreamreader

我编写了下面的代码来熟悉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();
}

2 个答案:

答案 0 :(得分:1)

计算机中的所有数据都是二进制的。一些二进制数据可能是可读文本,这就是你的情况。

writeChars方法将String的每个char写为两个字节。如果您在十六进制查看器中打开文件,您会发现在每个字母的ASCII代码之前有一个NUL(00)字节。当您在文本编辑器中打开文件时,它会将文件中的字节解释为文本,因为这是文本编辑器所做的事情:读取一堆(二进制)数据并将其作为文本显示给您。

编辑器如何做到这一点取决于编辑器。它跳过NUL字节并仅显示可读字节,或将字节解释为以UTF-16LE编码的文本。

答案 1 :(得分:0)

由于您使用writeChars(),因此只输出字符。要小心,因为只有换行符分割数据。在字符串中间插入另一个换行符可能会导致问题。以下是可能感兴趣的docs中的一些内容:

  

将字符串作为字符序列写入基础输出流。每个字符都写入数据输出流,就像writeChar方法一样。如果没有抛出异常,则写入的计数器将增加s长度的两倍。