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

Tintinabulator Zea

我有一个类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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何从Android Studio中的资产读取文本文件?

使用JAVA从Android Studio中的文本文件生成带有按钮的随机单词

尝试从服务器Android Studio读取文本文件时应用崩溃

如何使用空格android java读取文本文件

如何在Android Studio中从文本文件获取JSON

在Android中逐行读取文本文件

如何在Android中读取文本文件?

从Java / Android中的文本文件读取法语单词的问题

Android读取文本文件太慢

如何在Assets文件夹android studio中包含的listview中获取文本文件

尝试逐行将文本文件加载到数组中,但数组保持为空,我在做什么错呢?(Java,Android Studio)

Android Studio XML文件不可读,XML文件成为文本文件

在android中写入文本文件

Android中的文本文件限制?

从Android上的文件夹中迭代和读取文本文件

试图在android中的AsyncTask中读取文本文件,但我得到空结果

将用户输入保存到文本文件,Android Studio

使用文本文件进行用户输入并使用按钮Android Studio保存

Android-如何从网址读取文本文件?

尝试从Uri Android读取文本文件

Delphi FMX(Android)-如何在zip流中读取文本文件而不进行提取?

使用Android(NDK)在C ++中打开和读取文本文件

如何从文本文件读取并存储到android中的数组

如何读取文本文件并将其存储在类向量中-Android

从Android中的文本文件读取类型为double的数据

无法找到保存的数据到内部存储中的文本文件,如何将文件保存在内部存储的android studio中?

在Android Studio中读取文件

在Kotlin(Android)中以字符串形式读取文本资产(资产文件夹中的文本文件)

无法使用 Android Studio Kotlin 创建文本文件。也无法使用通过 gradle 手动添加的文本文件构建 apk