Reader与InputStream两个类中的read()的区别
InputStream类的read()方法是从流里面取出一个字节,他的函数原型是 int read(); ,Reader类的read()方法则是从流里面取出一个字符(一个char),他的函数原型也是 int read(); 。
我们都知道java使用的是UNICODE字符集,在java中字符和字符串都是使用UTF-16BE编码方式,即一个字符两个字节,在内存中高位在低字节,这也是BE的由来,BIG ENDIAN可以理解成大位的在开头,例如一个char的值是0XAC56,那么在内存中的形式就是AC 56,假设0XAC的内存地址为1,那么0X56的内存地址是2。
接下来再分析一下Reader与InputStream两个类中的read()都分别干了什么,InputStream类的read()方法只是简单的从输入流里面取出一个字节,然后返回他的值,Reader类的read()方法则是先判断出输入流使用的是何种编码方式(实际上如果我们不指定编码,则直接使用系统的默认编码作为输入流的编码,在中文Windows系统中默认为GB2312),然后用输入流的编码方式解码出一个字符(输入流的编码方式确定了也就确定了读取一个字符需要取出个字节),取出一个字符后再把这个字符用UTF-16BE编码并返回编码值,这就是read()方法返回的值。
下面写一个小程序就可以证明上面的结论:
1.首先将同一个句话 周宣自然要慷慨表白一番,说得林岱连连点头,贤婿周宣是洪福之人,也只有他才能娶道蕴。 分别以UTF-8和UTF-16BE两种方式保存,用16进制编辑器打开查看:


