サーチ…


前書き

Androidでのファイルの読み書きは、標準のJavaでのファイルの読み書きと同じです。同じjava.ioパッケージを使用できます。ただし、書き込みが許可されているフォルダ、一般的なアクセス許可、およびMTPの回避策に関連するものがあります。

備考

Androidは、 ここに記載されているように、複数のアプリケーション間でファイルを共有する手段を提供します 。ファイルを作成して使用するアプリケーションが1つしかない場合は、この操作は不要です。

Androidは、共有および個人設定、保存されたバンドル、組み込みデータベースなどの代替ストレージオプションを提供します。場合によっては、単純なファイルを使用するよりも優れた選択肢です。

Androidのアクティビティには、Java標準のFile IOメソッドの代わりに見える特定のメソッドはほとんどありません。たとえば、代わりのためFile.delete()を呼び出すことができますContext.deleteFile()代わりに適用するのFile.listFiles()再帰的に呼び出すことができるContext.fileList()やや少ないと、すべてのアプリの特定のファイルのリストを取得しますコード。ただし、標準のjava.ioパッケージ以外の機能は提供していません。

作業フォルダの取得

アクティビティのgetFilesDir()メソッドを呼び出すことによって、作業フォルダを取得できます(Activityは、Contextを継承するアプリケーションの中心クラスです。 ここを参照)。読書は違いはありません。あなたのアプリケーションだけがこのフォルダにアクセスできます。

アクティビティには、次のコードを含めることができます。

  File myFolder = getFilesDir();
  File myFile = new File(myFolder, "myData.bin");

バイトの生の配列を書き込む

  File myFile = new File(getFilesDir(), "myData.bin");
  FileOutputStream out = new FileOutputStream(myFile);

  // Write four bytes one two three four:
  out.write(new byte [] { 1, 2, 3, 4}
  out.close()

このコードに固有のAndroidはありません。多くの小さな値を書き込む場合は、 BufferedOutputStreamを使用してデバイスの内部SSDの摩耗を減らしてください。

オブジェクトのシリアライズ

古い良いJavaオブジェクトのシリアライズはAndroidで利用できます。次のようなSerializableクラスを定義できます。

  class Cirle implements Serializable {
    final int radius;
    final String name;

    Circle(int radius, int name) {
      this.radius = radius;
      this.name = name;
    }
  }

ObjectOutputStreamに書き込みます。

  File myFile = new File(getFilesDir(), "myObjects.bin");
  FileOutputStream out = new FileOutputStream(myFile);
  ObjectOutputStream oout = new ObjectOutputStream(new BufferedOutputStream(out));

  oout.writeObject(new Circle(10, "One"));
  oout.writeObject(new Circle(12, "Two"));
  
  oout.close()

Javaオブジェクトのシリアライゼーションは、このチュートリアルの範囲外、場合によっては意見に基づいて、あなたが何をしたいのかに応じて、完璧か悪いかのどちらかになります。あなたがそれを使うことに決めたら、 バージョン管理についてまず読んでください。

外部ストレージ(SDカード)への書き込み

また、多くのAndroid搭載デバイスに搭載されているメモリカード(SDカード)の読み書きが可能です。この場所にあるファイルは、USBケーブルを介してPCにデバイスを接続し、MTPプロトコルを有効にした後、ユーザーが直接他のプログラムからアクセスすることができます。

SDカードの場所を見つけることはいくらか問題があります。 Environmentクラスには、SDカード内に通常存在する「外部ディレクトリ」を取得する静的メソッドと、SDカードがすべて存在し、書き込み可能な場合の情報も含まれます。 この質問には、正しい場所が見つかるようにするための貴重な回答が含まれています。

外部ストレージにアクセスするには、あなたの許可が必要です。Androidマニフェスト:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

古いバージョンのAndroidの場合、これらの権限をマニフェストに入れるだけで十分です(インストール中にユーザーが承認する必要があります)。 Android 6.0からAndroidは最初のアクセス時にユーザーに承認を求めるので、この新しいアプローチをサポートする必要があります。それ以外の場合は、マニフェストに関係なくアクセスが拒否されます。

Android 6.0では、まず権限を確認し、許可されていない場合はその権限をリクエストする必要があります。コード例はこのSOの質問の中にあります。

"Invisible MTP files"の問題を解決する。

MTPプロトコルを使用してUSBケーブル経由でデスクトップにエクスポートするためのファイルを作成すると、新しく作成されたファイルが、接続されたデスクトップPC上で実行されているファイルエクスプローラにすぐに表示されないことがあります。新しいファイルを表示するには、 MediaScannerConnectionを呼び出す必要があります:

File file = new File(Environment.getExternalStoragePublicDirectory(
        Environment.DIRECTORY_DOCUMENTS), "theDocument.txt");
FileOutputStream out = new FileOutputStream(file)

... (write the document)

out.close()
MediaScannerConnection.scanFile(this, new String[] {file.getPath()}, null, null);
    context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
            Uri.fromFile(file)));

このMediaScannerConnectionコールコードは、ファイルでのみ機能し、ディレクトリでは機能しません。この問題はこのAndroidのバグレポートで説明されています。これは将来のバージョンや一部のデバイスで修正される可能性があります。

大きなファイルを扱う

小さなファイルは数秒で処理され、必要な場所のコードの代わりに読み書きできます。しかし、ファイルが大きくなったり処理が遅い場合は、AndroidでAsyncTaskを使用して、バックグラウンドでファイルを操作する必要があります。

    class FileOperation extends AsyncTask<String, Void, File> {

        @Override
        protected File doInBackground(String... params) {
          try {
            File file = new File(Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_DOCUMENTS), "bigAndComplexDocument.odf");
            FileOutputStream out = new FileOutputStream(file)

           ... (write the document)

            out.close()
            return file;
            } catch (IOException ex) {
               Log.e("Unable to write", ex);
               return null;
              }
        }

        @Override
        protected void onPostExecute(File result) {
          // This is called when we finish 
        }

        @Override
        protected void onPreExecute() {
           // This is called before we begin
        }

        @Override
        protected void onProgressUpdate(Void... values) {
            // Unlikely required for this example
        }
    }
}

その後

new FileOperation().execute("Some parameters");    

このSOの質問には、AsyncTaskを作成して呼び出す方法の完全な例が含まれています。また、IOExceptionやその他のエラーを処理する方法に関するエラー処理に関する質問も参照してください。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow