我有一个属性文件,它位于默认包中,我使用属性文件的类也在同一个默认包中。如果我只使用文件名而没有任何路径我会收到错误。显然这是不正确的,因为我应该给某种路径来引用tat文件。我将构建应用程序使其成为一个jar文件,所以我应该如何给出路径,因为属性文件应该进入该jar文件。我正在使用Netbeans IDE。
修改
Properties pro = new Properties();
try {
pro.load(new FileInputStream("pos_config.properties"));
pro.setProperty("pos_id", "2");
pro.setProperty("shop_type", "2");
pro.store(new FileOutputStream("pos_config.properties"), null);
String pos_id = pro.getProperty("pos_id");
if(pos_id.equals("")){
pos_id="0" ;
}
global_variables.station_id = Integer.parseInt(pos_id);
String shop_type = pro.getProperty("shop_type");
if(shop_type.equals("")){
shop_type="0" ;
}
global_variables.shop_type = Integer.parseInt(shop_type);
} catch (IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
答案 0 :(得分:9)
使用getClass().getResourceAsStream("foo.properties")
但请注意,不鼓励使用默认包(上述内容适用于任何包)。
您的代码无效,因为FileInputStream(..)
使用相对于当前用户目录的路径(请参阅java.io.File
文档)。因此,它会在foo.properties
或/home/usr/
中查找c:\documents and settings\usr
。由于您的.properties
文件位于类路径上,因此可以通过Class.getResourceAsStream(..)
方法读取它。
答案 1 :(得分:6)
正如其他人所指出的那样,如果您希望能够从jar加载它,则应该从类路径而不是文件中加载它。您需要Class.getResourceAsStream()方法或ClassLoader.getResourceAsStream()方法。但是,使用getClass().getResourceAsStream("pos_config.properties")
是危险的,因为您使用的是相对于给定类已解析的路径,并且子类可以更改其解析的位置。因此,在jar中命名绝对路径是最安全的:
getClass().getResourceAsStream("/pos_config.properties")
甚至更好,使用类文字而不是getClass():
Foo.class.getResourceAsStream("pos_config.properties")
答案 2 :(得分:5)
您是否尝试从当前工作目录中获取属性文件,或者您是否尝试将其作为资源获取?听起来你应该使用它。
InputStream is = getClass().getResourceAsStream(filename);
properties.load(is);
从当前目录加载文件
properties.load(new FileInputStream(filename));
我的猜测是你真正想要的是这个。
try {
Properties pro = new Properties();
pro.load(new FileInputStream("pos_config.properties"));
String pos_id = pro.getProperty("pos_id");
try {
global_variables.station_id = Integer.parseInt(pos_id);
} catch(Exception e) {
global_variables.station_id = 0;
}
String shop_type = pro.getProperty("shop_type");
try {
global_variables.shop_type = Integer.parseInt(shop_type);
} catch(Exception e) {
global_variables.shop_type = 0;
}
} catch (IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
答案 3 :(得分:3)
无论如何,我建议将所有属性文件放在资源文件夹中。
在Eclipse中,您可以使用以下命令创建源文件夹:
右键单击 - >新的 - >源文件夹
我打赌Netbeans中有类似的东西。将所有属性文件放在那里。稍后您可以使用以下代码访问它们:
AnyClass.class.getResource("/image.png")
因此,对于您的具体问题,您可以像这样访问它:
pro.load(new FileInputStream(YourClass.class.getResource("/pos_config.properties")));
答案 4 :(得分:2)
在静态方法中我使用
ClassLoader.getSystemResourceAsStream(" name.properties&#34);
答案 5 :(得分:0)
这不会编译:
pro.load(new FileInputStream(YourClass.class.getResource("/pos_config.properties")));
正确使用:
pro.load(YourClass.class.getResourceAsStream("/pos_config.properties")));