Android内部没有Context的访问原始文件(非Activity)

时间:2015-03-21 22:33:44

标签: android file-io applicationcontext

myActivity.class中有代码

InputStream inputStream = getApplicationContext().getResources().openRawResource(R.raw.text);
BufferedReader buff = new BufferedReader(new InputStreamReader(inputStream));
String s;
ArrayList <String> list = new ArrayList <String>();
try    
{  while((s = buff.readLine()) != null)
       {
           list.add(s);
       }

} catch (IOException e) {
           e.printStackTrace();
} finally {
        try {
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
}

我想将这部分代码移到单独的java.class中,但在这里我遇到了一个问题,如何在不使用getApplicationContext()的情况下通过InputStream访问原始文件?

例如:

public class MyArrayList extends ArrayList<String>
{

private InputStream in = ???; // how to declare InpuStream without Context???
private BufferedReader buff = new BufferedReader(new InputStreamReader(in));;
private String s;
private MyArrayList array;

public MyArrayList ()
{
    try
    {
        while ((s = buff.readLine()) != null)
          {
            array.add(s);
          }

    } catch (IOException e)
    {
        e.printStackTrace();
    } finally
    {
        try {
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

}

我试过了      InputStream in = Resources.getSystem().openRawResource(R.raw.text);但它给了我NullPointerException

所以我的问题是:是否存在某些方法来使用Activity之外的原始文件初始化InputStream?

2 个答案:

答案 0 :(得分:1)

  

如何在不使用getApplicationContext()的情况下通过InputStream访问原始文件?

首先,您现有代码中不需要getApplicationContext()。删除它将工作得很好,它可以节省不必要的电话。

除此之外 - 并且假设您确实认为ArrayList应该对I / O负责 - MyArrayList需要您传递以下其中一项:

  • InputStream

  • Resources(因此您可以在其上调用openRawResource())或

  • 合适的Context(因此您可以在其上调用getResources())(根据MyArrayList的有效期,可以是several possible objects之一)

答案 1 :(得分:0)

如果没有当前的应用上下文,您将无法访问App资源。如果你想在diff Java文件中移动代码,只需创建一个类并在该类中创建一个带有activity的函数作为函数的参数和所需的返回类型之一。 由于活动是上下文的父级,我们可以在需要活动或上下文引用的地方使用它。

public class Demo{

public static "whatEverReturnTypeYouNeedToReturnFromFunction" f1(Activity act, ...){
InputStream inputStream = act.getResources().openRawResource(R.raw.text);
BufferedReader buff = new BufferedReader(new InputStreamReader(inputStream));
String s;
ArrayList <String> list = new ArrayList <String>();
try    
{  while((s = buff.readLine()) != null)
       {
           list.add(s);
       }

} catch (IOException e) {
           e.printStackTrace();
} finally {
        try {
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
return whatEverReturnTypeYouNeedToReturnFromFunction;
}
}
}

在上面的代码中,make变量是静态的,因为我们的函数是静态的。 要从Activity类中调用它,只需调用

即可
Type "whateverYouWhatToGetFromFunction" = Demo.f1(this, ...);