黑马程序员技术交流社区

标题: 字符流与字节流有什么区别? [打印本页]

作者: 于海生    时间: 2012-1-3 09:09
标题: 字符流与字节流有什么区别?
本帖最后由 于海生 于 2012-1-3 21:07 编辑

字符流与字节流有什么区别?请举例说明,详解。
作者: 李盈科    时间: 2012-1-3 09:42
字节流处理的是二进制数据,不能直接处理Unicode字符,而我们运行程序的时候是要输入字符的,这时就要用字符流了。
作者: 刘忠德    时间: 2012-1-3 09:45
字节流与字符流主要的区别是他们的的处理方式
字节流是最基本的,所有的InputStream和OutputStream的子类都是,主要用在处理二进制数据,它是按字节来处理的
但实际中很多的数据是文本,又提出了字符流的概念,它是按虚拟机的encode来处理,也就是要进行字符集的转化
这两个之间通过 InputStreamReader,OutputStreamWriter来关联
作者: 想好了再写    时间: 2012-1-3 10:56

字节流以字节为单位输入输出,字节流类名含有stream,字符流以字符为单位输入输出,字节流
类名含有reader或writer.为了通用性,java中字符是16位的unicode字符,所以8位的字节流必
须和16位的字符流进行转换。字节流到字符流的转换使用InputStreamReader类:
JavaI/O字节流与字符流就是java 实现输入/输出 数据 字节流是一个字节一个字节的输入/输出 数据 (两个字节组成一个汉字)所以在用字节流读一串汉字时会出现乱码问题,
同样字符流是一个字符一个字符流(一个字符=两个字节)的输入/输出 数据 用字符流读一串汉字可以解决乱码问题.
作者: 詹英鹏    时间: 2012-1-3 10:56
字节流以字节为单位输入输出,字节流类名含有stream,处理单元为1个字节,
操作字节和字节数组。所有的InputStrem和OutputStream的子类都是。
字符流以字符为单位输入输出,处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串
java中字符是16位的unicode字符,所以8位的字节流必
须和16位的字符流进行转换。区别就看出来,就是处理数据的方式
作者: 闫玉泉    时间: 2012-1-3 12:38
我觉得字节流以字节为输入输出单位,它可以处理基本所有的媒体数据并且正解显示出来。
字符流是以字符为输入输出单位,它主要是处理文本数据,它自己可以处理字符编码的问题,在处理文本数据上功能相对较强。当然它也可以处理其它类型的数据如MP3但是会出理乱码并无法播放。
作者: 刘博    时间: 2012-1-3 13:06
字符流,字节流,不明思意,   字节流就是处理字节数据的,字符流就是处理字符数据的,也就是文本数据,而所有的文件都有字节的长度,所以字节流也可以处理字符流,但是需要转换流的感念;{:soso_e121:}
作者: 林晓波    时间: 2012-1-3 13:17
字节流 InputStream OutputStream

字符流 Reader  Writer

他们都是抽象类

具体实现
字节流 FileInputStream  FileOutputStream
字符流 FileReader    FileWriter


字节流转换成字符流可以用 InputSteamReader  OutputStreamWriter

转换成BufferdReader  BufferedWriter 他们具有缓冲区

例如:读取文件 从字节流输入到字符流输入
定义一个字节流:
Java代码     
1.        FileInputStream fileInputStream = new FileInputStream("d:/text.txt");  // 定义一个指向D:/TEXT.TXT 的字节流   
2.          
3.        InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream);   
4.        //字节流转换成InputStreamReader   
5.          
6.        BufferedReader bufferedReader = new BufferedReader(inputSteamReader);   
7.        //InputStreamReader 转换成带缓存的bufferedReader   


可以把读出来的内容赋值给字符
Java代码     
1.          
2.        String ss = new String();   
3.        String s;   
4.        while((s = bufferedReader.readLine())!=null){   
5.            ss += s;   
6.        }   

例如:写入文件  从字节流输出到字符流输出
Java代码     
1.          
2.        FileOutputStream fileOutputStream = new FileOutputStream("d:/text.txt"); //定义一个   
3.          
4.        指向D:/TEXT.TXT文件     
5.          
6.        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream);   
7.          
8.        BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);   
9.          
10.        bufferedWriter.write(s);   
11.          
12.        bufferedWriter.close();   
13.        outputStreamWriter.close();   
14.        fileOutputStream.close();

作者: 王冀0127    时间: 2012-1-3 13:17
由于计算机存储任意数据都是字节, 所以字节流可以处理所有数据
当我们从设备读取数据到程序需要转为字符的时候, 或者程序要写出字符到设备中时使用字符流更为方便
如果使用字节流读数据, 读取到的是字节, 需要人工解码(将二进制码转为字符)
如果使用字节流写数据, 只能写出字节, 所以需要人工编码(将字符转为二进制码)
作者: 沈样    时间: 2012-1-3 15:04
本帖最后由 沈样 于 2012-1-3 15:05 编辑

字节流跟字符流就相当于水果跟苹果的关系,字符流是专门处理字符的,比字节流速度要快,但是字节流是所以流的基础。根据不同的场合选择不同的流,理论不是很好,如有好的理论解释请指出
作者: 苏格拉底的弟子    时间: 2012-1-3 16:46
其实在内存中的表现都不用管只要了解:字符就是一次读二个字节,而字节知识一次读一个字节
假设你现在要读一个汉字(以二个字节来存,既:一个字符)的“国”。
        1.用字符流读:一次读二个字节,那么你就可以完全读取到它,并存到你想存的地方。
        2.用字节流读:一次读一个字节,那么你要读二次你才完全得读取到了这个汉字。不然就读取到了半个(一个汉字二个字节中的一个字节),那你说这半个(一个字节)是什么东西?她就是乱码了..我们看不懂!





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