我有一个类QuoteBank,需要使用扫描仪读取txt文件,但是它给了我一个文件未找到异常
Java文件位于app / src / main / java / nate.marxBros / QuoteBank.java中
txt文件位于app / src / main / assets / Quotes.txt
该代码是
File file = new File("assets/QuotesMonkeyBusiness.txt");
Scanner input = null;
try {
input = new Scanner(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
应该像其他任何Java程序一样工作吗?但是它给文件找不到异常
我已经在这个网站上尝试了很多事情,例如从原始资源文本文件读取Android Studio,但是该方法不起作用,因为我不知道如何在上下文中传递
谢谢你的帮助
更新的代码
public class QuoteBank {
private ArrayList<ArrayList<QuoteBank>> bank;
private Context mContext;
private ArrayList<QuoteQuestion> monkeyBuisness;
public QuoteBank(Context context){
mContext = context;
InputStream is = null;
try {
is = mContext.getAssets().open("QuotesMonkeyBusiness.txt");
} catch (IOException e) {
e.printStackTrace();
}
ArrayList<QuoteQuestion> monkeyBuisness = parseFileToBank(is);
}
主要活动
public class MainActivity extends ActionBarActivity {
QuoteBank b = new QuoteBank(MainActivity.this);
您应该有一个MainActivity.java
或一些Activity
实例化QuoteBank
。您可能希望构造函数采用context参数:
在中设置一个私有变量QuoteBank.java
:
private Context mContext;
设置构造函数:
public QuoteBank(Context context) {
this.mContext = context;
}
然后在您的活动中实例化它,
QuoteBank quoteBank = new QuoteBank(context);
可以在活动中通过this
命令调用上下文变量,也可以在Activity.this
其中用活动名称替换“ Activity”。另外,如果您位于片段中,则可以从方法View
内部的对象获取上下文onCreateView(...)
。通常通过致电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
课程中,您可以使用如下方法:
/**
* Created by AndyRoid on 5/23/15.
*/
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
课堂上,我有以下内容:
/**
* Created by AndyRoid on 5/23/15.
*/
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) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
这是我的项目结构:
这是adventur.txt
我从随机数据库下载的文件:
这是我的日志输出:
更新:为什么不应该在Android中使用扫描仪
从官方文档中:
http://developer.android.com/reference/java/util/Scanner.html
此类并不像看起来的那样有用。机器之间的通信效率非常低;您应该为此使用JSON,protobufs甚至XML。非常简单的用法可能会与split(String)脱节。对于人类的输入,特定于语言环境的正则表达式的使用不仅使其昂贵,而且有些不可预测。Scanner类不是线程安全的。
最后提示:
我强烈建议您阅读此处使用的所有对象的文档,以便您了解过程。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句