如何加载位于assets文件夹中的属性文件?

3

我正在开发一款Android应用程序,需要读取位于 /app/src/main/assets/app.properties 的assets文件夹中的属性。

但是当我使用以下代码时:

Properties properties = new Properties();
try {
properties.load(new FileInputStream("app.properties"));
} catch (IOException e) {
...
}

输入流似乎是null。我认为我必须明确指定filepath或类似的东西来访问我的属性文件。
我需要在这个类中使用我的属性:/app/src/main/java/mypackage/model/myclass.java

请访问以下网址以了解有关在Android中使用属性文件的方法:http://javaant.com/how-to-use-properties-file-in-android/#.Vw4PbkfJrIU - Vivek Mishra
https://dev59.com/JG855IYBdhLWcg3w6I3V#4082182 可能会有所帮助。 - Kennet
4个回答

2
您可以使用Android上下文来加载属性文件,如下所示:

您可以使用以下代码:

context.getAssets().open("app.properties");

例如,在一个Fragment中:
try{
    Properties properties = new Properties();
    properties.load(this.getActivity().getAssets().open("app.properties"));
}catch(Exception e){
    e.printStackTrace();
}

由于您似乎需要在上下文不可访问的类中使用它,因此可以创建自己的应用程序类,并具有对上下文的静态访问,然后在任何地方使用该上下文。

创建您的应用程序类:

public class MyApp extends Application {
    private static MyApp instance;

    public static MyApp getInstance() {
        return instance;
    }

    public static Context getContext(){
        return instance.getApplicationContext()
    }

    @Override
    public void onCreate() {
        instance = this;
        super.onCreate();
    }
}

将新创建的应用添加到清单文件中:
<application
    android:name="com.example.yourapp.MyApp"
    ...

完成这一步后,您可以在XML解析器中加载您的属性:
try{
    Properties properties = new Properties();
    properties.load(MyApp.getContext().getAssets().open("app.properties"));
}catch(Exception e){
    e.printStackTrace();
}

我无法使用getActivity().getAssets()...因为我所在的类不是Activity,而且我也不能使用context。我的类是XML解析器,我的属性文件存储了我可以在XML文件中找到的所有XML节点。 - Swodniw
请查看我更新的答案,以便将上下文传递给您的解析器。 - Guillaume Barré
谢谢!它起作用了,我不知道我们可以创建一个“虚拟上下文”,这正是我所需要的。 - Swodniw
@Nirekin为什么不在应用程序类的构造函数中设置instance = this - Bhargav

1
尝试获取资源并读取它:
AssetFileDescriptor fileDescriptor = assetManager.openFd(fileName);
FileInputStream stream = fileDescriptor.createInputStream();
Properties properties = new Properties();
try {
properties.load(stream);
} catch (IOException e) {
...
}

0
在我的单元测试 "XMLParserTest" 中,位于 /app/src/test/java/mypackage/XMLParserTest 的路径下,我尝试使用以下代码:
    InputStream is = null;
    Properties prop = null;
    try {
        prop = new Properties();
        is = new FileInputStream(new File("C:/...fullpath.../app/src/main/assets/app.properties"));
        prop.load(is);
    } catch (FileNotFoundException e)
    {
        e.printStackTrace();
    } catch (IOException e)
    {
        e.printStackTrace();
    }

它可以工作,但当我将其放入我的XMLParser类中时,我的inputStream“是”空的。 就像这个类无法访问.properties文件一样。它仅适用于测试...


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接