【问题标题】:Android - java.io.FileNotFoundException: /storage/emulated/0/Notes/File.txt: open failed: ENOENT (No such file or directory)Android - java.io.FileNotFoundException:/storage/emulated/0/Notes/File.txt:打开失败:ENOENT(没有这样的文件或目录)
【发布时间】:2017-04-29 14:22:26
【问题描述】:

我发现很多主题都有相同的问题,但他们无法解决我的问题。 我最初写一个文件如下:`

File root = new File(Environment.getExternalStorageDirectory(), "Notes");
    if (!root.exists()) {
        root.mkdirs();
    }
    File notefile = new File(root, sFileName);
    FileWriter writer = null;
    try {
        writer = new FileWriter(notefile);
    } catch (IOException e1) {
        e1.printStackTrace();
    }
    try {
        writer.append(sBody);
    } catch (IOException e1) {
        e1.printStackTrace();
    }
    try {
        writer.flush();
    } catch (IOException e1) {
        e1.printStackTrace();
    }
    try {
        writer.close();
    } catch (IOException e1) {
        e1.printStackTrace();
    }

不要担心 try 和 catch 块,我稍后会清除它们:D。 这是应该在同一目录中工作的阅读器(SD卡的“Notes”,如果它不存在,将被创建),读取文件,并将其放在通知中,如您所见:`

File root = new File(Environment.getExternalStorageDirectory(), "Notes");
    if (!root.exists()) {
        root.mkdirs();
    }

    File file = new File(root, "Nota.txt");


    //Read text from file
    text = new StringBuilder();

    try {
        BufferedReader br = new BufferedReader(new FileReader(file));
        String line;
        while ((line = br.readLine()) != null) {
            text.append(line);
            text.append('\n');
        }
        br.close() ;
    }catch (IOException e) {
        e.printStackTrace();
    }

我真的不明白为什么我会遇到这个问题,我什至尝试使用

getExternalStorageDirectory().getAbsolutePath() 

但没有成功。

有人可以帮我吗?

【问题讨论】:

  • 您是否在清单中设置了权限?
  • 检查mkdirs()的返回值,如果返回false则不继续。它可能没有创建目录。
  • 哪个安卓版本? 6?
  • 我在 WRITE_EXTERNAL_STORAGE 和 READ_EXTERNAL_STORAGE 清单中有权限。我的版本是 5.0,现在我尝试检查 mkdirs()
  • 编辑:它使用 mkdirs() 创建目录,它返回 true

标签: java android bufferedreader readfile filenotfoundexception


【解决方案1】:

您尝试使用调试器检查 root 是否存在:

File root = new File(Environment.getExternalStorageDirectory(), "Notes");
if (!root.exists()) {
    root.mkdirs();
}

我认为它不会在您写入文件时创建文件夹

【讨论】:

    【解决方案2】:

    要在外部存储中写入文件, 您需要启用 WRITE_EXTERNAL_STORAGE 权限。

    您为什么要在外部存储中写入文件?

    我的意思是,如果您只希望此文件用于您的应用程序,则使用 context.getExternalDirs() 来获取您应用程序的沙箱,它不需要写权限,高于 android 4.2(Jelly bean)。

    如果您想将文件共享给其他应用,那么您做对了。

    并且在写入文件之前,检查外部存储是否以编程方式挂载。

    【讨论】:

    • 我必须在应用程序中保存一个备忘录,当应用程序发现特定的蓝牙设备(信标)时,它将显示在通知中。 context.getExternalDirs() 是如何工作的?文件保存在哪里?
    • getExternalDirs() 仅提供指定给您的应用程序的路径,看起来像这样 Android/Data//files/ 此目录仅指定给您的应用程序,并且您的应用程序只能在此路径内写入,并且在应用程序卸载时会被清除。虽然其他应用程序可以看到其中的文件,但比如说文件资源管理器。如果您有此目录,则此目录在 SD 卡中,如果没有,则在设备的内部存储中找到。 context.getExternalDirs() 给出了应用沙箱的确切位置,它可能是 SD 卡或内部存储。
    • developer.android.com/guide/topics/data/data-storage.html 检查此链接进行存储。 ContextCompat.getExternalFilesDirs(context, directoryType) 使用此方法是为了向后兼容,它返回文件数组,获取返回的第一项并继续处理空检查。有关更多详细信息,请查看此链接commonsware.com/blog/2014/04/09/…
    【解决方案3】:

    问题已解决

    我用的是安卓的SharedPreferences。 我将数据存储在 MainActivity 中,并按如下方式在我的 Class 中输入:

    • 主活动

      SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
      SharedPreferences.Editor editor = prefs.edit();
      editor.putString("string_id", InputString); //InputString: from the EditText
      editor.commit();
      
    • 在我的课堂上获取我的数据

      SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
      String data = prefs.getString("string_id", "no id"); //no id: default value
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多