Java IO中关于read()函数的实验
2011-12-21 13:10
253 查看
你是否对InputStream类和Reader类中的read()方法的区别比较清楚呢?再进一步实验之后,也会对程序中出现乱码的原因更加清楚了
区别:
查看API文档,InputStream类中的read()描述是Reads the next byte of data from input stream,返回0-255的一个int值,-1代表结尾
Reader类中的read()描述是Reads a single character,返回0-65535,-1代表结尾
分析:
一.值0-255(8位)不可能用来代表一个中文字符(16位),所以直接利用InputStream子类的read方法去读取包含中英文字符的数据所返回的值,输出到OutputStream中所得到的英文能正常显示,而中文会被显示为两个英文字符,如代码
二.为了能将中文正常显示出来,需要创建一个Reader类按照指定的编码方式(数据文件的存储格式)来读取数据,然后按指定编码方式输出。
上面的代码中要注意读取数据时指定的编码方式,以下两种情况均会产生中文乱码
1.读取时指定的编码方式和数据存储时选择的编码方式不同。
2.在读取数据时选择的编码方式正确的情况下,输出时选择的编码方式与读取数据时的编码方式不同。
本文出自 “没有什么不可能” 博客,请务必保留此出处http://sgamerv.blog.51cto.com/3202504/747386
区别:
查看API文档,InputStream类中的read()描述是Reads the next byte of data from input stream,返回0-255的一个int值,-1代表结尾
Reader类中的read()描述是Reads a single character,返回0-65535,-1代表结尾
分析:
一.值0-255(8位)不可能用来代表一个中文字符(16位),所以直接利用InputStream子类的read方法去读取包含中英文字符的数据所返回的值,输出到OutputStream中所得到的英文能正常显示,而中文会被显示为两个英文字符,如代码
import java.io.DataInputStream; import java.io.FileDescriptor; import java.io.FileOutputStream; import java.net.HttpURLConnection; import java.net.URL; public class OpenUrl { public static void main(String[] args){ try{ URL url = new URL("http://vip.showji.com/locating/?m=13800138000&outfmt=json"); //从网上获得数据 HttpURLConnection httpConnection = (HttpURLConnection)url.openConnection(); int responseCode=httpConnection.getResponseCode(); if(responseCode==200){ DataInputStream inFromServer=new DataInputStream(httpConnection.getInputStream()); int testdata; FileOutputStream out = new FileOutputStream(FileDescriptor.out); while((testdata=inFromServer.read())!=-1){ System.out.print("{"); out.write(testdata); out.flush(); System.out.print(" = "+testdata); System.out.print("}"); } inFromServer.close(); } httpConnection.disconnect(); } catch(Exception e){ e.printStackTrace(); } } }
二.为了能将中文正常显示出来,需要创建一个Reader类按照指定的编码方式(数据文件的存储格式)来读取数据,然后按指定编码方式输出。
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.FileDescriptor; import java.io.FileOutputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.HttpURLConnection; import java.net.URL; public class OpenUrl { public static void main(String[] args){ try{ URL url = new URL("http://vip.showji.com/locating/?m=13800138000&outfmt=json"); HttpURLConnection httpConnection = (HttpURLConnection)url.openConnection(); int responseCode=httpConnection.getResponseCode(); if(responseCode==200){ DataInputStream inFromServer=new DataInputStream(httpConnection.getInputStream()); BufferedReader reader =new BufferedReader(new InputStreamReader(inFromServer,"UTF8")); int testdata; FileOutputStream out = new FileOutputStream(FileDescriptor.out); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out,"UTF8")); while((testdata=reader.read())!=-1){ System.out.print("{"); writer.write(testdata); writer.flush(); System.out.print(" = "+testdata); System.out.print("}"); } reader.close(); writer.close(); } httpConnection.disconnect(); } catch(Exception e){ e.printStackTrace(); System.out.println("Connect Error"); } } }
上面的代码中要注意读取数据时指定的编码方式,以下两种情况均会产生中文乱码
1.读取时指定的编码方式和数据存储时选择的编码方式不同。
2.在读取数据时选择的编码方式正确的情况下,输出时选择的编码方式与读取数据时的编码方式不同。
本文出自 “没有什么不可能” 博客,请务必保留此出处http://sgamerv.blog.51cto.com/3202504/747386
相关文章推荐
- 关于C、java、php的函数参数传递特点的分析
- java中关于时间日期操作的常用函数
- java.io.IOException: Attempted read on closed stream
- 关于c#几个事件处理函数能否并行运行的实验
- java.io.Reader.read(char[] cbuf)方法实例
- java.sql.SQLException: Io 异常: Got minus one from a read call
- Java 编程下 IO 中的输入流的 read() 方法返回值为什么是 int 值
- 【Java】【IO】FileInputStream read 简介
- 关于java函数传递的,调试时jianshu()返回失败,求指教!!!
- java.io.FileNotFoundException关于使用Intellij Idea时系统找不到指定文件的解决方案
- java.io.IOException: Attempted read from closed stream.
- Java中关于函数回调和反射机制的介绍
- Java 编程下 IO 中的输入流的 read() 方法返回值为什么是 int 值
- 关于java中调用Rserve包的eval函数中的奇葩bug
- 关于Java IO InputStream 的一点整理!
- Caused by: java.io.EOFException: Can not read response from server.
- 关于这几天学习的java文件IO
- 黑马程序员------Java_IO关于缓冲区提高代码复用性
- java中关于时间日期操作的常用函数
- java中inputstream的.read()函数的三种用法