你是否对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中所得到的英文能正常显示,而中文会被显示为两个英文字符,如代码
- 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.在读取数据时选择的编码方式正确的情况下,输出时选择的编码方式与读取数据时的编码方式不同。
转载于:https://blog.51cto.com/sgamerv/747386