JAVA IO字节流与字符流的区别
其实我只想弄清楚一个问题,我们一个txt文件,里面内容是123。我看了一下大小,只有三个byte.我们用字节流去读取是123用字符流读取也是123为什么呢?他不是只有三个...
其实我只想弄清楚一个问题,我们一个txt文件,里面内容是123。
我看了一下大小,只有三个byte.
我们用字节流去读取是 123
用字符流读取也是 123 为什么呢?他不是只有三个字节,字符不是一次读取16位吗? 展开
我看了一下大小,只有三个byte.
我们用字节流去读取是 123
用字符流读取也是 123 为什么呢?他不是只有三个字节,字符不是一次读取16位吗? 展开
5个回答
展开全部
Java字符流是处理字符(Char)对象用的,字节流是处理字节(Byte)对象用的。处理的目标对象不同,处理方法也就不一样了。
字符流处理的基本单位是字符(Java中的字符是16位的),输入流以Reader为基础,输出流以Writer为基础;
字节流的基本单位是字节(Java中的字节是8位的),输入流以 InputStream为基础,输出流以 OutputStream为基础;
字符流在输入时可以按字符读取,也可以按行读取,会去掉回车换行,常用于读取字符数据;
而字节流按字节读取,不作任何处理,常用于读取二进制数据。
Java中的字符在内部都是使用Unicode进行表示的,因此,要正确读取字符数据,需要知道字符的编码字符集,字符流提供编码字符集的指定,如果不指定使用系统默认的方式对字符数据进行编码转换,这个编码字符集不正确,会造成读进来的地字符出现乱码。
字节流虽然是读取二进制数据用的,但也可以读取字符文件,按字节进行处理,读进来之后可以根据编码字符集进行转换,也可以变成字符串。
字符流处理的基本单位是字符(Java中的字符是16位的),输入流以Reader为基础,输出流以Writer为基础;
字节流的基本单位是字节(Java中的字节是8位的),输入流以 InputStream为基础,输出流以 OutputStream为基础;
字符流在输入时可以按字符读取,也可以按行读取,会去掉回车换行,常用于读取字符数据;
而字节流按字节读取,不作任何处理,常用于读取二进制数据。
Java中的字符在内部都是使用Unicode进行表示的,因此,要正确读取字符数据,需要知道字符的编码字符集,字符流提供编码字符集的指定,如果不指定使用系统默认的方式对字符数据进行编码转换,这个编码字符集不正确,会造成读进来的地字符出现乱码。
字节流虽然是读取二进制数据用的,但也可以读取字符文件,按字节进行处理,读进来之后可以根据编码字符集进行转换,也可以变成字符串。
展开全部
字节流可以读非文本文件,如二进制文件,字符流只能读文本之类的文件,但字符流提供缓冲功能可以提高读取效率。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
同一个文件读出来的内容当然是一样的,一次读取2个字节是指在内存中的缓冲区是这么大,开了2个字节的内存读进来一个字节的内容当然也是可以的,字符流read的时候调用的最终实现代码来自StreamDecoder,参考http://srl.cs.berkeley.edu/~mhn/ftp/sun/nio/cs/StreamDecoder.java.html
更多追问追答
追问
有点懂了,字符流要用到缓冲区,这个字符指的是缓冲区的大小,而不是读取文件的大小。但是他怎么知道我们读取的是汉字还是字母或数字呢?是不是因为:
他是因为有一套识别机制,识别出来了数字或字母是ASCII码,然后就直接转换了,虽然他是一个字节。
而汉字或者其他,他读取一个字符的时候,不是ascii码,因为他可以读取两个字节,他就再拿一个来读,两个字节在一起就是汉字了。。
不知道这样对吗?
追答
java里字符都是unicode,如何你读进缓冲区的东西不是unicode字符就直接乱码了
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
一个字节==8位;
字符流默认一次读取两个字节,不代表小于两个字节的文件,就不能读取;
字符流默认一次读取两个字节,字节流则默认一次读取一个字节;读取字符型文件的时候,字符流效率要高于字节流。
字符流默认一次读取两个字节,不代表小于两个字节的文件,就不能读取;
字符流默认一次读取两个字节,字节流则默认一次读取一个字节;读取字符型文件的时候,字符流效率要高于字节流。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
字符流不是只读取一个字符
追问
能就这个问题给我详细讲讲吗?非常感谢!老师说到了缓冲区,编码问题什么的。我有点模糊。一直没搞懂。
追答
InputStreamReader(InputStream in, Charset cs)
这个构造方法可以指定读入的字符的编码
缓冲区就是把读入的字符存到一个char[]数组中
例如:char[] array = new char[1024];
inputStreamReader.read(array,0, array.length);
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询