2011-11-05 23 views
0

使用java.net,java.io,從在線解析html的最快方法是什麼,並將其加載到文件或控制檯?緩衝寫入器/緩衝讀取器是否比inputstreamreader/outputstreamwriter更快?作家和讀者比輸出流和輸入流更快嗎?
我遇到嚴重滯後與下面的輸出作家/流:Java.net當你從網上解析html時,哪個速度最快?

URLConnection ii; 
BufferedReader iik = new BufferedReader(new InputStreamReader(ii.getInputStream())); 

String op; 

while(iik.readLine()!=null) { 
    op=iik.readLine(); 
    System.out.println(op); 
} 

但奇怪的是我遇到接近沒有滯後時間與下面的代碼:

URLConnection ii=i.openConnection(); 
Reader xh=new InputStreamReader(ii.getInputStream()); 

int r; 
Writer xy=new PrintWriter(System.out); 

while((r=xh.read())!=-1) { 
    xy.write(r); 
} 

xh.close(); 
xy.close(); 

這到底是怎麼回事?

+1

你的代碼不完整,你如何在第一種情況下初始化'ii'? – home

回答

3

讀者/作家不應該比Input/OutputStream本身更快。

也就是說,經過readLine()println()可能不是傳輸字節的最佳方式。在你的情況下,如果你正在加載的文件不包含許多換行符,BufferedReader必須在readLine()返回之前緩衝大量的數據。

傳輸流之間數據的規範非可怕的方式是通過使用緩衝區做在大塊:

byte[] buf = new byte[1<<12]; 
InputStream in = urlConnection.getInputStream(); 
int read = -1; 

while ((read = in.read(buf) != -1) { 
    System.out.write(buf, 0, read); 
} 

這可能是更快尚未使用NIO,它的代碼是少一點簡單我只是使用this blog post中找到的那個。

如果要寫入文件/從文件寫入,最好的方法是使用零拷貝方法,該方法是由Java提供的FileChannel.transferFrom()transferTo()。示例代碼可在a DeveloperWorks article中找到。

+0

感謝這個字節數組的例子。博客鏈接中的代碼片斷也更快。 –

4

你的第一個代碼片段是錯誤的:它讀取下一行,測試它是否爲空,忽略它,然後讀取下一行而不測試它是否爲空並打印它。

第二個代碼打印從閱讀器讀取的每個字符的整數值。

這兩個片段使用相同的底層流和讀取器,如果編碼正確,第一個片段應該由於緩衝而快一點。但是,當然,只有當行結束時,你纔會在屏幕上打印一些東西。如果服務器發送一行10 MB的文本,則必須在打印屏幕之前讀取整個10 MB。

確保關閉finally塊中的閱讀器。

+0

這可能會解釋爲什麼第一個例子(用兩個nextline調用編碼)需要永遠。非常感謝。 –