java抓取網頁保存的亂碼問題解決

昨天用java抓html文件,獲取下來的html文件打開總是帶有亂碼,弄了半天搞定了。其實要避免亂碼的一個好方法:沒有必要去判斷頁面的編碼方式,只要讀取的數據按字節(而不是按字符)保存起來就可以了,後綴爲html文件,然後用瀏覽器打開,肯定是正常的。

 

分析的原因:在網絡上傳送的數據是基於字節流的,我們要在屏幕上顯示的時候要將字節流按某種字符集解碼成String的形式,在java中就是將字節流按某種格式解碼成Unicode,在將數據寫入文件的時候,又要將String按某種格式編碼成字節流,當兩次的編碼不一致的時候,就會造成亂碼。所以在抓取網頁進行保存的時候,可以直接將得到的字節流保存到文件中就可以了。

 

 

字節流字符流主要的區別是他們的的處理方式

字節流是最基本的,所有的InputStreamOutputStream的子類都是,主要用在處理二進制數據,它是按字節來處理的

 

實際中很多的數據是文本,又提出了字符流的概念,它是按虛擬機的encode來處理,也就是要進行字符集的轉化

 

在實際開發中出現的亂碼問題實際上都是在字符流和字節流之間轉化不統一而造成的

 

注:

對於我們常用的GBK中,英文是佔用1個字節,中文是2個
對於UTF-8,英文是1個,中文是3個
對於Unicode,英文中文都是2個


下面一段代碼是用來抓取http://tomfish88.iteye.com/並保存到本地的java程序。


 

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.net.MalformedURLException;

import java.net.URL;

 

public class Test {

public static void main(String[] argc) {

URL url = null;

FileOutputStream fos = null;

InputStream is;

try {

for (int i = 0; i < 1; i++) {

url = new URL("http://tomfish88.iteye.com/");

byte bytes[] = new byte[1024 * 1000];

int index = 0;

is = url.openStream();

int count = is.read(bytes, index, 1024 * 100);

while (count != -1) {

index += count;

count = is.read(bytes, index, 1);

}

fos = new FileOutputStream("test.html");

System.out.println(index);

fos.write(bytes, 0, index);

is.close();

fos.close();

}

} catch (MalformedURLException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章