Android 为什么可以';是否将文件保存在外部存储器或存储卡中?

Android 为什么可以';是否将文件保存在外部存储器或存储卡中?,android,file,android-external-storage,Android,File,Android External Storage,我想在我的存储卡中创建一个备份文件,但它所做的只是返回一个文件未找到异常。我正在指定保存数据的路径。当我选择内部存储时,文件已保存,但当我将其更改为外部存储时,它会将未找到的文件返回给我 以下是截图: 发生了什么事 您试图将数据写入一个不存在的文件,因此会引发FileNotFoundException。文件(String,String)构造函数不创建实际的文件,您必须自己处理 如何修复它 检查您的应用程序是否在清单中声明了。如果您的目标是SDK 23或更高版本,您应该 您的保存方法应如下所示:

我想在我的存储卡中创建一个备份文件,但它所做的只是返回一个文件未找到异常。我正在指定保存数据的路径。当我选择内部存储时,文件已保存,但当我将其更改为外部存储时,它会将未找到的文件返回给我

以下是截图:

发生了什么事

您试图将数据写入一个不存在的文件,因此会引发
FileNotFoundException
文件(String,String)
构造函数不创建实际的文件,您必须自己处理

如何修复它

检查您的应用程序是否在清单中声明了
。如果您的目标是SDK 23或更高版本,您应该

您的保存方法应如下所示:

private void createBackupData(String dir) {
    String filename = "BackupData.txt";
    String data = resultSet().toString();
    FileOutputStream fos = null;
    try {
        byte[] sha1hash;
        File myFile = new File(dir, filename);
       //NOTE: your file will be overwritten in case it already exists
        if (myFile.exists() || myFile.createNewFile()) {
            sha1hash = data.getBytes("UTF-8");
            String base64 = Base64.encodeToString(sha1hash, Base64.DEFAULT);
            fos = new FileOutputStream(myFile);
            fos.write(base64.getBytes());
            Toast.makeText(getActivity(), "File saved in " + dir + File.separator + filename, Toast.LENGTH_SHORT).show();
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
        Toast.makeText(getActivity(), "no file", Toast.LENGTH_SHORT).show();
    } catch (IOException e) {
        e.printStackTrace();
        Toast.makeText(getActivity(), "file not saved", Toast.LENGTH_SHORT).show();
    } finally {
        if (fos != null)
            try {
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
    }
}

注意:更好的方法是使用
Environment.getExternalStorageDirectory().getAbsolutePath()
而不是
Environment.getExternalStorageDirectory().toString()

在写入数据之前是否缺少对
myFile.createNewFile()
的调用?另外,请确保您具有写入外部存储器的权限我的问题是文件未保存在外部存储器中,但当我更改到内部存储器的路径时,它将成功保存。错误是什么?
文件
构造函数本身并不创建实际的文件,据我所知,从您的代码中,您得到了一个
FileNotFoundException
,因为您试图将数据写入一个不存在的文件。我设法将txt文件保存在内部存储器中,但当我试图更改指向外部存储器的路径时,它不会创建文件。你在哪个Android版本上测试你的应用程序?我刚刚在SDK 23平板电脑上测试了这段代码,并保存了一个“测试”字符串-它按预期工作。再次检查您是否具有写入外部存储权限。im使用android版本5.1.1 api 22请更新您的问题并添加您获得的LogCat输出是否保存在外部存储卡中?这就是我的问题所在,因为我可以存储在内存中,而不用SD卡
private void createBackupData(String dir) {
    String filename = "BackupData.txt";
    String data = resultSet().toString();
    FileOutputStream fos = null;
    try {
        byte[] sha1hash;
        File myFile = new File(dir, filename);
       //NOTE: your file will be overwritten in case it already exists
        if (myFile.exists() || myFile.createNewFile()) {
            sha1hash = data.getBytes("UTF-8");
            String base64 = Base64.encodeToString(sha1hash, Base64.DEFAULT);
            fos = new FileOutputStream(myFile);
            fos.write(base64.getBytes());
            Toast.makeText(getActivity(), "File saved in " + dir + File.separator + filename, Toast.LENGTH_SHORT).show();
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
        Toast.makeText(getActivity(), "no file", Toast.LENGTH_SHORT).show();
    } catch (IOException e) {
        e.printStackTrace();
        Toast.makeText(getActivity(), "file not saved", Toast.LENGTH_SHORT).show();
    } finally {
        if (fos != null)
            try {
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
    }
}