0

我的班级中有两个静态块,它们从两个 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
}
4

3 回答 3

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 构造函数中设置编码。
于 2013-07-25T06:51:58.763 回答
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 获取数据并返回它。您可以从静态块中多次调用此静态函数。

于 2013-07-25T06:49:15.783 回答
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");

}
于 2013-07-25T06:50:55.283 回答