2014-02-13 39 views
0

我目前正在学习java的基本I/O。请看下面的代码:java.io.DataOutputStream类中的writeChar方法和writeShort方法之间有什么区别?

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。

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


让我以不同的方式提出这个问题,在什么情况下这两种方法会产生不同的结果?我需要一个真实世界的例子。谢谢!

+0

请注意,有一些编码,其中67 *不是* C的编码形式。但在Java中,''C''将总是*的值为67,因为它总是UTF-16。 –

+0

@Ingo,其实writeShort(33333)没有给出编译时错误?对此有何想法? –

+0

@ user3225698这可能是因为参数声明为int。如果writeChar的参数也被声明为int,那么你将无法产生不同的结果。如果是char,则尝试writeChar(77777)。 – Ingo

回答

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或ints。

+0

谢谢。我以前阅读过源代码。我的困惑是:在现实世界中,在什么情况下,这两种方法会产生不同的结果?如果它们是完全相同的,为什么还要有两种方法呢? –

+0

@ user3225698你会拥有哪种方法,你会怎么称呼它,所以很明显你可以写一个'short'或者'char'?如果我有'readShort'和'readChar'我会用哪种写法? –

+0

感谢您的回答 –

0
writeShort(int v) 

将两个字节写入输出流以表示参数的值。

writeChar(int v) 

将一个由两个字节组成的char值写入输出流。

可以使用:

writeInt(int v) 

写入一个int值,这是由四个字节组成,输出流。

1

但是,如果两种方法都只是将两个字节写入输出流,那么两种方法之间有什么区别?

这听起来很老套,但是:一个需要char,另一个需要short。这些类型不能相互转换,并在不同的时间使用它们。尽管char只是一个16位无符号整数,但它的预期用途是UTF-16编码单元;你不会(或者至少不应该)使用它来存储认为作为数字的值......而short则相反。

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

+0

更正了' writeHsort' - >'writeShort' – Ingo

0

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

如果由于某种原因需要输出二进制16位有符号整数,则可以使用writeShort,但如果您确实需要这么多控制,则可能需要使用ByteBuffer

相关问题