如果你要看這篇文章,希望你對inputStream流的讀取已經有所了解。
InputStream讀取流有三個方法,分別為read(),read(byte[] b),read(byte[] b, int off, int len)。在從數據流里讀取數據時,為圖簡單,經常用InputStream.read()方法。這個方法是從流里每次只讀取讀取一個字節,效率會非常低。更好的方法是用InputStream.read(byte[] b)或者InputStream.read(byte[] b,int off,int len)方法,一次讀取多個字節。但是這些方法都不能一次性把流中的數據讀取完整或不知道有沒有讀取完整。
遇到上面這個問題,網上有人提出用InputStream.available()方法
int count = in.available(); byte[] b = new byte[count]; in.read(b);
這個方法可以在讀寫操作前先得知數據流里有多少個字節可以讀取。需要注意的是,如果這個方法用在從本地文件讀取數據時,一般不會遇到問題,但如果是用於網絡操作,就經常會遇到一些麻煩。這是因為網絡通訊往往是間斷性的,一串字節往往分幾批進行發送。
我是真遇到上面說的問題了,最后的解決辦法是使用readInputStream方法:
URL url = new URL (urlStr); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); //設置超時間為3秒 conn.setConnectTimeout(3*1000); //防止屏蔽程序抓取而返回403錯誤 conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)"); //得到輸入流 InputStream inputStream = conn.getInputStream(); byte[] getData = readInputStream(inputStream); inputStream.read(getData); String str = new String(getData); System.out.println ("打印內容:"+str);
readInputStream方法:
public static byte[] readInputStream(InputStream inputStream) throws IOException { byte[] buffer = new byte[1024]; int len = 0; ByteArrayOutputStream bos = new ByteArrayOutputStream(); while((len = inputStream.read(buffer)) != -1) { bos.write(buffer, 0, len); } bos.close(); return bos.toByteArray(); }