【Android】InputStreamによるバイナリファイルの読み込み方法

Androidでは次の方法でファイル読み込みが可能

  • ACTION_OPEN_DOCUMENTでピッカーUI起動
  • ユーザーにファイルを選択してもらう
  • onActivityResultなどでファイルを取得

URIを取得するのは簡単です。

ただファイル内容の読み込みとなると、意外とどうやればいいのか分からなかったです。(そもそもググっても情報がヒットしなかった)

やっとその方法が分かったので、InputStreamからバイナリファイルを読み込みする方法をまとめておきます。多分なんかの役に立つはずです。

まずはACTION_OPEN_DOCUMENTによるファイル選択について

ここは本筋とはあまり関係ありません。

でもAndroidではファイルの扱いは厳格です。

そこらへんは次の記事とかでまとめました。

▼ ACTION_CREATE_DOCUMENTの使い方

▼ ACTION_OPEN_DOCUMENTの使い方

Android11からはファイル周りの扱いが本当に厳しくなり、今までみたく気楽に外部ストレージにファイル作成とかができなくなりました。

もし Environment.getExternalStorageDirectory()  とか Environment.getExternalStoragePublicDirectory()  でファイル保存しているなら、そういったAPIは使えなくなるので注意です。

一応大事なことなので強調しておきます。

InputStreamからバイナリファイル読み込みしてみる

では以下の手順でファイルURIを取得できたとしましょう

  • ACTION_OPEN_DOCUMENTからピッカーUI起動
  • onActivityResultなどで結果を受け取る

選択ファイルをバイナリとして読み込みたかったです。

そのために次のコードを書いてみました。

▼ Javaによるバイナリ読み込みコード例

▼ このコードのログ出力結果

このようにバイナル出力できました。

ポイントは cr.openInputStream(uri)  のようにonActivityResultで受け取ったURIをInputStreamに変換することです。

あとはbyte配列にバイナリとして書き込みして、あとは1バイトずつ16進数でログ出力してるだけですね。(一応10列ごとに折り返している)

読み込みしたバイナリをBase64/DataURLに変換してみる

ここでは次のことにも挑戦してみました。

  • バイナリをBase64にエンコード
  • さらにDataURLとして変換する

DataURLはファイルそのものを表せるURLのことです。

▼ DataURLスキームとは何なのか

普通のURLはファイルの場所を表しますよね。
DataURLではデータそのものを埋め込めて扱えます。

Android開発でも便利なので使うことが多いです。
(というか使わざるを得ない場面が多い...)

 

実際にはこんなコードを書いてみました。

▼ このコードのログ出力のサンプル

DataURLの本体はBase64化されたデータなので、 Base64.encodeToString(buffer, Base64.DEFAULT);  のようにバイト配列をBase64エンコードしてます。

あとはDataURLの作法に従ってStringBuilderとか使ってDataURLの形式にすればいいだけです。ここまでできればバイナリファイルが扱いやすくなります。

バイナリファイル読み込みのポイントまとめ

箇条書きでまとめ

  • ACTION_OPEN_DOCUMENTを使ってURI取得
  • ContentResolverからInputStreamを取得
  • あとは普通にバイナリとして読み込めばOK

Androidのファイル読み書きは昔より厳格になりました。

まずはそこを理解することが大事かもしれません。

以上、Androidでのバイナリ読み込みでした。ではまた