![](/img/trans.png)
[英]Is it possible for BufferedReader.readLine() to not read a whole line when reading from a slow stream?
[英]Reading inputStream using BufferedReader.readLine() is too slow
我正在使用以下代碼。
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line = null;
StringBuilder responseData = new StringBuilder();
while((line = in.readLine()) != null) {
responseData.append(line);
}
但閱讀200行需要12秒以上。
請幫忙
我強烈懷疑這是因為網絡連接或你正在與之交談的網絡服務器 - 這不是BufferedReader
的錯。 試着測量一下:
InputStream stream = conn.getInputStream();
byte[] buffer = new byte[1000];
// Start timing
while (stream.read(buffer) > 0)
{
}
// End timing
我想你會發現它幾乎與解析文本的時間完全相同。
請注意,您還應該為InputStreamReader
提供適當的編碼 - 平台默認編碼幾乎肯定不是您應該使用的。
我有一個更長的測試嘗試。 這需要平均160 ns讀取每一行,因為它將它添加到List(這可能是你想要的,因為刪除換行不是很有用。
public static void main(String... args) throws IOException {
final int runs = 5 * 1000 * 1000;
final ServerSocket ss = new ServerSocket(0);
new Thread(new Runnable() {
@Override
public void run() {
try {
Socket serverConn = ss.accept();
String line = "Hello World!\n";
BufferedWriter br = new BufferedWriter(new OutputStreamWriter(serverConn.getOutputStream()));
for (int count = 0; count < runs; count++)
br.write(line);
serverConn.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
Socket conn = new Socket("localhost", ss.getLocalPort());
long start = System.nanoTime();
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
List<String> responseData = new ArrayList<String>();
while ((line = in.readLine()) != null) {
responseData.add(line);
}
long time = System.nanoTime() - start;
System.out.println("Average time to read a line was " + time / runs + " ns.");
conn.close();
ss.close();
}
版畫
Average time to read a line was 158 ns.
如果你想構建一個StringBuilder,保留換行符,我會建議采用以下方法。
Reader r = new InputStreamReader(conn.getInputStream());
String line;
StringBuilder sb = new StringBuilder();
char[] chars = new char[4*1024];
int len;
while((len = r.read(chars))>=0) {
sb.append(chars, 0, len);
}
還是打印
Average time to read a line was 159 ns.
在這兩種情況下,速度都受發送者而不是接收者的限制。 通過優化發送器,我將此時間降低到每行105 ns。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.