问题是当我使用FileOutputStream
写一个字符时,它是可读的。
但当我用DataOutputStream
链接它时,书面数据变得不可读。
为什么?由于FileOutputStream
和DataInputStream
都以字节为单位写入文件。处理究竟会如何发生?
代码:
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();
在这种情况下,显示以下输出:
需要明白为什么?
答案 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);
}
的源代码
而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();
writeChars(String arg)
答案 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