![](/img/trans.png)
[英]Imageloader.save to ByteArrayOutputStream is painfully slow
[英]BufferedInputStream to ByteArrayOutputStream very slow
我的問題與下面的鏈接非常相似:
主要的區別是我試圖通過包含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.