JAVA IO字节流与字符流的区别

其实我只想弄清楚一个问题,我们一个txt文件,里面内容是123。
我看了一下大小,只有三个byte.
我们用字节流去读取是 123
用字符流读取也是 123 为什么呢?他不是只有三个字节,字符不是一次读取16位吗?

Java字符流是处理字符(Char)对象用的,字节流是处理字节(Byte)对象用的。处理的目标对象不同,处理方法也就不一样了。

字符流处理的基本单位是字符(Java中的字符是16位的),输入流以Reader为基础,输出流以Writer为基础;
字节流的基本单位是字节(Java中的字节是8位的),输入流以 InputStream为基础,输出流以 OutputStream为基础;

字符流在输入时可以按字符读取,也可以按行读取,会去掉回车换行,常用于读取字符数据;
而字节流按字节读取,不作任何处理,常用于读取二进制数据。

Java中的字符在内部都是使用Unicode进行表示的,因此,要正确读取字符数据,需要知道字符的编码字符集,字符流提供编码字符集的指定,如果不指定使用系统默认的方式对字符数据进行编码转换,这个编码字符集不正确,会造成读进来的地字符出现乱码。

字节流虽然是读取二进制数据用的,但也可以读取字符文件,按字节进行处理,读进来之后可以根据编码字符集进行转换,也可以变成字符串。
温馨提示:内容为网友见解,仅供参考
第1个回答  2014-01-24
字节流可以读非文本文件,如二进制文件,字符流只能读文本之类的文件,但字符流提供缓冲功能可以提高读取效率。本回答被网友采纳
第2个回答  推荐于2016-06-20
同一个文件读出来的内容当然是一样的,一次读取2个字节是指在内存中的缓冲区是这么大,开了2个字节的内存读进来一个字节的内容当然也是可以的,字符流read的时候调用的最终实现代码来自StreamDecoder,参考http://srl.cs.berkeley.edu/~mhn/ftp/sun/nio/cs/StreamDecoder.java.html追问

有点懂了,字符流要用到缓冲区,这个字符指的是缓冲区的大小,而不是读取文件的大小。但是他怎么知道我们读取的是汉字还是字母或数字呢?是不是因为:
他是因为有一套识别机制,识别出来了数字或字母是ASCII码,然后就直接转换了,虽然他是一个字节。
而汉字或者其他,他读取一个字符的时候,不是ascii码,因为他可以读取两个字节,他就再拿一个来读,两个字节在一起就是汉字了。。
不知道这样对吗?

追答

java里字符都是unicode,如何你读进缓冲区的东西不是unicode字符就直接乱码了

追问

还是感觉到有点乱。
我只是想知道他为什么分辨的出来应该把数字1读成1,只有一个字节。,而又能成功都出来汉字,汉字确实两个字节。
就是他是怎么分辨该取一个字节来读,还是取两个字节来读。

追答

这个也简单,因为你用字符流的时候虚拟机按照系统的默认编码把字节翻译成了字符了。比如我系统的默认字符集是GBK的,那么你调用read()方法不指定编码虚拟机就按照GBK的编码方式把字节数组转换成字符数组,(当然在java的内存里每个字符都是两个字节,二文件中的就不一定了)。字符的编码就决定了他分辨字节所表示的字符的方法。

追问

非常感谢!
就是读取的时候他是在用Unicode的编码在读,他能够分辨这个字符用了几个字节。
有最后一个问题,就是如果这个字符用的是三个字节的Unicode的编码在读,那么用字符流也会读取出错吧?
因为字符流处理的单元为2个字节的Unicode字符。。

不对,这个应该和字符缓冲区有关吧。。。如果缓冲区只能读4个,能够都两个汉字,但是就只能读一个三个字符的编码,另一个就会出错了,对吧。

追答

不是出错,是乱码了

本回答被提问者采纳
第3个回答  2014-01-24
一个字节==8位;
字符流默认一次读取两个字节,不代表小于两个字节的文件,就不能读取;
字符流默认一次读取两个字节,字节流则默认一次读取一个字节;读取字符型文件的时候,字符流效率要高于字节流。
第4个回答  2014-01-24
字符流不是只读取一个字符追问

能就这个问题给我详细讲讲吗?非常感谢!老师说到了缓冲区,编码问题什么的。我有点模糊。一直没搞懂。

追答

InputStreamReader(InputStream in, Charset cs)
这个构造方法可以指定读入的字符的编码
缓冲区就是把读入的字符存到一个char[]数组中
例如:char[] array = new char[1024];
inputStreamReader.read(array,0, array.length);

java io字符流和字节流的区别
Java字符流是处理字符(Char)对象用的,字节流是处理字节(Byte)对象用的。处理的目标对象不同,处理方法也就不一样了。字符流处理的基本单位是字符(Java中的字符是16位的),输入流以Reader为基础,输出流以Writer为基础;字节流的基本单位是字节(Java中的字节是8位的),输入流以 InputStream为基...

1. Java I\/O中字符流和字节流的区别?
字节流与和字符流的使用非常相似,但实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件。下面以两个写文件的操作为主进行比较,但是在操作时字节流和字符流的操作完成之后都不关闭输出流。1、使用字节流不关闭执行 import jav...

“字节流”与“字符流”有什么区别?
字节流与字符流主要的区别是他们的的处理方式字节流是最基本的,采用ASCII编码,所有的InputStream和OutputStream的子类都是,主要用在处理二进制数据,它是按字节来处理的但实际中很多的数据是文本,又提出了字符流的概念,采用Unicode编码.它是按虚拟机的encode来处理,也就是要进行字符集的转化这两个之间...

关于java流的问题,字节流与字符流,为什么要用转换流,把字节转换成字符流...
字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串; 字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以。所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,所以它对多国语言支持性比较好!如果是 音频文件、...

Java字符流与字节流的区别
1. 字符流与字节流在处理数据的基本单元上存在差异。字符流以Unicode字符为处理单元,通常是两个字节,能够直接操作字符、字符数组或字符串。字节流则以单个字节为处理单元,操作字节和字节数组。2. 字符流能够更好地支持多国语言,因为它是由Java虚拟机将字节转化为Unicode字符而成的。对于涉及中文等文本...

“字符流”和“字节流”的区别是什么?
根据码表映射字符,一次可能读多个字节 ④处理方式不同:Java的字节流InputStream是所有字节输入流的祖先 OutputStream是所有字节输出流的祖先。Java的字符流,Reader是所有读取字符串输入流的祖先 writer是所有输出字符串的祖先。缓冲区不同:字节流读取的数据不经过缓存区。而字符流经过。⑤编码方式不同。

字节流VS字符流:揭秘两者的神秘面纱!
Java中的流可以分为字节流和字符流两种类型。字节流主要处理字节序列,而字符流主要处理字符序列。字节流和字符流之间的主要区别在于它们处理数据的方式:字节流直接处理字节,而字符流则处理字符,并且字符流需要处理字符编码。Java中的流可以分为输入流和输出流两种类型。输入流用于从某个来源读取数据,而...

java中的“流”是什么?
1,字节流 就是所有的写操作都继承自一个公共超类java.io.OutputStream类。2,字符流 就是所有的写操作都继承于一个公共超类java.io.Writer类。Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java...

字节流与字符流有什么区别?
字节流与字符流有2点不同,相关介绍具体如下:一、两者的组成不同:1、字节流的组成:字节流是由字节组成的。2、字符流的组成:字符流是由字符组成的。二、两者的处理不同:1、字节流的处理:主要用在处理二进制数据,它是按字节来处理的但实际中很多的数据是文本。2、字符流的处理:按虚拟机的...

字符流和字节流区别?
所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,所以它对多国语言支持性比较好!如果是音频文件、图片、歌曲,就用字节流好点,如果是关系到中文(文本)的,用字符流好点.所有文件的储存是都是字节(byte)的储存,在磁盘上保留的并不是文件的字符而是先把字符编码成...

相似回答