你应该拥有一个MainActivity.java
或一些Activity
,它会实例化QuoteBank
。您需要使构造函数接受上下文参数:
在QuoteBank.java
中设置一个私有变量:
private Context mContext;
设置构造函数:
public QuoteBank(Context context) {
this.mContext = context;
}
然后在您的活动中实例化它,
QuoteBank quoteBank = new QuoteBank(context)
在活动中,可以通过this
或Activity.this
指令调用上下文变量,其中将“Activity”替换为您的活动名称。或者,如果您在片段中,则可以通过onCreateView(...)
方法中的View
对象获取上下文。通常是通过调用view.getContext()
来完成的。
现在,在您获取资产的方法中,您可以使用上下文:
InputStream is = mContext.getAssets().open("QuotesMonkeyBusiness.txt")
如果您正在使用Android Studio,您可以创建一个main(String[] args) { ... }
方法并运行它,或者只需启动模拟器并让它使用Log.d(...)
来显示文件输出。
或者,您也可以使用以下方法:
AssetManager am = mContext.getAssets()
InputStream is = am.open("QuotesMonkeyBusiness.txt")
也许将QuoteBank
作为单例实例会更加高效,但这完全取决于你的需求,可能会是这样:
List<String> allTextLines = QuoteBank.readFromFile(context, path_to_file)
然后在您的QuoteBank.java
类中,您可以编写如下的方法:
public class QuoteBank {
private Context mContext;
public QuoteBank(Context context) {
this.mContext = context;
}
public List<String> readLine(String path) {
List<String> mLines = new ArrayList<>();
AssetManager am = mContext.getAssets();
try {
InputStream is = am.open(path);
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String line;
while ((line = reader.readLine()) != null)
mLines.add(line);
} catch (IOException e) {
e.printStackTrace();
}
return mLines;
}
}
然后在我的MainActivity.java
类中,我有以下代码:
public class MainActivity extends AppCompatActivity {
public static final String TAG = MainActivity.class.getSimpleName();
public static final String mPath = "adventur.txt";
private QuoteBank mQuoteBank;
private List<String> mLines;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mQuoteBank = new QuoteBank(this);
mLines = mQuoteBank.readLine(mPath);
for (String string : mLines)
Log.d(TAG, string);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
这是我的项目结构:
![enter image description here](https://istack.dev59.com/wQltj.webp)
这是我从一个随机数据库下载的adventur.txt
文件:
![file](https://istack.dev59.com/iqVNY.webp)
这是我的日志输出:
![enter image description here](https://istack.dev59.com/jXUSL.webp)
更新: 为什么你不应该在Android中使用Scanner
来自官方文档:
http://developer.android.com/reference/java/util/Scanner.html
这个类并没有想象中那么有用。它在机器之间通信时很低效;你应该使用 JSON、protobufs,甚至 XML 进行通信。非常简单的用途可能可以使用 split(String) 方法实现。对于来自人类的输入,使用区域设置特定的正则表达式不仅代价高昂,而且也有些难以预测。
Scanner 类不是线程安全的。
最后说明:
我强烈建议您阅读这里使用的所有对象的文档,以便您理解整个过程。
AssetManager am = mContext.getAssets();
这一行遇到了空指针异常。在主活动中,我已经声明了上下文变量,如Activity context = new Activity();
并且在那一行之前,我已经将this.mContext = context;
赋值了。 - Tintinabulator Zea