我在使用InputStream和类Loader函数时遇到空指针异常,但在使用FileInputStream时它正在正确读取属性文件。
为什么我收到此错误?以下是我的代码。
public String readProperties()
{
String result = "";
Properties prop = new Properties();
String file = "test.properties";
//InputStream fins = getClass().getClassLoader().getResourceAsStream(file);
try
{
prop.load(new FileInputStream(file));
//prop.load(fins);
}
catch (IOException e) {
e.printStackTrace();
}
String nation = prop.getProperty("Nation");
String city = prop.getProperty("City");
String state = prop.getProperty("State");
result = "I live in "+city+" in "+state+" in "+nation;
return result;
}
答案 0 :(得分:5)
确保将test.properties文件保存在类路径中:即在应用程序的Src文件夹中
这是示例代码:
package com.example;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class ReadProperties {
public static void main(String[] args) {
ReadProperties r = new ReadProperties();
String result = r.readProperties();
System.out.println("Result : " + result);
}
public String readProperties()
{
String result = "";
Properties prop = new Properties();
String file = "test.properties";
InputStream fins = getClass().getClassLoader().getResourceAsStream(file);
try
{
//prop.load(new FileInputStream(file));
if(fins!=null)
prop.load(fins);
}
catch (IOException e) {
e.printStackTrace();
}catch (Exception e) {
e.printStackTrace();
}
String nation = prop.getProperty("Nation");
String city = prop.getProperty("City");
String state = prop.getProperty("State");
result = "I live in "+city+" in "+state+" in "+nation;
return result;
}
}
答案 1 :(得分:2)
getResourceAsStream
- 方法将在您的案例中搜索您的课程包。
来自ClassLoad.getResource
:
此方法将首先在父类加载器中搜索资源;如果父项为null,则搜索内置到虚拟机的类加载器的路径。如果失败,此方法将调用findResource(String)来查找资源。
这些ClassLoader
- 方法用于搜索可能捆绑的Java应用程序(例如,作为jar文件),而不是用于搜索应用程序旁边的文件,这看起来就像你想要做的那样。请参阅ClassLoader JavaDoc。
如果ClassLoader
无法找到资源,则getResource*
- 方法将返回null
,因此您的代码将失败(NullPointerException
- >该流是null
)。
更新:如果属性文件位于项目的根目录中,则可以在使用ClassLoader时在路径开头使用/
进行尝试。有关详细信息,请参阅this thread。
答案 2 :(得分:0)
代码可能是这样的:
String file = "/test.properties";
InputStream fins = getClass().getResourceAsStream(file);
InputStream fins = MyClass.class.getResourceAsStream(file);
相对于getClass()
的类,寻找资源,但是使用起始/
使其成为绝对资源。但是,使用getClass()
意味着实际的类可能来自另一个jar,因此使用实际的类名可能更好。
与使用File相比,资源可能来自jar(zip格式)。由于Windows上的文件不区分大小写,因此可能使用File在Windows上运行Test.properties,而不是作为资源或其他平台(Linux,MacOSX)。
打开jar(zip)并检查test.properties
是否存在。
为了完整起见:您还可以使用ClassLoader来获取资源。这是很好的jar。然而,路径必须是绝对的,而不是从/
开始。