JAVA高手浅析字节流与字符流

【浅析一】

        字节流在操作时不会用到缓冲区(内存),是直接对文件本身进行操作的。而字符流在操作时使用了缓冲区,通过缓冲区再操作文件。
在输出的时候,OutputStream即使不关闭也能将内容输出,Writer则不行,不关闭的话,最后一条内容不能输出,因为所有内容都保存在缓冲区,每当调用了close()方法即意味着清空了缓冲区,即可证明字符流确实使用了缓冲区的。
     如果字符流不关闭也能输出内容的话,必须强制性清空缓冲区。
    
       字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节, 操作字节和字节数组。所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,所以它对多国语言支持性比较好!如果是 音频文件、图片、歌曲,就用字节流好点,如果是关系到中文(文本)的,用字符流好点.
       所有文件的储存是都是字节(byte)的储存,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘。在读取文件(特别是文本文件)时,也是一个字节一个字节地读取以形成字节序列. 

【浅析二】
        字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串; 字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以。
        数据传输的最小单位是字节,其实字符流传输其实质也是一个字节一个字节传输的,只是字符通常是由多个字节数成的,
在字节传输的基础上多了一个缓冲和查字符表的过程。


       比如英文数字是两个字节,汉字4个字节,在字符流的时候,读取不会发马上输入若输出,而是有一个缓冲并查找的过程。
比如读取a的时候,其实读的不是a,而是读到一个字节不马上解析,而是缓存起来,然后再读第2个字节。等两个字节凑齐
了,再将这两个字节到字符编码表中去查找,到底这两个字节代表的是哪一个字符。
       所以,通常对文本操作的时候要用到字符流,而对其它比如视频、音频、图象操作时通常直接使用字节流。由于字符流有一
个缓存和查表的过程,它的速度会受到影响。但字符流中用到的缓冲流技术会提高传输效率。

【个人概括】

字节流是通用的,既可以操作图片又可以操作文本,但一般都用于操作图片。
字符流是基于字节流的,因为字符流内部融合编码表,所以用来操作文本。

【应用】

在字节输入流中能根据文件的大小来开辟数组空间

FileInputStream fis=new FileINputStream("fos.txt");
byte[] b=new byte[fis.available()];//available方法用老定义一个方法好的缓冲区,这样就可以不用再循环
fis.read(b);
System.out.println(new String(b));
fis.close();

如果不用available定义缓冲区大小,就必须循环读取
FileInputStream fis=new FileInputStream("fos.txt");
byte[] b=new byte[1024];
int length=0;
while((length=fis.read(b))!=-1){
    System.out.println(new String(b,0,length));
}
fis.close();

 

欢迎广大朋友转载,但转载请注明,管理是允许注明的。

----------------------------------------------------------------------------------------------------------------------------

 

个人广告:www.mamting.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值