2014-02-25 73 views
6

我有非常類似下面的鏈接問題:的BufferedInputStream到ByteArrayOutputStream很慢

PDF to byte array and vice versa

主要區別在於我試圖解釋通過一個ServerSocket包含二進制套接字連接,而不是文件。 這按預期工作。

然而,我有問題是,該過程正在相當長的時間來讀入內存,約1分鐘30秒500個字節(儘管每個流的大小將大量變化)

這裏的我的代碼:

BufferedInputStream input = new BufferedInputStream(theSocket.getInputStream()); 
byte[] buffer = new byte[8192]; 
int bytesRead; 
ByteArrayOutputStream output = new ByteArrayOutputStream(); 

while ((bytesRead = input.read(buffer)) != -1) 
{ 
    output.write(buffer, 0, bytesRead); 
} 

byte[] outputBytes = output.toByteArray(); 

//Continue ... and eventually close inputstream 

如果我登錄這是它似乎相當迅速記錄所有字節的終端內的while循環內的過程中(即到達流的末尾),但隨後似乎暫停了時間在擺脫while循環並繼續之前。

希望是有道理的。

+0

服務器是否關閉連接?您所描述的內容看起來像是流阻塞,等待更多字節到達。 –

回答

5

那麼你正在閱讀,直到套接字關閉,基本上 - 這是read將返回-1。

所以我的猜測是,連接的另一端在關閉它之前將其打開90秒。修復這個問題,你會解決你的問題。

+1

如果你不能控制連接的另一端,你可以嘗試設置socket的超時時間:'theSocket.setSoTimeout(10000); // 10s套接字超時' – Vlad

+0

這是有道理的。我認爲讀-1表示所有信息都已收到,而不是套接字超時。我的問題是,沒有辦法告訴什麼時候'結束套接字流',即沒有固定的大小或字節在流的末尾,以指示'結束' – D4y

+0

@ D4y:確切地說 - 這只是一個流數據。如果你想要一個基於消息的協議(例如通過長度前綴或消息結束數據),你需要把它放在你自己。 –

0
ByteArrayOutputStream(int size); 

默認情況下,大小爲32個字節,因此increses這樣的:32-> 64-> 128-> 256 - > ... 因此具有更大的容量初始化。

0

您可以花費多長時間在BufferedInputStream和ByteArrayOutputStream之間複製數據。

int size = 256 << 20; // 256 MB 
ByteArrayInputStream bais = new ByteArrayInputStream(new byte[size]); 
long start = System.nanoTime(); 
BufferedInputStream input = new BufferedInputStream(bais); 
byte[] buffer = new byte[8192]; 
int bytesRead; 
ByteArrayOutputStream output = new ByteArrayOutputStream(); 

while ((bytesRead = input.read(buffer)) != -1) { 
    output.write(buffer, 0, bytesRead); 
} 

byte[] outputBytes = output.toByteArray(); 
long time = System.nanoTime() - start; 
System.out.printf("Took %.3f seconds to copy %,d MB %n", time/1e9, size >> 20); 

打印

Took 0.365 seconds to copy 256 MB 

它會快得多對於較小的消息即< < 256 MB。