Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android - error opening file just created

I'm new to android developement and trying to do some file IO. Whenever I run this block of code:

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);

I get this error:

    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

The log even prints out the file's path as directed, so the file must exist! Why is this happening?

Also, my app has internal and external write priviledges.

like image 495
anonymouse Avatar asked Aug 31 '13 21:08

anonymouse


1 Answers

One of the sub-directories (subdir) and file do not exist. The code should call createNewFile() to actually create the file. Also the subdir directory needs to be made by calling 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);

I do not believe the File constructor actually creates the file on the file system. The documentation states:

Instances of this class may or may not denote an actual file-system object such as a file or a directory. If it does denote such an object then that object resides in a partition. A partition is an operating system-specific portion of storage for a file system. A single storage device (e.g. a physical disk-drive, flash memory, CD-ROM) may contain multiple partitions. The object, if any, will reside on the partition named by some ancestor of the absolute form of this pathname.

like image 153
Kevin Bowersox Avatar answered Nov 12 '22 06:11

Kevin Bowersox