字节流和字符流转换

摘要:
任何数据的持久性和网络传输都是字节的形式,因此字节流和字符流之间必须存在转换问题。字符到字符是编码过程,而字节到字符是解码过程。io包中提供了InputStreamReader和OutputStreamWriter,用于字符和字节转换=-1){sb.append;}System.out.println;System.out.println;FileReader类实际上是FileInputStream的简单包装器,但它继承了InputStreamReader类。当调用read方法时,实际上会调用StreamDecoder类的read方法。此StreamDecoder是完成字节到字符解码的实现类。

任何数据的持久化和网络传输都是以字节形式进行的,所以字节流和字符流之间必然存在转换问题。字符转字节是编码过程,字节转字符是解码过程。io包中提供了InputStreamReader和OutputStreamWriter用于字符和字节的转换。

来看一个小例子:

复制代码
char[] charArr = new char[1];
StringBuffer sb = new StringBuffer();
FileReader fr = new FileReader("test.txt");
while(fr.read(charArr) != -1)
{
    sb.append(charArr);
}
System.out.println("编码:" + fr.getEncoding());
System.out.println("文件内容:" + sb.toString());
复制代码

FileReader类其实就是简单的包装一下FileInputStream,但是它继承InputStreamReader类,当调用read方法时其实调用的是StreamDecoder类的read方法,这个StreamDecoder正是完成字节到字符的解码的实现类。如下图:

 字节流和字符流转换第3张

InputStream 到 Reader 的过程要指定编码字符集,否则将采用操作系统默认字符集,很可能会出现乱码问题。上例代码输出如下:

编码:UTF8
文件内容:hello�����Dz����ļ�!

再来看一个例子,换一个字符集:

复制代码
char[] charArr = new char[1];
StringBuffer sb = new StringBuffer();
//设置编码
InputStreamReader isr = new InputStreamReader(
                                          new FileInputStream("D:/test.txt")
                                          , "GBK");
while(isr.read(charArr) != -1)
{
    sb.append(charArr);
}
System.out.println("编码:" + isr.getEncoding());
System.out.println("文件内容:" + sb.toString()); 
复制代码

输出正常:

编码:GBK
文件内容:hello!我是测试文件!

免责声明:文章转载自《字节流和字符流转换》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Hbase之批量数据写入ASP.Net超时时间已到解决办法-下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

多串匹配

meteor多串匹配 Description Input 第一行为一个整数n,表示文本的长度 第二行为一个长度为n的文本 第三行为一个整数m,表示模式串个数 下接m行,每行一个模式串  Output 共m行,若第i个模式串在文本中出现过则第i行输出YES,否则输出NO 数据范围 对于30%的数据,n<=10^3,m<=10^3; 对于80%的数...

Java-数据类型(八种基本数据类型)

1、整数类型:byte,short,int,longbyte:一般跟文件操作有关,比如上传、下载。长度8位,-128-127 byte numbyte1=133; //报错:cannot convert from int to byte //不能从int类型转换为byte类型 //整数常数看作int类型,但是如果取值范围在-128-127之间的话,自动把i...

字符集编码 定长与变长

☯,首先,这并不是图片,这是一个unicode字符,Yin Yang,即阴阳符,码点为U+262F。如果你的浏览器无法显示,可以查看这个链接http://www.fileformat.info/info/unicode/char/262f/index.htm。这与我们要讨论的主题有何关系呢?下面我会谈到。 连续式表示带来的分隔难题 计算机的底层表示 在计...

【ETL】Kettle字符编码问题

0x01:Kettle保存文件时提示错误? 一般这种问题是因为数据库连接与数据库字符编码不一致导致的,需指定数据库连接字符编码与数据库一致【Repository Manager】->【数据库连接】->【选项】->【命名参数:characterEncoding;值:数据库编码(如:gbk) 0x02:打开转换时提示【一个数据库错误发生在从...

Servlet第四篇【request对象常用方法、应用】

什么是HttpServletRequest HttpServletRequest**对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,**HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息。 简单来说,要得到浏览器信息,就找HttpServletRequest对象 HttpServletRequest...

13、ubuntu终端快捷键(参考 dy9776)

1、终端的快捷键 Tab 自动补全 Ctrl+a 光标移动到开始位置 Ctrl+e 光标移动到最末尾 Ctrl+l 相当于clear,即清屏 Ctrl+Z 把当前任务放到后台运行(相当于运行命令时后面加&) Ctrl+d 关闭终端 Ctrl+c 终止进程/命令 Ctrl+r 查找历史命令 Shift+Ctrl+n...