public class PropertyDemo {
private static InputStream in = PropertyDemo.class.getClassLoader().getResourceAsStream("address.properties");
public void test() {
try {
// InputStream in = PropertyDemo.class.getClassLoader().getResourceAsStream("address.properties");
Properties pro = new Properties();
pro.load(in);
String address = pro.getProperty("returnInfoRegister");
System.out.println(address);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new PropertyDemo().test();
new PropertyDemo().test();
}}
在上面的代码中,第一次运行将返回正确的值,但第二次运行返回null值我不知道为什么,但是当我将“in”变量更改为非静态(我的意思是局部变量)时,事情是正确的,但为什么?
答案 0 :(得分:1)
当你在阅读它的流中移动时,你就在它的尽头。使用它作为静态,保存该状态(因为它是您在main中声明的两个类实例中的相同变量)。因此,下次使用它时,它已经在流的末尾。当您将其声明为非静态时,它是每个类实例的新实例,并且您很好。
但实际上没有理由将其声明为类级变量。你的内部变量要好得多。您还应该考虑在最后关闭流。
public class PropertyDemo {
//private static InputStream in = PropertyDemo.class.getClassLoader().getResourceAsStream("address.properties");
public void test() {
InputStream in = null;
try {
in = PropertyDemo.class.getClassLoader().getResourceAsStream("address.properties");
Properties pro = new Properties();
pro.load(in);
String address = pro.getProperty("returnInfoRegister");
System.out.println(address);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (in != null) {
try {in.close();} catch (Exception e) {}
}
}
}
public static void main(String[] args) {
new PropertyDemo().test();
new PropertyDemo().test();
}
}