2013-08-31 21 views
6

私はアンドロイド開発に新しく、ファイル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

サブディレクトリの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コンストラクタが実際にファイルシステムにファイルを作成するとは思わない。ドキュメントの状態:アンドロイドでディレクトリを作成

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

:アクティビティ/コンテキスト内から

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

こんにちはKevin、申し訳ありませんが、私は返事にとても時間がかかりました。あなたの答えはうまくいった。ありがとう! – anonymouse

1

これは私が今働いているプロジェクトからのコードの抜粋です新しいファイル(...)。mkdirs()の代わりにgetDir()を使用してディレクトリを作成し、コンテキスト内(アクティビティの作成後)から作成してください。

私は同様にAndroidに新しいんだけど、多分これは多分私が知らないこの

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

よう

ので、最終的なコードに役立ちますので、私はこの質問に答えるための最良の一人です信じてはいけませんネストされたディレクトリを作る、私は今までそれを試していない

関連する問題