TA的每日心情 | 开心 2021-3-12 23:18 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
你是否对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 OpenUrl2 {
- 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,"GBK"));
- 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://file.javaxxz.com/2014/11/4/235831500.zip |
|