7

私は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

ログには指示どおりにファイルのパスも出力されるため、ファイルが存在する必要があります。なぜこうなった?

また、私のアプリには内部および外部の書き込み権限があります。

4

2 に答える 2

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コンストラクターが実際にファイルシステム上にファイルを作成するとは思いません。ドキュメントには次のように記載されています。

このクラスのインスタンスは、ファイルやディレクトリなどの実際のファイル システム オブジェクトを示す場合と示さない場合があります。そのようなオブジェクトを示す場合、そのオブジェクトはパーティションに存在します。パーティションは、ファイル システムのストレージのオペレーティング システム固有の部分です。1 つのストレージ デバイス (物理ディスク ドライブ、フラッシュ メモリ、CD-ROM など) に複数のパーティションを含めることができます。オブジェクトが存在する場合、このパス名の絶対形式の祖先によって名前が付けられたパーティションに存在します。

于 2013-08-31T21:28:58.543 に答える