JAVA属性加载静态变量inputstream返回null值

时间:2016-06-12 01:06:20

标签: java

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”变量更改为非静态(我的意思是局部变量)时,事情是正确的,但为什么?

1 个答案:

答案 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();
    }
}