您的位置:首页 > 编程语言 > Java开发

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

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: