我目前正在学习java的基本I / O.请参阅以下代码:
import java.io.DataOutputStream;
import java.io.IOException;
public class TestIO {
public static void main(String[] args) {
try(DataOutputStream out=new
DataOutputStream(new FileOutputStream("e:\\ccc.txt"))){
out.writeShort(67);
out.writeChar(67);
}catch(IOException ex){
ex.printStackTrace();
}
}
}
在输出ccc.txt文件中,我得到以下输出:
C C
据我所知,两种方法都将两个字节写入输出流,二进制字符串67为1000011,表示ASCII或任何其他代码中的大写字母C. C之前的空格是方法读取的字节0000 0000。
然而,如果两个方法都只是向输出流写入两个字节,那么两个方法之间的区别是什么?我期望writeShort可以将两个字节写入输出流然后将其传回整数。换句话说,如何直接将整数67写入文件,而不是将其转换为字符?
让我以不同的方式提出这个问题,这两种方法在什么情况下会产生不同的结果?我需要一个现实世界的例子。谢谢!
答案 0 :(得分:1)
但是,如果它们都只是将两个字节写入输出流,那么两种方法之间的区别是什么?
这听起来很陈腐,但是:一个需要char
,另一个需要short
。这些类型不能相互转换,您可以在不同时间使用它们。即使char
只是一个16位无符号整数,它的预期用途是UTF-16代码单元;你不会(或者至少不应该)使用它来存储你想到的数字......而short
则相反。
因此,如果您要编写char
,请使用writeChar
。如果您有short
,请使用writeShort
。在这两种情况下,您都希望使用相应的方法阅读。
答案 1 :(得分:0)
writeShort(int v)
将两个字节写入输出流以表示参数的值。
writeChar(int v)
将char值(由两个字节组成)写入输出流。
您可以使用:
writeInt(int v)
将一个由四个字节组成的int值写入输出流。
答案 2 :(得分:0)
我怀疑混淆来自于尝试使用设计用于编写二进制文件的类来编写文本。如果要写/读文本,请使用Writer / Reader类。如果你想要二进制使用OutputStream / InputStream。
PrintWriter pw = new PrintWriter("ccc.txt");
pw.println('C');
pw.println(67);
pw.close();
将生成一个类似
的文件C
67
但实际上你已经编写了一个包含字节67,19,16,54,55,19,16的文件,即它现在是7个字节长。
如果两个方法都只是将两个字节写入输出流,那么它们之间的区别是什么?
在这种情况下,他们完全一样。区别仅在于readChar / readShort。
public final void writeChar(int v) throws IOException {
out.write((v >>> 8) & 0xFF);
out.write((v >>> 0) & 0xFF);
incCount(2);
}
public final void writeShort(int v) throws IOException {
out.write((v >>> 8) & 0xFF);
out.write((v >>> 0) & 0xFF);
incCount(2);
}
你可以看到代码是一样的。
我原以为writeShort可以将两个字节写入输出流,然后将其传回整数。
文件只包含一个字节流。
换句话说,如何直接将整数67写入文件,而不是将其转换为字符?
这就是你在做什么。文件只包含字节。当您阅读文本时,您将这些字节转换为char
s或short
s或int
s,具体取决于您的阅读方式。
答案 3 :(得分:0)
通常,您不希望使用writeChar()
将文本数据写入输出流。您需要使用具有正确编码的Writer。
如果由于某种原因需要输出二进制16位有符号整数,可以使用writeShort
,但如果确实需要那么多控制,则可能需要使用ByteBuffer。< / p>