Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 基于字节和基于字符的输出流_Java_File_Io - Fatal编程技术网

Java 基于字节和基于字符的输出流

Java 基于字节和基于字符的输出流,java,file,io,Java,File,Io,我必须制作一个应用程序,生成10000个随机值为0到100000的整数,并将其写入本地系统上的文件。我必须用两种不同的方法来做——字节流和字符流,并比较生成文件的大小。这些文件带有非常奇怪的字符,大小相同。应该是这样吗 基于字节的流: Random rd = new Random(); File outFile = new File( "Byte-based Stream.txt" ); FileOutputStream fos = new FileOutputStrea

我必须制作一个应用程序,生成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();
Random rd=new Random();
File outFile=新文件(“基于字节的Stream.txt”);
FileOutputStream fos=新的FileOutputStream(输出文件);

如您在问题
FileWriter
中所述,for(int i=0;i写入字符,而
FileOutputStream
写入二进制文件(字节流)

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

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

另请参见


文件输出流。write
只写一个输出

类似地,
FileWriter.write
只写一个输出

即使它们都使用
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

而言,FileWriter是一个使用默认平台编码(=不可移植)的旧实用程序类。您似乎使用单字节编码,因此大小相同

以下

PrintWriter fos = new PrintWriter(outFile, "UTF-16LE");
应该是原来的两倍


顺便说一句,字节版本使用低阶字节(
&0xFF
)。

不,首先,我认为应该在基于字符的版本中看到纯文本中的数字