2.Reader类的read()方法读取以UTF-8编码的txt:
import java.io.*;
class a {
public static void main(String[] s) throws IOException { System.out.println("Reader类的read()方法读取");
FileInputStream fis = new FileInputStream("测试.txt");
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
//System.out.println(isr.getEncoding());
int ch = 0;
int[] temp = new int[1024];
int i = 0; while ((ch = isr.read()) != -1) {
temp[i++] = ch;
System.out.print((char) ch);
}
System.out.print("\n\n"); System.out.println("每个字符的编码值:");
for (int j = 0; j < i; j++) {
if (j % 8 == 0 && j != 0) {
System.out.print("\n");
}
System.out.printf("%04X ", temp[j]); } }
}
输出结果如下:
Reader类的read()方法读取
周宣自然要慷慨表白一番,说得林岱连连点头,贤婿周宣是洪福之人,也只有他才能娶道蕴。 每个字符的编码值:
5468 5BA3 81EA 7136 8981 6177 6168 8868
767D 4E00 756A FF0C 8BF4 5F97 6797 5CB1
8FDE 8FDE 70B9 5934 FF0C 8D24 5A7F 5468
5BA3 662F 6D2A 798F 4E4B 4EBA FF0C 4E5F
53EA 6709 4ED6 624D 80FD 5A36 9053 8574
3002 000D
可以看到Reader类的read()方法读取的每个char都是UTF-16BE编码保存的。
接下来用InputStream类的read()方法读取UTF-8编码的txt:
import java.io.*;
class b {
public static void main(String[] s) throws IOException {
System.out.println("InputStream类的read()方法读取");
int ch0 = 0, x = 0;
FileInputStream fis = new FileInputStream("测试.txt");
while ((ch0 = fis.read()) != -1) {
if (x++ % 16 == 0 && x != 0) {
System.out.print("\n");
}
System.out.printf("%02X ", ch0);
}
System.out.print("\n\n");
}
}
输出结果如下:
InputStream类的read()方法读取 E5 91 A8 E5 AE A3 E8 87 AA E7 84 B6 E8 A6 81 E6
85 B7 E6 85 A8 E8 A1 A8 E7 99 BD E4 B8 80 E7 95
AA EF BC 8C E8 AF B4 E5 BE 97 E6 9E 97 E5 B2 B1
E8 BF 9E E8 BF 9E E7 82 B9 E5 A4 B4 EF BC 8C E8
B4 A4 E5 A9 BF E5 91 A8 E5 AE A3 E6 98 AF E6 B4
AA E7 A6 8F E4 B9 8B E4 BA BA EF BC 8C E4 B9 9F
E5 8F AA E6 9C 89 E4 BB 96 E6 89 8D E8 83 BD E5
A8 B6 E9 81 93 E8 95 B4 E3 80 82 0D
Reader与InputStream两个类中的read()的区别的更多相关文章
- 转载:C++中两个类中互相包含对方对象的指针问题
原文链接:http://www.cnblogs.com/hanxi/archive/2012/07/25/2608068.html 前几天很不爽,因为C++中两个类中互相包含对方对象的指针编译时提示某 ...
- 谈谈java中静态变量与静态方法在有继承关系的两个类中调用
谈谈java中静态变量与静态方法在有继承关系的两个类中调用 学习的中如果遇到不明白或者不清楚的的时候,就是自己做些测试,自己去试试,这次我就做一个关于静态变量和静态方法在有继承关系的两个类中的问题测试 ...
- java中父类与子类, 不同的两个类中的因为构造函数由于递归调用导致栈溢出问题
/* 对于类中对成员变量的初始化和代码块中的代码全部都挪到了构造函数中, 并且是按照java源文件的初始化顺序依次对成员变量进行初始化的,而原构造函数中的代码则移到了构造函数的最后执行 */ impo ...
- C++中两个类中互相包含对方对象的指针问题(转载)
出处:http://www.cnblogs.com/hanxi/archive/2012/07/25/2608068.html // A.h #include "B.h" clas ...
- Assembly中Load, LoadFrom, LoadFile以及AppDomain, Activator类中相应函数的区别
Assembly和AppDomain的一些关于动态加载程序集的函数有些令人头疼,但细细研究后还是可以将他们区分的. 这些函数大致可以分为四类: 第一类:加载到Load Context内 Load Co ...
- mfc 在VC的两个对话框类中传递参数的三种方法
弄了好久,今天终于把在VC中的对话框类之间传递参数的问题解决了,很开心,记录如下: 1. 我所建立的工程是一个基于MFC对话框的应用程序,一共有三个对话框,第一个对话框为主对话框,所对应的类为CTMD ...
- 将source类中的属性值赋给target类中对应的属性
/** * 对象的属性值拷贝 * <p> * 将source对象中的属性值赋值到target对象中的属性,属性名一样,类型一样 * <p> * example: * <p ...
- Object类中常见的方法,为什么wait notify会放在Object里边
toString():输出一个对象的地址字符串(哈希code码):可以通过重写toString方法,获取对象的属性! equals():比较的是对象的引用是否指向同一块内存地址, 重写equals() ...
- CI框架中一个类中调用另一个类中已经加载对象测试
controller.php <?php class CI_Controller { private static $instance; public function __construct( ...
随机推荐
- 洛谷P1262 间谍网络[强连通分量 BFS]
题目描述 由于外国间谍的大量渗入,国家安全正处于高度的危机之中.如果A间谍手中掌握着关于B间谍的犯罪证据,则称A可以揭发B.有些间谍收受贿赂,只要给他们一定数量的美元,他们就愿意交出手中掌握的全部情报 ...
- ubuntu 14.04 ns2.35 ***buffer overflow detected **: ns terminated解决办法
1.按照如下教程安装 Install With Me !: How to Install NS-2.35 in Ubuntu-13.10 / 14.04 (in 4 easy steps) 2.运行一 ...
- JavaScript数组:增删改查、排序等
直接上代码 // 数组应用 var peoples = ["Jack","Tom","William","Tod",&q ...
- vtk工作流
要理解VTK的工作原理,首先应明确几个类型: 1.vtkSource(数据源) 这个就好比一个剧本里面的角色,让演员知道要演的是什么人物. 数据源有:vtkConeSource,vtkSphere ...
- 2015年3月阿里内推(c++研发)实习生电面经历
2015年3月开学开始就听说阿里会有内推,果不其然在师兄的引荐下推了菜鸟网络,但是在学校的BBS上看到了阿里云部门,而且要会C++,这使我更感兴趣,重新选择了方向,当然最后选择了阿里云.在此分享一下三 ...
- knockoutJS学习笔记08:表单域绑定
前面的绑定都是用在基本标签上,这章主要讲表单域标签的绑定. 一.value 绑定 绑定标签:input text.textarea. <p>用户名:<input type=" ...
- C#进阶系列——DDD领域驱动设计初探(四):WCF搭建
前言:前面三篇分享了下DDD里面的两个主要特性:聚合和仓储.领域层的搭建基本完成,当然还涉及到领域事件和领域服务的部分,后面再项目搭建的过程中慢慢引入,博主的思路是先将整个架构走通,然后一步一步来添加 ...
- JS正则表达式基本概念
1.正则表达式(Regular Expression) 在JS里是RegExp 两种字义方式 1. var patt1=new RegExp("e"); 2. var patt1 ...
- 微信快速开发框架(七)--发送客服信息,版本更新至V2.2 代码已更新至github
在V2版本发布的博文中,已经介绍了大多数Api的用法,同时也收到了很多意见,其中发布了几个修正版本,修改了几个bug,在此感谢大家的使用,有了大家的支持,相信快速开发框架会越来越好,也会越来越完善的. ...
- 基于CentOS-7.2.15的Mono+jexus镜像
公司开发及测试的linux环境为CentOS-7.X,因此以CentOS-7.2.15作为基础镜像,镜像尺寸确实比较大,最终Mono-4.6.0.125+Jexus-5.8.1.10镜像尺寸已将近1G ...