簡體   English   中英

BufferedInputStream到ByteArrayOutputStream非常慢

[英]BufferedInputStream to ByteArrayOutputStream very slow

我的問題與下面的鏈接非常相​​似:

PDF到字節數組,反之亦然

主要的區別是我試圖通過包含Binary而不是文件的ServerSocket來解釋Socket連接。 這按預期工作。

但是,我遇到的問題是這個過程需要相當長的時間來讀入內存,大約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循環並繼續之前似乎暫停了一段時間。

希望有道理。

好吧,你正在閱讀,直到套接字關閉,基本上 - 當read將返回-1。

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

ByteArrayOutputStream(int size);

默認情況下,大小為32字節,因此它增加如下:32-> 64-> 128-> 256 - > ...因此,使用更大的容量初始化它。

您可以計算在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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM