黑马程序员技术交流社区

标题: IO问题 [打印本页]

作者: 王广彬    时间: 2012-7-30 00:15
标题: IO问题
谁能给说说字节流与字符流操作时的区别?谢谢!
作者: 郑正华    时间: 2012-7-30 00:30
本帖最后由 郑正华 于 2012-7-30 00:48 编辑

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

作者: 于星星    时间: 2012-7-30 00:38
       数据传输的最小单位是字节,其实字符流传输其实质也是一个字节一个字节传输的,只是字符通常是由多个字节数成的,
在字节传输的基础上多了一个缓冲和查字符表的过程。
     比如英文数字是两个字节,汉字4个字节,在字符流的时候,读取不会发马上输入若输出,而是有一个缓冲并查找的过程。
比如读取a的时候,其实读的不是a,而是读到一个字节不马上解析,而是缓存起来,然后再读第2个字节。等两个字节凑齐
了,再将这两个字节到字符编码表中去查找,到底这两个字节代表的是哪一个字符。
     所以,通常对文本操作的时候要用到字符流,而对其它比如视频、音频、图象操作时通常直接使用字节流。由于字符流有一
个缓存和查表的过程,它的速度会受到影响。但字符流中用到的缓冲流技术会提高传输效率。
作者: 李菁    时间: 2012-7-30 01:18
字节流是通用的,既可以操作图片又可以操作文本,但一般都用于操作图片。
字符流是基于字节流的,因为字符流内部融合编码表,所以用来操作文本
作者: 王峰    时间: 2012-7-30 13:59
字节流与字符流的处理方式是他们的主要的区别,字节流是最基本的,所有的InputStream和OutputStream的子类都是,主要用在处理二进制数据,它是按字节来处理的但实际中很多的数据是文本,又有了字符流的概念,它是按虚拟机的encode来处理,也就是要进行字符集的转化这两个之间通过 InputStreamReader,OutputStreamWriter来关联,实际上是通过byte[]和String来关联的
在实际开发中出现的汉字问题实际上都是在字符流和字节流之间转化不统一而造成的
在从字节流转化为字符流时,实际上就是byte[]转化为String时,


作者: 创出一片辉煌    时间: 2012-7-30 23:11
字节流与字符流主要的区别是他们的的处理方式

流分类:
1.Java的字节流
   InputStream是所有字节输入流的祖先,而OutputStream是所有字节输出流的祖先。
2.Java的字符流
  Reader是所有读取字符串输入流的祖先,而writer是所有输出字符串的祖先。
InputStream,OutputStream,Reader,writer都是抽象类。所以不能直接new



字节流是最基本的,所有的InputStream和OutputStream的子类都是,主要用在处理二进制数据,它是按字节来处理的
但实际中很多的数据是文本,又提出了字符流的概念,它是按虚拟机的encode来处理,也就是要进行字符集的转化
这两个之间通过 InputStreamReader,OutputStreamWriter来关联,实际上是通过byte[]和String来关联
在实际开发中出现的汉字问题实际上都是在字符流和字节流之间转化不统一而造成的

在从字节流转化为字符流时,实际上就是byte[]转化为String时,
public String(byte bytes[], String charsetName)
有一个关键的参数字符集编码,通常我们都省略了,那系统就用操作系统的lang
而在字符流转化为字节流时,实际上是String转化为byte[]时,
byte[]    String.getBytes(String charsetName)
也是一样的道理

至于java.io中还出现了许多其他的流,按主要是为了提高性能和使用方便,
如BufferedInputStream,PipedInputStream等






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2