从InputStream读取的最快方法是什么?

时间:2015-01-20 16:47:35

标签: java performance inputstream

我正在尝试从HttpURLConnection的输入流中读取:

InputStream input = conn.getInputStream();
InputStreamReader isr = new InputStreamReader((input));
BufferedReader br = new BufferedReader(isr);

StringBuilder out = new StringBuilder("");
String output;
while ((output = br.readLine()) != null) {
    out.append(output);
}

当输入流包含大量数据时,这确实需要花费太多时间。有可能对此进行优化吗?

3 个答案:

答案 0 :(得分:3)

也许这会更快一些,因为Java 8中的新Stream API使用internaly并行机制:

package testing;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.stream.Stream;

public class StreamTest {

  /**
   * @param args the command line arguments
   * @throws java.io.IOException
   */
  public static void main(String[] args) throws IOException {
    URL url = new URL("http://www.google.com");
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    conn.setUseCaches(false);
    if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
      BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));

      Stream<String> s = br.lines();
      s.parallel().forEach(System.out::println);      
    }
  }

}

答案 1 :(得分:0)

这段代码没有什么慢的。如果输入足够快,你可以每秒读取数百万行。您的时间可能根本没有花在阅读输入流上,而是阻止等待输入或附加到StringBuilder

但你根本不应该这样做。大多数文件可以一次处理一行或一次处理一次。编译器一次处理一个令牌,并且没有比编译更复杂的文件处理任务。这是可能的。

答案 2 :(得分:0)

在java输入流中我们有方法read(byte b[],off,len) 它将输入流中的 读取到给定的字节数组中。 这里 off 是数组的起始索引,len 是要读取的最大字节数,b[] 是字节数组。 Read 方法将尝试读取最多 len 个字节,但此方法返回实际读取的字节数,因为我将无法读取所需的字节数。 这是示例:-

FileInputStream i=new FileInputStream("file path");
FIleOutputStream o=new FileOutputStream("file path");
byte a[]=new byte[1024];
for(int j;(j=i.read(a,0,1024))!=-1;){
    o.write(a,0,j);
}