我必须创建一个应用程序,生成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();
答案 0 :(得分:1)
正如您在问题中所提到的那样FileWriter
在FileOutputStream
写入二进制文件(字节流)时写入字符。
计算机中的所有东西确实都是位,但编码。 FileWriter
将字符写为人类可读编码,而FileOutputStream
写入字节流。
大小相同,因为每个字符的默认编码应该有32位,而java中的整数每个数字也有32位。
另见
<强> FileOutputStream 强>
<强> FileWriter 强>
<强> Primitive Data Types 强>
答案 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
)。