【问题标题】:Android - error opening file just createdAndroid - 打开刚刚创建的文件时出错
【发布时间】:2013-09-04 08:47:23
【问题描述】:

我是 android 开发新手,正在尝试做一些文件 IO。每当我运行这段代码时:

File meta = new File(context.getAppContext().getFilesDir(),"meta");
meta.mkdirs();
File dir = new File(meta,"subdir");
File imageFile = new File(dir,"filename");
Log.d("test",imageFile.getAbsolutePath());
FileOutputStream outputStream = new FileOutputStream(imageFile);

我收到此错误:

    java.io.FileNotFoundException: /data/data/com.example.android.networkusage/files/meta/Greg and The Morning Buzz/artwork30.jpg: open failed: ENOENT (No such file or directory)
    at libcore.io.IoBridge.open(IoBridge.java:406)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:88)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:73)
    at com.example.android.networkusage.Podcast.downloadArtworkFromUrl(Podcast.java:117)
    at com.example.android.networkusage.Podcast.<init>(Podcast.java:93)
    at com.example.android.networkusage.JSONParser.parse(JSONParser.java:113)
    at com.example.android.networkusage.NetworkActivity.loadXmlFromNetwork(NetworkActivity.java:240)
    at com.example.android.networkusage.NetworkActivity.access$100(NetworkActivity.java:65)
    at com.example.android.networkusage.NetworkActivity$DownloadXmlTask.doInBackground(NetworkActivity.java:203)
    at com.example.android.networkusage.NetworkActivity$DownloadXmlTask.doInBackground(NetworkActivity.java:198)
    at android.os.AsyncTask$2.call(AsyncTask.java:264)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
    at java.lang.Thread.run(Thread.java:856)
    Caused by: libcore.io.ErrnoException: open failed: ENOENT (No such file or directory)
    at libcore.io.Posix.open(Native Method)
    at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110)
    at libcore.io.IoBridge.open(IoBridge.java:390)
    ... 16 more

日志甚至按照指示打印出文件的路径,所以文件必须存在!为什么会这样?

另外,我的应用程序具有内部和外部写入权限。

【问题讨论】:

    标签: java android file file-io io


    【解决方案1】:

    其中一个子目录 (subdir) 和文件不存在。代码应该调用createNewFile() 来实际创建文件。另外subdir目录需要通过调用mkdirs()来创建。

    File meta = new File(context.getAppContext().getFilesDir(),"meta")
    meta.mkdirs();
    File dir = new File(meta, "subdir");
    dir.mkdirs(); //added
    File imageFile = new File(dir, "filename.txt");
    imageFile.createNewFile(); //added
    FileOutputStream outputStream = new FileOutputStream(imageFile);
    

    我不相信File 构造函数实际上会在文件系统上创建文件。文档指出:

    此类的实例可能表示也可能不表示实际的文件系统 对象,例如文件或目录。如果它确实表示这样的对象 然后该对象驻留在一个分区中。分区是一个操作 文件系统存储的系统特定部分。单个存储 设备(例如物理磁盘驱动器、闪存、CD-ROM)可能包含 多个分区。该对象(如果有)将驻留在分区上 由该路径名的绝对形式的某个祖先命名。

    【讨论】:

    • @anonymouse 运气好吗?
    • 嗨凯文,很抱歉我花了这么长时间才回复。你的回答奏效了。谢谢!
    【解决方案2】:

    这是我现在正在做的一个项目中的一个 sn-p 代码:

    从活动/上下文内部:

    File dir = getDir("Foler", 0);        // i think your problem is here
    File file = new File(dir,"File.bin");
    

    在 android 中创建目录与在普通计算机上创建目录不同,请尝试使用 getDir() 而不是 new File(...).mkdirs() 创建目录,并确保它来自上下文内部(在活动已创建)

    我不相信我是回答这个问题的最佳人选,因为我也是 android 新手,但也许这会有所帮助

    所以最终的代码可能是这样的

    File dir = getDir("subdir",0);
    File imageFile = new File(dir, "filename.txt");
    imageFile.createNewFile();
    FileOutputStream outputStream = new FileOutputStream(imageFile);
    

    我不知道如何制作嵌套目录,直到现在我才尝试过

    【讨论】:

      猜你喜欢
      • 2017-12-19
      • 1970-01-01
      • 2022-10-14
      • 2021-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-29
      • 1970-01-01
      相关资源
      最近更新 更多