FileOutputStream和DataOutput Stream的问题

时间:2014-02-20 07:40:16

标签: java dataoutputstream filestreams

问题是当我使用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();

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

Output

需要明白为什么?

6 个答案:

答案 0 :(得分: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)

的源代码

java.io.DataOutputStream.write(int)有以下实施:

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

请参阅write(int)

的源代码

答案 1 :(得分:1)

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

答案 2 :(得分:1)

DataOutputStream用于以便携方式存储基元 看看如何将字符写入流

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

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

答案 3 :(得分: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流。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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