java.io.DataOutputStream类中的writeChar方法和writeShort方法有什么区别?

java.io.DataOutputStream类中的writeChar方法和writeShort方法有什么区别?,java,io,outputstream,Java,Io,Outputstream,我目前正在学习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"))){

我目前正在学习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
我知道这两种方法都将两个字节写入outputstream,67的二进制字符串是1000011,表示ASCII或任何其他代码中的大写字母C。C之前的空格是方法读取的字节0000 0000

但是,如果这两种方法都只是将两个字节写入outputstream,那么它们之间的区别是什么?我希望writeShort可以将两个字节写入outputstream,然后将其传输回integer。换句话说,我如何直接将整数67写入文件,而不是将其转换为字符


让我用另一种方式问这个问题,在什么情况下这两种方法能产生不同的结果?我需要一个真实的例子。谢谢

writeShort(int v) 
将两个字节写入输出流以表示参数的值

writeChar(int v) 
将由两个字节组成的char值写入输出流

您可以使用:

writeInt(int v) 
将由四个字节组成的int值写入输出流

但是,如果这两种方法都只是向outputstream写入两个字节,那么它们之间的区别是什么

这听起来很老套,但是:一个使用
char
,另一个使用
short
。这些类型不能相互转换,您可以在不同的时间使用它们。尽管
char
只是一个16位无符号整数,但它的预期用途是用于UTF-16代码单元;您不会(或至少不应该)使用它来存储您认为是数字的值。。。对于
short
,情况正好相反


因此,如果您想编写一个
char
,请使用
writeChar
。如果您有一个
short
,请使用
writeShort
。在这两种情况下,您都希望使用相应的方法进行阅读。

我怀疑这种混淆来自于试图使用设计用于编写二进制文件的类来编写文本。如果您想写/读文本,请使用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个字节长

如果这两种方法都只向outputstream写入两个字节,那么它们之间的区别是什么

在这种情况下,他们做了完全相同的事情。这种差异只对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可以将两个字节写入outputstream,然后将其传输回integer

一个文件只包含一个字节流

换句话说,我如何直接将整数67写入文件,而不是将其转换为字符


这就是你正在做的。文件只包含字节。当您读取文本时,您正在将这些字节转换为
char
s或
short
s或
int
s,具体取决于您读取它们的方式。

通常,您不希望使用
writeChar()
将文本数据写入输出流。您需要使用具有正确编码的


如果出于某种原因需要输出一个二进制16位有符号整数,可以使用
writeShort
,但如果确实需要那么多控件,则可能需要使用a来代替。

请注意,有些编码中67不是
C
的编码形式。但是在Java中,
'C'
的值总是67,因为它总是UTF-16。@Ingo,实际上writeShort(33333)没有给出编译时错误?有什么想法吗?@user3225698这可能是因为参数被声明为int。如果writeChar的参数也被声明为int,那么您将无法产生不同的结果。如果它是char,那么试试writeChar(77777)。@user3225698它实际上是int,但可以这样想:如果Java被更改为char使用3个字节,那么它将产生不同。一个人不需要像这样逆向思考:我想写2个字节,使用哪种方法?(在这种情况下,使用writeByte两次)但是:我需要写一个X,所以我使用writeX方法。谢谢。我以前读过源代码。我的困惑是:在现实世界中,在什么情况下,这两种方法会产生不同的结果?如果它们完全相同,为什么还要麻烦使用两种方法?@user3225698您会使用哪种方法,您会如何称呼它?因此很明显,您可以编写
short
char
?如果我有
readShort
readChar
我会使用哪种写入方法?谢谢你的帮助answer@user3225698它很可能是为了使文档和使用保持简单。如果您开始说只有一种方法,那么开发人员就会开始问,为什么有一种写方法和两种读方法,以及当我将我的字符作为短ETC写入时会发生什么情况更正
writehort
->
writeShort