2013-08-31 63 views
6

我是新来的android开发,并试图做一些文件IO。每当我运行的代码块:Android - 刚刚创建的错误打开文件

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 

日志,甚至打印出该文件的路径为指导,因此该文件必须存在!这是为什么发生?

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

回答

6

其中一个子目录(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构造实际创建的文件系统上的文件。该文件指出:

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.

+0

@anonymouse是否有幸运? –

+0

嗨凯文,对不起,我花了这么长时间来回复。你的答案奏效。谢谢! – anonymouse

1

这是代码从一个项目,一个片断我的工作现在:

从活动/上下文中:

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

创造的Android目录与普通计算机上的java不同,尝试使用getDir()而不是新文件(...)。mkdirs()创建目录,并确保它是从上下文中创建的(在创建活动之后)

我不相信我是因为我是新到Android为好,但也许这有助于

所以最终的代码也许这样

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

我不知道来回答这个问题最好的一个制作嵌套目录,我没有尝试到现在为止

相关问题