【问题标题】:Android: File Not Found ExceptionAndroid:找不到文件异常
【发布时间】:2018-12-19 01:52:08
【问题描述】:

我正在尝试为我的安卓手机编写一个简单的待办事项应用程序。我已经走得够远了,我想保存我输入的这些字符串。但是,每次我尝试写入数据时,我都会得到一个文件未找到异常。这是我在 onCreate 方法中用于实例化文件的代码。

File path = getFilesDir();
File itemFile = new File(path,"Todo_File.txt");

然后我有两种方法,一种是写入文件,另一种是从文件中读取。它们看起来像这样:`

public void readItems() {
    try {
        BufferedReader reader = new BufferedReader(new FileReader("Todo_File.txt"));
        while(reader.readLine()!=null){
            items.add(reader.readLine());
        }
    } catch(IOException e) {
        e.printStackTrace();
    }
}

public void writeItems() {
    try{
        BufferedWriter writer = new BufferedWriter(new FileWriter("Todo_File.txt"));
        for(int i=0;i<items.size();i++){
            writer.write(items.get(i));
        }
    } catch (IOException e){
        e.printStackTrace();
    }
}

items 是一个 stringArray,它保存输入的字符串。每次我尝试写入或读取文件时,都会出现以下异常:

W/System.err: java.io.FileNotFoundException: Todo_File.txt(没有这样的文件或目录)

我不明白为什么 Android Studio 找不到我创建的文件,谁能帮忙?

【问题讨论】:

  • 你应该使用你定义的File itemFile
  • 你这是什么意思?
  • 确实如此。 FileWriter 将使用完整路径。不仅仅是一个文件名。所以使用 itemFile.getAbsolutePath()。

标签: android filenotfoundexception


【解决方案1】:

您正在查找文件“Todo_File.txt”。

您将此文件保存在哪里? 您是将其作为资源文件保存在应用程序的“res/raw”目录中还是位于手机存储中的某个位置?

在这里您可以了解存储的类型

https://developer.android.com/guide/topics/data/data-storage.html

https://android.stackexchange.com/questions/112951/two-types-of-internal-storage-what-is-the-difference

我猜您很可能需要更正此文件的路径。 这里是获取“/storage/sdcard0/”路径的方法

Environment.getExternalStorageDirectory()

【讨论】:

  • 我正在尝试将其放入手机的内存中。前两行代码没有做到这一点吗?
  • 您只需要提供完整路径。例如,如果它在下载目录中,则使用 -"Environment.getExternalStorageDirectory()//Download//Todo_File.txt"
  • 另外,我看到您也在尝试写入文件,因此您还需要获取写入权限才能使用正确的路径写入文件。
【解决方案2】:

在 Android 中执行 File-IO 的标准方法是使用上下文相关的 IO 方法。

写入文件,请使用以下代码。有关不同文件模式的详细信息,请参阅here

FileOutputStream fOut = openFileOutput("Todo_File.txt", MODE_WORLD_READABLE);

读取文件,请使用:

FileInputStream fIn = openFileInput("Todo_File.txt");

【讨论】:

    【解决方案3】:

    既然你定义了

    File path = getFilesDir();  
    File itemFile = new File(path,"Todo_File.txt");
    

    你可以这样做:

    public void readItems() {
        try {
            BufferedReader reader = new BufferedReader(new FileReader(itemFile));
            while(reader.readLine()!=null){
                items.add(reader.readLine());
            }
        } catch(IOException e) {
            e.printStackTrace();
        }
    }
    
    public void writeItems() {
        try{
            BufferedWriter writer = new BufferedWriter(new FileWriter(itemFile));
            for(int i=0;i<items.size();i++){
                writer.write(items.get(i));
            }
        } catch (IOException e){
            e.printStackTrace();
        }
    }
    

    【讨论】:

      【解决方案4】:

      您需要在写入文件之前实际创建文件。你应该这样做:

      File path = getFilesDir();  
      File itemFile = new File(path,"Todo_File.txt");
      
      if (!path.exists()) {
           path.mkdirs();
      }
      

      您所做的只是尝试从文件中读取。您收到错误的事实:

      W/System.err: java.io.FileNotFoundException: Todo_File.txt (No such file or directory)
      

      表示您要写入的文件尚未创建,我看不到您在任何地方创建文件。

      如果您使用的是模拟器,则需要确保您的设备上设置了 SDK 卡,然后执行以下操作:

      File itemFile = new File(Environment.getExternalStorageDirectory(),"Todo_File.txt");
      
      if (!path.exists()) {
           path.mkdirs();
      }
      

      【讨论】:

      • 所以使用设备监视器,我进入了模拟手机的文件,文件指定的目录不存在,即使添加了你的代码。我在这里做错了什么?
      • 如果您使用的是模拟器,您需要将设备设置为拥有 SD 卡,然后写入外部存储。查看我的更新。
      猜你喜欢
      • 2013-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多