日期:2014-05-20  浏览次数:20719 次

关于网页InputStream问题以及获取网页HTML代码问题
我在写关于获取目标网页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左右,有时候甚至大小还会变化

------解决方案--------------------
// 设置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();
------解决方案--------------------
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;
这是我自己写的一个下载图片的方法,不知道对楼主有用没,没考虑效率问题,运行的时候感觉还可以