我在写关于获取目标网页HTML代码的时候,用url.openConnection().getInputStream()得到了一个网页的输入流(in),然后问题就来了,当我用InputStreamReader来读取它的时候,一切正常,而用in.available()获得in的大小后整个读取,却不能得到正确的大小,从而导致获得的网页只有前2K左右的HTML代码。不知道这是什么问题。
    虽然第一中方法可行,但是他的效率太低,我不知道怎么把InputStreamReader整个读取到一个变量,只能逐CHAR读取,用BufferedReader也只能逐行读取,遇到处理大量网页时,速度实在太慢,不知道有什么方法能快速获得一个网页的全部HTML代码。出问题的InputStream大小:import java.io.*;  
import java.net.*;public class GetHtml2 { public static void main(String[] arg) throws IOException{
InputStream in = null;
//String html = "";
try{
URL this_url = new URL("http://www.cellularfactory.com/");
in = this_url.openConnection().getInputStream();
int availableLength = in.available();
byte[] totalBytes = new byte[availableLength];
in.read(totalBytes);
// String htmlsource = new String(totalBytes);
System.out.println("Length of html is " + availableLength);
// System.out.println(htmlsource);
}
finally{
if(in!=null)
in.close();
}
}
}//运行以上代码,获得的HTML大小只有2K左右,有时候甚至大小还会变化

解决方案 »

  1.   

    听说available方法不是很准,楼主要另想办法了
      

  2.   

    // 设置buffer为10k
    int BUFFER_SIZE = 1024 * 10;byte[] bytes = new byte[BUFFER_SIZE];
    int length = 0;
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    while ((length = in.read(bytes)) >= 0)
    {
    baos.write(bytes, 0, length);
    }
    // 得到整个页面
    byte[] totalBytes = baos.toByteArray();
      

  3.   

    try {
    is = new BufferedInputStream(new URL(this.url).openStream());
    os = new FileOutputStream(fileName);
    int bytesRead = 0;
    byte[] buffer = new byte[1024 * 8];
    while ((bytesRead = is.read(buffer, 0, 1024 * 8)) != -1) {
    os.write(buffer, 0, bytesRead);
    }
    is.close();
    os.close();
    } catch (Exception e) {
    new File(fileName).deleteOnExit();
    System.out.println("Warning! " + e.getMessage() + "\n" + this.url
    + " download failed!");
    return false;
    }
    System.out.println(this.url + " download completed!");
    return true;
    这是我自己写的一个下载图片的方法,不知道对楼主有用没,没考虑效率问题,运行的时候感觉还可以
      

  4.   

    其实都差不多了,我甚至试过了调用LINUX命令LYNX来获得网页HTML代码,但是还是需要通过输入流得到数据,而输入流InputStream.available()总是有问题,我也彻底没办法了,就这么将就了吧。