你是否对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中所得到的英文能正常显示,而中文会被显示为两个英文字符,如代码

 

 
  
  1. import java.io.DataInputStream;  
  2. import java.io.FileDescriptor;  
  3. import java.io.FileOutputStream;  
  4. import java.net.HttpURLConnection;  
  5. import java.net.URL;  
  6.  
  7. public class OpenUrl {  
  8.     public static void main(String[] args){  
  9.         try{    
  10.                   URL   url   =   new   URL("http://vip.showji.com/locating/?m=13800138000&outfmt=json");  //从网上获得数据  
  11.                   HttpURLConnection   httpConnection   =   (HttpURLConnection)url.openConnection();     
  12.                   int   responseCode=httpConnection.getResponseCode();    
  13.                   if(responseCode==200){  
  14.                       DataInputStream inFromServer=new DataInputStream(httpConnection.getInputStream());                                  
  15.                       int testdata;  
  16.                         
  17.                           FileOutputStream out = new FileOutputStream(FileDescriptor.out);                                              
  18. while((testdata=inFromServer.read())!=-1){  
  19.                           System.out.print("{");                      
  20.                           out.write(testdata);                        
  21.                           out.flush();  
  22.                           System.out.print(" = "+testdata);  
  23.                           System.out.print("}");  
  24.                       }  
  25.                         
  26.                       inFromServer.close();  
  27.  
  28.                   }       
  29. httpConnection.disconnect();              
  30.               }    
  31.         catch(Exception   e){  
  32.                   e.printStackTrace();                 
  33.               }     
  34.  
  35.     }  
  36.       
  37. }  

.为了能将中文正常显示出来,需要创建一个Reader类按照指定的编码方式(数据文件的存储格式)来读取数据,然后按指定编码方式输出。

 

 
  
  1. import java.io.BufferedReader;  
  2. import java.io.BufferedWriter;  
  3. import java.io.DataInputStream;  
  4. import java.io.DataOutputStream;  
  5. import java.io.FileDescriptor;  
  6. import java.io.FileOutputStream;  
  7. import java.io.InputStreamReader;  
  8. import java.io.OutputStreamWriter;  
  9. import java.net.HttpURLConnection;  
  10. import java.net.URL;  
  11.  
  12. public class OpenUrl {  
  13.     public static void main(String[] args){  
  14.         try{    
  15.                   URL   url   =   new   URL("http://vip.showji.com/locating/?m=13800138000&outfmt=json");   
  16.                   HttpURLConnection   httpConnection   =   (HttpURLConnection)url.openConnection();     
  17.                   int   responseCode=httpConnection.getResponseCode();    
  18.                   if(responseCode==200){  
  19.                       DataInputStream inFromServer=new DataInputStream(httpConnection.getInputStream());  
  20.                       BufferedReader reader =new BufferedReader(new InputStreamReader(inFromServer,"UTF8"));  
  21.                       int testdata;  
  22.                       FileOutputStream out = new FileOutputStream(FileDescriptor.out);  
  23.                       BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out,"UTF8"));  
  24.                       while((testdata=reader.read())!=-1){  
  25.                           System.out.print("{");  
  26.                           writer.write(testdata);  
  27.                           writer.flush();  
  28.                           System.out.print(" = "+testdata);  
  29.                           System.out.print("}");  
  30.                       }     
  31.                       reader.close();  
  32.                       writer.close();  
  33.  
  34.                   }       
  35.                   httpConnection.disconnect();  
  36.               }    
  37.         catch(Exception   e){  
  38.                   e.printStackTrace();  
  39.                   System.out.println("Connect Error");                 
  40.               }     
  41.     }  
  42.       

上面的代码中要注意读取数据时指定的编码方式,以下两种情况均会产生中文乱码

1.读取时指定的编码方式和数据存储时选择的编码方式不同。

2.在读取数据时选择的编码方式正确的情况下,输出时选择的编码方式与读取数据时的编码方式不同。