在Android上保存文件:java.io.FileNotFoundException。打开失败:ENOENT(没有这样的文件或目录)

4

我有一个问题...我在源代码中搜索答案,但没有找到好的答案...

java.io.FileNotFoundException: /mounted/EmailClient/side-corner.png: open failed: ENOENT (No such file or directory)
at libcore.io.IoBridge.open(IoBridge.java:453)
at java.io.FileOutputStream.<init>(FileOutputStream.
at java.io.FileOutputStream.<init>(FileOutputStream.java:73) etc

代码:

private static String saveFile(String filename, InputStream input) {
    String path = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(path)) {
        try {
            byte[] attachment = new byte[input.available()];
            input.read(attachment);
            File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/EmailClient/", filename);
            if (!file.mkdirs())
                Log.d("EmailClient", "saveFile: Dir not created");
            FileOutputStream out = new FileOutputStream(file); //PROBLEM!
            out.write(attachment);
            input.close();
            out.close();
            return path;
        } catch (IOException e) {
            Log.e("EmailClient", "saveFile: File not saved", e);;
        }
    }
    return path;
}
3个回答

6
使用这段代码。
File folder = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/EmailClient/");

folder.mkdirs();
File file = new File(folder,filename);
file.createNewFile();

文件夹和文件已创建,但文件大小为0。mkdirs()和createNewFile()返回false... - Dzmitry
但根据异常,错误是文件未找到。 - Learn Pain Less
但是 byte[] attachment = [B@428943b8 - Dzmitry
@PawneshwerGupta file.mkdirs() 会创建目录,因此结果将是目录而不是文件,您可以在其中写入。因此,FileNotFoundException。 - singularity
4
这个解决方案在安卓10(三星设备)上不能使用。您能否详细说明需要注意的特定更改? - Meet

2
我认为您正在尝试将文件保存在“DIRECTORY_DOWNLOADS”目录中,因此您应该按照以下代码操作。下面这行代码可以给出目录。
   path = Environment.getExternalStoragePublicDirectory(
        Environment.DIRECTORY_DOWNLOADS);

如果您想在该路径下创建名为“Email_Client”的文件夹,请写下这行代码。
   File folder = new File(Environment.getExternalStoragePublicDirectory(
   Environment.DIRECTORY_DOWNLOADS)+"/Email_Client/");

你需要声明权限 "WRITE_EXTERNAL_STORAGE"。
String fileName="myfile.txt";
            String input="Hello World";
            String path = Environment.getExternalStorageState();
            File file=null;
            if (Environment.MEDIA_MOUNTED.equals(path)) {
                try {
                    byte[] attachment = input.getBytes();

      File folder = new File(Environment.getExternalStoragePublicDirectory(
       Environment.DIRECTORY_DOWNLOADS)+"/Email_Client/");
       folder.mkdirs();


                         file=new File(folder,fileName);
          //Automatically creates the new empty file specified by the name,   if it is not exist.
                         file.createNewFile();
                        Log.i("EmailClient", "saveFile: Dir created");
                    FileOutputStream out = new FileOutputStream(file); 
                    out.write(attachment);

                    out.close();


                } catch (IOException e) {
                    Log.e("EmailClient", "saveFile: File not saved", e);;
                }
            }

请参考此链接: https://developer.android.com/reference/android/os/Environment.html#getExternalStoragePublicDirectory(java.lang.String)

我尝试了这个。不起作用。而且我使用MVP模式,但我在那里没有使用上下文。 - Dzmitry

1
如果您正在使用目标版本API级别大于27构建应用,则默认禁用存储访问。如果您想快速启用它,请在您的AndroidManifest.xml文件中添加以下行。
<manifest ... >
  <application 
       android:requestLegacyExternalStorage="true"   //add this line 
       ... >
    ...
  </application>
</manifest>

谢谢您先生。这节省了我的时间。 - Ganesan J
感谢Ganesan的宝贵评论。 - Codemaker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接