我的类中有两个静态块,用于从两个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
}
答案 0 :(得分:1)
改进:
static
初始化程序块。这些是在加载类时执行的。您无法知道何时会发生这种情况,如果出现问题,则无法加载类,并且类加载错误会混淆原始错误。使用static
实用程序方法,并在需要数据时“懒洋洋地”调用它。使用StringBuilder
代替String
来连接输出。字符串是不可变的意味着每次你追加一行时,程序必须将到目前为止读取的内容复制到一个新的字符串中,从而导致一个重大的性能损失:
StringBuilder input = new StringBuilder();
String inputLine;
while ((inputLine = in.readLine()) != null) {
input.append(inputLine);
}
data = input.toString();
正确处理异常。如果程序未连接到网络会发生什么?你会得到IOException
,程序会在某处打印堆栈跟踪,然后是什么?没有数据从任何地方加载,因此无需处理。
答案 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");
}