Android 在没有上下文的情况下访问 class 内的原始文件(非 Activity)

Android access raw file inside class without Context (non- Activity)

我里面有代码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?

how I can to access a raw file by InputStream without using getApplicationContext()?

首先,您的现有代码中不需要 getApplicationContext()。删除它会很好,并且可以节省不必要的调用。

除此之外——假设你真的认为ArrayList应该对I/O负责——MyArrayList需要你传递以下之一:

  • InputStream,或

  • Resources(这样你就可以调用openRawResource()),或者

  • 一个合适的Context(这样你就可以在上面调用getResources())(根据MyArrayList的生命周期,它可能是several possible objects)

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

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;
}
}
}

在上面的代码中,将变量设为静态,因为我们的函数是静态的。 并从 Activity class 调用它只需调用

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