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, ...);
我里面有代码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, ...);