【问题标题】:Fail to locate text file找不到文本文件
【发布时间】:2017-03-12 19:50:02
【问题描述】:

我基本上是在尝试从文本文件中读取一长串数字(双精度)并将它们保存到一个数组中。我有这些代码行,但是当我加载到我的 android 智能手机时它不起作用。当我使用调试模式来检查我的代码是否读取了 ExamScore 时,readfile() 确实可以完全工作,它确实会读取并按预期将值存储在我的笔记本电脑中。当它加载到智能手机中时,它就不起作用了。我将我的 ExamScore.txt 保存在 android studio 的根目录中,例如 Users->AndroidStudioProjects->Project A。我主要关心的是:

  1. 我如何知道这个 ExamScore.txt 在我构建应用程序时是否也保存到了我的智能手机中?我必须将文本文件单独保存到我的智能手机中吗?我得到的错误是

java.io.FileNotFoundException:ExamScore.txt:打开失败:ENOENT(没有这样的文件或目录)

static double[] readfile() throws FileNotFoundException{

    Scanner scorefile = new Scanner(new File("ExamScore.txt"));
    int count = -1;
    double[] score = new double[8641];
    while (scorefile.hasNext()) {
        count = count + 1;
        score[count] = Double.parseDouble(scorefile.nextLine());
    }
    scorefile.close();
    return score;
}

在我的主代码中,

double []score=readfile();

【问题讨论】:

标签: android readfile


【解决方案1】:

我将我的 ExamScore.txt 保存在 android studio 的根目录中,例如,Users->AndroidStudioProjects->Project A..​​. 我如何知道这个 ExamScore.txt 在我构建时是否也保存到了我的智能手机中应用程序?

不是。

您需要创建一个资产文件夹。

参考:Where do I place the 'assets' folder in Android Studio?

您将使用getAssets() 从该文件夹中读取。

public class MainActivity extends Activity {

    private double[] readfile() throws FileNotFoundException{

        InputStream fileStream = getAssets().open("ExamScore.txt");
        // TODO: read an InputStream

    }
}

注意:这是您应用的只读位置。

或者您可以使用内部 SD 卡。

How do I read the file content from the Internal storage - Android App


编辑在其他答案中使用重构代码

public static List<Double> readScore(Context context, String filename)  {

    List<Double> scores = new ArrayList<>();

    AssetManager mgr = context.getAssets();
    try ( 
        BufferedReader reader = new BufferedReader(
            new InputStreamReader(mgr.open(fileName)));
    ) {
        String mLine;
        while ((mLine = reader.readLine()) != null) {
             scores.add(Double.parseDouble(mLine));
        }
    } catch (NumberFormatException e) {
        Log.e("ERROR: readScore", e.getMessage());
    }
    return scores;
}

然后

List<Double> scores = readScore(MainActivity.this, "score.txt");

【讨论】:

  • 嘿@cricket_007 这是否意味着如果我保存到笔记本电脑的资产文件夹中,当我构建应用程序时,它会被“推送”到我的安卓智能手机中?
  • 应该,是的。 assets 目录将是安装到您的应用程序的 APK 文件的一部分。根据您放入的内容,它可以使文件大小非常大,因此可能存在大小限制。
  • 但在我创建资产文件夹并使用您提到的代码后,它给了我错误无法解析方法 getAssets()。
  • 那么你的Activity中没有那个代码……或者你需要在方法上删除static
【解决方案2】:

对于那些想知道的人,这是我的解决方案!谢谢大家的帮助!!!!我遇到的问题是我没有在主要活动中编写它,而是在其他 java 文件中编写了代码。在将其写入主活动文件并将我的文本文件放入资产文件夹后。问题已解决:

public static LinkedList<Double> score=new LinkedList<Double>();
public  void readScore() throws java.io.IOException {
    BufferedReader reader = new BufferedReader(
            new InputStreamReader(getAssets().open("score.txt")));
    String mLine;
    while ((mLine = reader.readLine()) != null) {
         score.add(Double.parseDouble(mLine));
    }
    reader.close();
}

【讨论】:

  • 查看我的答案的编辑以获得“更好”的版本。
  • 感谢@cricket_007,感谢您的努力!只是一个快速的问题。你能教我每次我的应用程序启动时如何触发 readScore 吗?我现在的问题是我需要将分数传递给另一个函数,但我当前的函数是当一个按钮被点击时,只有它会触发 List scores = readScore(MainActivity.this, "score 。文本”);。我的应用程序现在有错误,因为如果未启动该列表始终为空!我希望你明白我的意思。
  • 您可以在您需要的活动的覆盖onStart() 方法(或只是onCreate())中调用此方法
  • 亲爱的@cricket_007,非常感谢您的帮助!我的问题现在已经解决了:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
  • 1970-01-01
相关资源
最近更新 更多