Androidのローカルファイルにデータを保存する

ローカルファイルへの保存について解説を行います。

具体的にはAssets -> ローカルファイル へデータを保存します

今回保存してみたもの

ローカルファイルには基本なんでも保存できると思います、たぶん

今回はjpeg, png, mp3, mp4のファイルを保存してみました

 

データの書き込み方

やることはシンプル

1.InputStreamでAsset内のデータにアクセス

2.OutputStreamでローカルファイル名に書き出す名前を指定第二引数は下記のようになってるらしい。

MODE_APPEND:既存ファイルを追記モードで開きます。
MODE_PRIVATE:ローカルファイルを作成したAndroidアプリのみにアクセス許可を与える場合に指定します。
MODE_WORLD_READABLE:他アプリから読み取り可能にします。
MODE_WORLD_WRITEABLE:他アプリから書込み可能にします。

https://android.roof-balcony.com/shori/strage/localfile-2/

3.PrintWriterでローカルファイルに書き込む形式とかを決める

4.outputStream.writeでゴリゴリ書き込み

5.書き込み終了

必要なコードだけ抜粋

InputStream inputStream = getResources().getAssets().open("アセットのファイル名")
OutputStream outputStream = openFileOutput("出力先のファイル名", MODE_PRIVATE);
PrintWriter writer = new PrintWriter(new OutputStreamWriter(outputStream, "UTF-8"));
outputStream.write(buffer, 0, bytesRead);
writer.close();


書き込み速度の改善

StackOverflowにこんな書き込みがありました。outputStreamが遅い時にはbafferに分割して小さな単位で保存していくみたいなコードです。

public static void copyStream(InputStream input, OutputStream output)
    throws IOException
{
    byte[] buffer = new byte[1024]; // Adjust if you want
    int bytesRead;
    while ((bytesRead = input.read(buffer)) != -1)
    {
        output.write(buffer, 0, bytesRead);
    }
}

https://stackoverflow.com/questions/1574837/connecting-an-input-stream-to-an-outputstream

これを踏まえて最終的にこんなコードになりました。

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

try (InputStream inputStream = getResources().getAssets().open("png.png")) {
copyStream(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}

public void copyStream(InputStream inputStream) throws IOException {
byte[] buffer = new byte[1024];
int bytesRead;
OutputStream outputStream = openFileOutput("png.png", MODE_PRIVATE);
PrintWriter writer = new PrintWriter(new OutputStreamWriter(outputStream, "UTF-8"));
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
writer.close();
}
}

ローカルファイルの確認方法

ローカルに保存したファイルの確認方法ですが、別記事で詳しく書いたので確認方法については下記のリンクから参照してください

ローカルに保存したファイルの確認方法