0

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

2 回答 2

1

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

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

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

于 2012-10-23T07:27:52.870 回答
0

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

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

于 2012-10-23T07:03:19.930 回答