使用BufferedReader从多个URL读取数据

时间:2013-07-25 06:39:34

标签: java

我的类中有两个静态块,用于从两个URL加载数据。我想使用单个静态块,并有效地读取数据。有关如何做到这一点的任何想法?

static {    

    URL urlA = null;
    String data = "";       
    try {
        url = new URL(urlA);            
        BufferedReader in = new BufferedReader(new InputStreamReader(urlA.openStream()));
        String inputLine;
        while ((inputLine = in.readLine()) != null) {
            data = data + inputLine;
        }
    } catch (MalformedURLException mue) {
        e.printStackTrace();
    } catch (IOException ioe) {
        e.printStackTrace();
    }
    //Do stuff with the data
}

static {    

    URL urlB = null;
    String data = "";       
    try {
        url = new URL(urlB);            
        BufferedReader in = new BufferedReader(new InputStreamReader(urlB.openStream()));
        String inputLine;
        while ((inputLine = in.readLine()) != null) {
            data = data + inputLine;
        }
    } catch (MalformedURLException mue) {
        e.printStackTrace();
    } catch (IOException ioe) {
        e.printStackTrace();
    }
    //Do stuff with the data
}

3 个答案:

答案 0 :(得分:1)

改进:

  1. 请勿使用static初始化程序块。这些是在加载类时执行的。您无法知道何时会发生这种情况,如果出现问题,则无法加载类,并且类加载错误会混淆原始错误。使用static实用程序方法,并在需要数据时“懒洋洋地”调用它。
  2. 使用StringBuilder代替String来连接输出。字符串是不可变的意味着每次你追加一行时,程序必须将到目前为止读取的内容复制到一个新的字符串中,从而导致一个重大的性能损失:

    StringBuilder input = new StringBuilder();
    String inputLine;
    while ((inputLine = in.readLine()) != null) {
        input.append(inputLine);
    }
    data = input.toString();
    
  3. 正确处理异常。如果程序未连接到网络会发生什么?你会得到IOException,程序会在某处打印堆栈跟踪,然后是什么?没有数据从任何地方加载,因此无需处理。

  4. 字符编码。该程序假定远程系统使用恰好是本地系统上的默认编码的字符编码。如果你完全控制程序将在哪里运行,这不一定是一个问题,但更安全的是不做出这样的假设,而是使用一些固定的众所周知的编码,比如UTF-8。在InputStreamReader构造函数中设置编码。

答案 1 :(得分:0)

你可以这样:

static {    

        String dataFromUrl1 = loadFromUrl("http://myurl1");
        String dataFromUrl2 = loadFromUrl("http://myurl2");
    }


private static String loadFromUrl(String urlStr){
    String data = "";       
    try {
        URL url = new URL(urlStr);            
        BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
        String inputLine;
        while ((inputLine = in.readLine()) != null) {
            data = data + inputLine;
        }
    } catch (MalformedURLException mue) {
        mue.printStackTrace();
    } catch (IOException ioe) {
        ioe.printStackTrace();
    }
    return data;

}

这里有一个静态函数,它从给定的URL获取数据并返回它。你可以从静态块中多次调用这个静态函数。

答案 2 :(得分:0)

你可以这样做:

public static String readUrl(String urlString) {    

    String data = "";       
    try {
        url = new URL(urlString);            
        BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
        String inputLine;
        while ((inputLine = in.readLine()) != null) {
            data = data + inputLine;
        }
    } catch (MalformedURLException mue) {
        e.printStackTrace();
    } catch (IOException ioe) {
        e.printStackTrace();
    }
    return data;
}

public static String data1;
public static String data2;

static {    

data1 = readUrl("http://google.com");    
data2 = readUrl("http://oracle.com");

}