当前位置: 首页 > 面试题库 >

从Android Studio Java中的文本文件读取

益阳平
2023-03-14
问题内容

我有一个类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);
}

MainActivity

public class MainActivity extends ActionBarActivity {
QuoteBank b = new QuoteBank(MainActivity.this);

问题答案:

您应该有一个MainActivity.java或一些`Activity实例化QuoteBank。您可能希望构造函数采用context参数:

在中设置一个私有变量QuoteBank.java:

private Context mContext;

Setup up the constructor:

public QuoteBank(Context context) {
   this.mContext = context;
}

Then instantiate it in your activity,

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");

It might also make sense to have QuoteBank as a singleton instance, that
might increase efficiency although it all depends on your requirements, maybe
something like:

List<String> allTextLines = QuoteBank.readFromFile(context, path_to_file);

And then in your QuoteBank.java class you can have a method like so:

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

}

and then in my MainActivity.java class I have the following:

/**
 * 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);
}
}

UPDATE: Why you should not use a Scanner in Android

From the official documentation:

http://developer.android.com/reference/java/util/Scanner.html

此类并不像看起来的那样有用。
机器之间的通信效率非常低;您应该
为此使用JSON,protobufs甚至XML 。非常简单的用法可能会与split(String)脱节。对于
人类的输入,特定于语言环境的正则表达式的使用不仅使其
昂贵,而且有些不可预测。Scanner类不是线程
安全的。

最后提示:

我强烈建议您阅读此处使用的所有对象的文档,
以便您了解过程。



 类似资料:
  • 我的项目中有这样一段代码: 没有错误,应用程序运行正常,但是变量中从来没有任何文本,我确信txt文件中有文本! 我已经尝试过不同的方法来读取文本文件(使用BufferedReader、Scanner、FileInputStream和FileReader),但都不起作用。 另外,我几乎可以肯定问题不在变量中,因为我尝试通过代码(使用运行时)打开文件,它正常打开了正确的文件。 好的,我尝试添加,但是仍

  • 我正在编写一个程序,读取文本文件,并显示第一个学生的姓名、年级和全班平均成绩。对于上面给出的文件,结果如下:类中的第一个是Ahmad Hamwi has 16.00,类的平均值是12.25这是我试图读取的W文本文件 这就是我一直犯的错误 我已经试了几个小时了。我知道错误在第37行。这可能与类型有关。我尝试了int和浮动,但一样。

  • 问题内容: 我可以用来从图像(JPEG,PNG)文件中提取文本的最佳开源Java库是什么? 问题答案: 有GOCR和tesseract,但我不确定它们的当前版本如何堆叠-尝试同时尝试您需要处理的一些典型输入并通过此试验进行选择吗?

  • 编写了通过Spark读取文本文件的代码...在Local中运行良好...但在HDInsight中运行时产生错误->从Blob读取文本文件 org.apache.spark.sparkException:作业由于阶段失败而中止:阶段0.0中的任务0失败了4次,最近的失败:阶段0.0中丢失的任务0.3(TID 5,wn1-hchdin.bpqkkmavxs0ehkfnaruw4ed03d.dx.int

  • 我对JavaFX和JavaFX Scene Builder是新手,几个星期以来一直在研究并试图弄清楚如何简单地从文本文件中读取并在文本中显示其内容。我的controller类中有一个很好的文件读取功能,但我不知道如何将文本文件显示到fxml文档中的文本区域。我已经学会了如何单击按钮并使文件显示在文本区域中,但我希望GUI加载后立即在文本区域中显示内容。如果任何人有一个想法如何去做这件事,你的帮助将