我在写关于获取目标网页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;
这是我自己写的一个下载图片的方法,不知道对楼主有用没,没考虑效率问题,运行的时候感觉还可以