`
ayis
  • 浏览: 186337 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

java的字符流与字节流到底有什么区别

    博客分类:
  • java
阅读更多
分别用字节流和字符流读取www.baidu.com的页面源码,我是这样做的


import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;

/**
 * 测试字节流和字符流读取站点数据时的区别
 * 现象:用字符流读取时,中文出现乱码
 * 
 * 猜想:字符流读取,字符错位引起的
 * @author ayis
 * Mar 13, 2009
 */
public class Test {
	
	public static void main(String args[]){
		
		try {
			URL url = new URL("http://www.baidu.com");
			InputStream in = url.openStream();
			
			int n;
			StringBuffer buffer = new StringBuffer();
			
			// 用字节流读取
			while((n= in.read()) != -1){
				buffer.append((char)n);
			}
			
//			// 用字符流读取
//			BufferedReader reader = new BufferedReader(new InputStreamReader(in));
//			while((n = reader.read()) != -1){
//				buffer.append((char)n);
//			}
			
			// 转码并打印结果
			String response = new String(buffer.toString().getBytes("iso-8859-1") , "GBK");
			System.out.println(response);
		
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} 
	}
}



如现在程序这样的,用字节流读取时,都是正常的,中文未出现任何乱码;如果相应去掉注释,用字符流读取,中文就出现了乱码,如:<title>?????????      </title>。

另外,试着使用BufferedReader的readerLine(),或者去掉BufferedReader直接使用InputStreamReader,均照样出现中文乱码。

我想知道,使用字节流读取数据时,稳当当的,使用字符流时,怎么中文就出现了乱码???

分享到:
评论
6 楼 ayis 2012-11-19  
hilor 写道
呃.. 实际上用字符流的时候应该在读取时就设置好字符编码
例子中的
引用
BufferedReader reader = new BufferedReader(new InputStreamReader(in));

改成
BufferedReader reader = new BufferedReader(new InputStreamReader(in, "gbk"));


把下面结果的编码转换给去掉, 直接输出就OK

但是这段程序是不正确的,程序文件如果不是gbk编码,这样做了之后也是乱码的
5 楼 ayis 2012-11-19  
hilor 写道
despotic 写道

把getBytes("iso-8859-1") , "GBK") 去掉


他说的是对, 这里已经不需要转码了..  默认编码是GBK的时候, 可以不用再在字符流读取时设置编码, 在我的平台里(默认是GBK)就可以直接用

BufferedReader reader = new BufferedReader(new InputStreamReader(in));
来获取正确的中文

对的,程序默认gbk的话,就不需要转码了
4 楼 hilor 2009-06-14  
despotic 写道

把getBytes("iso-8859-1") , "GBK") 去掉


他说的是对, 这里已经不需要转码了..  默认编码是GBK的时候, 可以不用再在字符流读取时设置编码, 在我的平台里(默认是GBK)就可以直接用

BufferedReader reader = new BufferedReader(new InputStreamReader(in));
来获取正确的中文
3 楼 hilor 2009-06-14  
呃.. 实际上用字符流的时候应该在读取时就设置好字符编码
例子中的
引用
BufferedReader reader = new BufferedReader(new InputStreamReader(in));

改成
BufferedReader reader = new BufferedReader(new InputStreamReader(in, "gbk"));


把下面结果的编码转换给去掉, 直接输出就OK
2 楼 ayis 2009-03-14  
despotic 写道

把getBytes("iso-8859-1") , "GBK") 去掉

去掉中文肯定变乱码,你试下就知道

目前这段测试程序可以得到正确的结果,但是去掉上面程序中的注释,换成字符流读取,中文就出现乱码了。我不知道BufferedReader 和 InputStreamReader到底做了什么。
1 楼 despotic 2009-03-13  
把getBytes("iso-8859-1") , "GBK") 去掉

相关推荐

Global site tag (gtag.js) - Google Analytics