基于字节和基于字符的OutputStream

时间:2015-04-24 13:55:29

标签: java file io

我必须创建一个应用程序,生成10000个整数,其随机值从0到100000,并将其写入本地系统上的文件。我必须以两种不同的方式完成它 - 使用字节流和字符流,并比较生成的文件的大小。这些文件出现时非常奇怪,而且大小也一样。这是怎么回事?

基于字节的流:

    Random rd = new Random();
    File outFile = new File( "Byte-based Stream.txt" );
    FileOutputStream fos = new FileOutputStream(outFile);

    for(int i=0;i<10000;i++){
        fos.write(rd.nextInt(100001));
    }

    fos.flush();
    fos.close();

基于字符的流:

    Random rd = new Random();
    File outFile = new File( "Character-based Stream.txt" );
    FileWriter fos = new FileWriter(outFile);

    for(int i=0;i<10000;i++){
        fos.write(rd.nextInt(100001));
    }

    fos.flush();
    fos.close();

3 个答案:

答案 0 :(得分:1)

正如您在问题中所提到的那样FileWriterFileOutputStream写入二进制文件(字节流)时写入字符。

计算机中的所有东西确实都是位,但编码。 FileWriter将字符写为人类可读编码,而FileOutputStream写入字节流。

大小相同,因为每个字符的默认编码应该有32位,而java中的整数每个数字也有32位。

另见

<强> FileOutputStream

<强> FileWriter

<强> Primitive Data Types

<强> Comparison of Unicode encodings

答案 1 :(得分:1)

FileOutputStream.write只会写出single byte

同样,FileWriter.write只会写出single character

即使他们都使用int,他们也不会写出int。相反,你必须使用

int rn = rd.nextInt( 1000001 );
byte[ ] bytes = new byte[ ] {
    ( byte ) ( ( rn >>>  0 ) & 0xFF ),
    ( byte ) ( ( rn >>>  8 ) & 0xFF ),
    ( byte ) ( ( rn >>> 16 ) & 0xFF ),
    ( byte ) ( ( rn >>> 24 ) & 0xFF )
};
fileos.write( bytes );

代表FileOutputStream

fos.write( Integer.toString( rd.nextInt( 100001 ) ) );

代表FileWriter

答案 2 :(得分:1)

FileWriter是一个使用默认平台编码(= unportable)的旧实用程序类。看起来你有一个单字节编码,因此大小相同。

以下

PrintWriter fos = new PrintWriter(outFile, "UTF-16LE");

应该加倍。

BTW字节版本使用低位字节(& 0xFF)。