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