2017-08-22 9 views
-1

私は次のコードを書いています。私がしようとしているのは、url.openConnectionから数回(17.000回)読むことです。私は基本的には、ArrayListから与えられた単語に応じて、ウェブサイトからコードを検索して抽出したいと考えています。しかし、それは約40回BufferedReaderを作成した後には本当に遅くなります。これを行うより良い方法はありますか?BufferedReaderが複数回作成された後に遅くなる

for(int i=0;i<words.size();i++){ 
     key=(String)words.get(i); 
     url=new URL("http://www.tvs.com/x/"+key); 
     String word; 
     InputStreamReader in=new InputStreamReader(url.openStream()); 
     BufferedReader reader=new BufferedReader(in); 
     while((word=reader.readLine())!=null){ 
      frase=frase+word; 
     } 
     reader.close(); 
     in.close(); 
} 

答えて

0
  1. ボトルネックはほぼ確実に、文字列contatenationです。 StringBufferまたはStringBuilderを使用してください。
  2. 送信ホストが遅くなることがあります。 BufferedReaderは、データが配信されるよりも速く読み取ることができません。サーバーが過負荷になっている可能性があります。

    frase = frase + word; 
    

    、メモリバッファにメモリコピー長く、より長い文字列を再割当てされ、実行されるたびに:

1

上記のコードはO(N^2)に起因して減速を経験しています。

StringBuilder使用する方がよいでしょう。でも、例外の場合には、トライして資源InputStreamInputStreamReaderBufferedReaderが常に適切に閉じられていることを確認する:

StringBuilder sb = new StringBuilder(); 

for(int i=0;i<words.size();i++) { 
    key = (String)words.get(i); 
    url = new URL("http://www.tvs.com/x/" + key); 
    try (InputStream is = url.openStream(); 
      InputStreamReader in = new InputStreamReader(is); 
      BufferedReader reader = new BufferedReader(in)) { 
     String word; 
     while((word = reader.readLine()) != null) { 
      sb.append(word); 
     } 
    } 
} 

frase = sb.toString(); 

も示されています。

1

StringBufferを使用するための提案は、あなたが望むものを、おそらくですが、あなたは、Java 8を使用している場合は、あなたが必要とする文字列を連結するBufferedReader.lines()方法とコレクタを使用することができます。

URL url = new URL("http://www.tvs.com/x/" + key); 
    try (InputStream is = url.openStream(); 
     InputStreamReader in = new InputStreamReader(is, StandardCharsets.UTF_8); 
     BufferedReader reader = new BufferedReader(in)) { 
    String phrase = reader.lines().collect(Collectors.joining(System.lineSeparator())); 
    } 
+0

ニースストリームソリューション。しかし、OPはキーワードの 'ArrayList'で始まるので、ストリームにマップし、フラットマップを線にしてから、収集して結合する必要があります。 :-) – AJNeufeld

+0

@AJNeufeld、私はそれが例外とリソース安全な方法でこれを行う価値があるよりも厄介になるだろうと思う:-( – msandiford

関連する問題