Android - ファイル入出力の例(Read、Write、内部、外部ストレージ)

内部、外部ストレージにファイルを読み書きする例を紹介します。

内部、外部ストレージ

アプリの内部では、外部ストレージとは、次のパスを意味し、すべての権限なしに使用することができるアプリのデータ空間です。

  • 内部ストレージ:/data/data/[package name]
  • 外部ストレージ:/storage/emulated/0/Android/data/[package name]

内部、外部ストレージのパスは、次のAPIを利用して得ることができます。

  • 内部ストレージ:Context.getFilesDir()
  • 外部ストレージ:Context.getExternalFilesDir(null)

ストアの詳細については、アプリデータフォルダのパスと内部/外部ストレージの説明を参照してください。

ファイル入出力

Byte単位のデータを読み書きするには、以下のクラスを利用します。

  • FileInputStream, FileOutputStream
  • BufferedInputStream, BufferedoutputStream

Stringデータを読み書きするには、以下のクラスを使用してください。

  • FileReader, FileWiter
  • BufferedReader, BufferedWriter

この記事では、BufferedReader、BufferedWriterを利用して、Textを読み書き例を作ってみましょう。

一般的に、FileReaderよりBufferedReaderを使用することを性能にお勧めします。 BufferedReaderの詳細については、Java - BufferedReader、BufferedWriter例を参照してください。

ファイルの書き込みの例

次のように内部ストレージのファイルに文字列を格納することができます。 close()を呼び出すと、 append()で入力された文字列がファイルに保存されます。

val filePath = filesDir.path + "/myText.txt"
Log.d("Test", "path : $filePath")
writeTextToFile(filePath)


fun writeTextToFile(path: String) {
    val file = File(path)
    val fileWriter = FileWriter(file, false)
    val bufferedWriter = BufferedWriter(fileWriter)

    bufferedWriter.append("Test1\n")
    bufferedWriter.append("Test2")
    bufferedWriter.newLine()
    bufferedWriter.append("Test3\n")
    bufferedWriter.close()
}

実行してみると次のようなパスに保存されます。

12-23 20:22:34.110  5218  5218 D Test    : path : /data/user/0/com.example.app/files/myText.txt

次のように内部ストレージにファイルが保存されていることを確認することもできます。

generic_x86_arm:/data/data/com.example.app/files # cat myText.txt   
Test1
Test2
Test3

ファイルの読み取りの例

次のように内部ストレージに保存されたファイルを読み取ることができます。 readlines()forEach()を利用して、line単位で文字列を読み取ることができます。

val filePath = filesDir.path + "/myText.txt"
readTextFromFile(filePath)


fun readTextFromFile(path: String) {
    val file = File(path)
    val fileReader = FileReader(file)
    val bufferedReader = BufferedReader(fileReader)

    bufferedReader.readLines().forEach() {
        Log.d("Test", it)
    }
}

外部ストレージのファイルの読み書き

次のように外部ストレージのパスのみ引数として渡す必要がある。

val filePath = getExternalFilesDir(null)!!.path + "/myText.txt"
Log.d("Test", "path : $filePath")

writeTextToFile(filePath)
readTextFromFile(filePath)

上記のコードを実行してみると次のようなパスのファイルを保存して読み取ります。

12-23 20:27:46.277  5365  5365 D Test    : path : /storage/emulated/0/Android/data/com.example.app/files/myText.txt
12-23 20:27:46.282  5365  5365 D Test    : Test1
12-23 20:27:46.282  5365  5365 D Test    : Test2
12-23 20:27:46.283  5365  5365 D Test    : Test3

getExternalFilesDir() API

デバイスをPCに接続したときは、PCからデバイスのストレージ容量を見ることができますよ。そのRoot pathが storage/emulated/0/です。

/storage/emulated/0/Android/data/は、外付けのスペースでアプリの専用データフォルダに割り当てられている空間です。 このフォルダのPathは、 getExternalFilesDir(null)にインポートすることができます。

引数としてnullを渡すと、 "../files/"が返され、引数として Environment.DIRECTORY_MUSICをめくる"../files/Music"の形で返されます。

val appMusicDir = getExternalFilesDir(Environment.DIRECTORY_MUSIC)
Log.d("Test", "path : ${appMusicDir!!.path}")

Output:

12-23 20:52:50.630  5590  5590 D Test    : path : /storage/emulated/0/Android/data/com.example.example/files/Music

DIRECTORY_MUSIC加えて、次のようなものを引数として渡すことができます。

  • Environment.DIRECTORY_MUSIC
  • Environment.DIRECTORY_PODCASTS
  • Environment.DIRECTORY_RINGTONES
  • Environment.DIRECTORY_ALARMS
  • Environment.DIRECTORY_NOTIFICATIONS
  • Environment.DIRECTORY_PICTURES
  • Environment.DIRECTORY_MOVIES
codechachaCopyright ©2019 codechacha