2

私のアプリでは、パブリック URL からリクエストを作成し、Web ページのソース コードを開き、最後にソース コードから必要な情報を抽出します。このプロセス全体で問題はありませんでした。ただし、必要な情報をロードするのに非常に時間がかかります。私ができる他の効率的な方法はありますか?

public class GetMethodEx {

    public String getInternetData(String currentUrl) throws Exception{
        BufferedReader in = null;
        String data = null;
        try{
            HttpClient client = new DefaultHttpClient();
            URI website = new URI(currentUrl);
            HttpGet request = new HttpGet();
            request.setURI(website);
            HttpResponse response = client.execute(request);
            in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
            StringBuffer sb = new StringBuffer("");
            String l = "";
            String nl = System.getProperty("line.separator");
            while((l = in.readLine()) !=null){
                sb.append(l + nl);
            }
            in.close();
            data = sb.toString();
            return data;
        }finally{
            if (in != null){
                try{
                    in.close();
                    return data;
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }
    }   
}
4

1 に答える 1

0

StringBuffer を使用すると、html ファイルが 1 つであるため、大きなテキストをダウンロードするのは実際には効率的ではありません。あなたが行を読んでいるので、Javaはあなたが読んでいる行ごとにメモリを割り当てる必要があります. 次に、StringBuffer のサイズは固定であるため、プログラムが StringBuffers のサイズを超えるポイントに到達すると、StringBuffer のサイズが変更され、Buffer 内のすべてが新しいものにコピーされます。したがって、要求した html ドキュメントのサイズを取得して、すべてを char 配列に読み込むようにしてください。http では可変サイズのチャンクでデータを転送できるため、これは機能しない可能性があります。その場合にできることのアイデアを次に示します。

String html = "";
CharBuffer buff = CharBuffer.allocate(16384);

int read = in.read(buff);
while(read > -1) {
    while(read > -1 && buff.remaining > 0) {
        read = in.read(buff);
    }
    html += new String(buff.array());
    buff.clear();
}
于 2012-07-24T15:25:27.617 に答える