0

问题是当我使用FileOutputStream它写一个字符时是可读的。但是当我将它与DataOutputStream写入的数据链接时变得不可读。

这是为什么 ?由于两者都FileOutputStreamDataInputStream字节为单位写入文件。处理将如何进行?

代码:

File newFile = new File("C:\\Jeevantest.as");
FileOutputStream outFp = new FileOutputStream(newFile);
outFp.write('X');
outFp.close();

In the file Jeevantest.as, the char 'X' can be seen. 

File newFile = new File("C:\\Jeevantest.as");
FileOutputStream outFp = new FileOutputStream(newFile);
DataOutputStream dp = new DataOutputStream(outFp);
dp.writeChar('J');
outFp.close();

在这种情况下,将显示以下输出:

输出

需要了解为什么?

4

6 回答 6

1

区别不在于OutputStreams您使用的写入方法,而在于您使用的写入方法:它们不同。在您使用的第一个示例dp.write()中,在您的第二个示例中使用dp.writeChar().

在您的第二个示例中更改dp.writeChar()dp.write(),结果将符合预期。

java.io.DataOutputStream.writeChar(int)方法实现如下:

public final void writeChar(int v) throws IOException {
    out.write((v >>> 8) & 0xFF);
    out.write((v >>> 0) & 0xFF);
    incCount(2);
}

见源代码writeChar(int)

whilejava.io.DataOutputStream.write(int)有以下实现:

 public synchronized void write(int b) throws IOException {
     out.write(b);
     incCount(1);
 }

见源代码write(int)

于 2014-02-20T07:52:36.020 回答
1

writeChar 将 char 写入 UTF-16 编码的 2 字节值。在“J”的情况下,它是00 4A。要正确显示它,您需要使用正确的编码

于 2014-02-20T07:56:53.227 回答
1

DataOutputStream用于以可移植的方式存储原语。
看看如何将 char 写入流

public final void writeChar(int v) throws IOException {
  out.write((v >>> 8) & 0xFF);
  out.write((v >>> 0) & 0xFF);
  incCount(2);
}

一个 char 使用 2 个字节写入,首先是高字节。因为高字节为 0(在您的情况下为 'J' => 004A),所以结果就是您在文件中看到的内容。

于 2014-02-20T07:59:40.680 回答
0
File newFile = new File("C:\\Jeevantest.as");
FileOutputStream outFp = new FileOutputStream(newFile);
DataOutputStream dp = new DataOutputStream(outFp);
dp.writeChars("J");
outFp.close();
dp.close();
  • 首先 writeChar 接受 int 参数所以,如果你需要传递一个你需要使用的字符串writeChars(String arg)
  • 关闭 dp 流。
于 2014-02-20T07:58:52.523 回答
0

流由二进制数据组成,没有任何内容表明单个值的类型,或者它们在流中的开始位置。所以它只能使用 DataInputStream 读取。查看此 oracle 官方教程以获取更多信息: http ://docs.oracle.com/javase/tutorial/essential/io/datastreams.html

于 2014-02-20T08:05:54.933 回答
0

流由二进制数据组成,没有任何内容表明单个值的类型,或者它们在流中的开始位置。所以它只能使用 DataInputStream 读取。检查此链接以获取更多信息 http://docs.oracle.com/javase/tutorial/essential/io/datastreams.html

于 2014-02-20T08:16:23.667 回答