OkHttp はとても簡単にインターネットへのアクセスを提供してくれます。その Okhttp が依存しているストリームの処理が okio です。 当然 okio は一般的なテキストファイルのアクセスにも簡単に使えて便利なので、Android の内部で扱われる『位置付け』別に処理を実際に使用して整理してみました。 ★ 全体のソースコードbuild.gradle への記述 ▼ 2018/10/31 時点 api 'com.squareup.okio:okio:2.1.0' ( api は、依存関係に関して compile と同等らしいので / compile は 2018年の終わりに削除 ) ▼ 2017/06/20 時点compile 'com.squareup.okio:okio:1.13.0'Runtime Permission の対応 ▼ 以下のテンプレートを使用しています Android 6.0 : テストの為の Runtime Permission の対応を自動化するテンプレート okio を使用した2つのメソッドを用意 okio には、BufferedSource と BufferedSink というクラスがあり、それぞれ 入力と出力を担当しています。一応サンプルとして OkioTest.java を読むと雰囲気がつかめると思いますが、欲しい機能はそれほど複雑では無いので以下の2つのメソッドだけでも十分使いこなせると思います。
// ************************* // テキストファイル一括読込 // "UTF-8" or "windows-31j" // ************************* private String readTextAll(InputStream inputStream, String charset) throws Exception { String result; BufferedSource bufferedSource = Okio.buffer(Okio.source(inputStream)); result = bufferedSource.readString(Charset.forName(charset)); bufferedSource.close(); inputStream.close(); return result; } // ************************* // ファイルコピー // ************************* private void copy(InputStream inputStream, OutputStream outputStream) throws Exception { Source source = Okio.source(inputStream); BufferedSink bufferedSink = Okio.buffer(Okio.sink(outputStream)); bufferedSink.writeAll(source); bufferedSink.close(); source.close(); }
1) UTF-8 を指定して書き込み Charset charset = Charset.forName("UTF-8"); sink.writeString("ストレージ情報\n",charset); 2) 専用メソッドで UTF-8 として書き込み sink.writeUtf8(Manifest.permission.CAMERA + "\n"); ※ sink は BufferedSink ですさらに、プリファレンスの書き込みも行います(36〜46)。
try { InputStream inputStream; AssetManager assetManager = MainActivity.this.getResources().getAssets(); // **************************************** // syain.csv を assets から プライベートエリアへコピー // **************************************** inputStream = assetManager.open("syain.csv"); copy(inputStream, openFileOutput("syain.csv", MODE_PRIVATE)); // **************************************** // syain.csv を assets から 外部ストレージへコピー // **************************************** createDir(); inputStream = assetManager.open("syain.csv"); String csvPath = Environment.getExternalStorageDirectory().getPath() + "/textfiletest/syain.csv"; copy(inputStream, new FileOutputStream(csvPath)); // **************************************** // プライベートなテキストファイルの作成と書き込み // **************************************** BufferedSink sink = Okio.buffer(Okio.sink(openFileOutput("test.txt", MODE_PRIVATE))); Charset charset = Charset.forName("UTF-8"); sink.writeString("ストレージ情報\n",charset); sink.writeUtf8(String.format("%s\n", Environment.getExternalStorageDirectory().getPath())); sink.writeUtf8(Manifest.permission.CAMERA + "\n"); sink.writeUtf8(Manifest.permission.WRITE_EXTERNAL_STORAGE + "\n"); sink.writeUtf8(PackageManager.PERMISSION_GRANTED + "\n"); sink.close(); // **************************************** // プライベートな小さな情報を保存する為の本来の方法 // private_data.xml の作成 // **************************************** SharedPreferences data = getSharedPreferences("private_data", MODE_PRIVATE); SharedPreferences.Editor editor = data.edit(); // 現在の年月日・時分秒を取得する為の準備 Calendar cal = Calendar.getInstance(); SimpleDateFormat sf = new SimpleDateFormat("yyyyMMdd_HHmmss"); // データの書き込み editor.putString("now", sf.format(cal.getTime())); editor.putString("japan", "日本語"); editor.commit(); } catch (Exception e) { e.printStackTrace(); }
外部ストレージにフォルダの作成 Runtime Permission の対象処理です
// ************************* // フォルダ作成 // ************************* private void createDir() { String imageDir = Environment.getExternalStorageDirectory().getPath() + "/textfiletest"; Log.i("lightbox", imageDir ); File file = new File(imageDir); // ディレクトリ初期作成 if (!file.exists()) { if (file.mkdir() == false) { Log.i("lightbox", "ディレクトリを作成できませんでした"); return; } } }
画面にファイルを読込み(1) まずは、パッケージ内の領域から読み込んで画面に表示します( openFileInput ) ※ 画面定義
StringBuilder sb = new StringBuilder(); InputStream inputStream; String text; Log.i("lightbox", "読み込み1"); try { // **************************************** // プライベートなテキストファイルの読み込み // "UTF-8" or "windows-31j" // **************************************** inputStream = openFileInput("test.txt"); text = readTextAll(inputStream,"UTF-8"); sb.append(text); // **************************************** // プライベートなテキストファイルの読み込み // "UTF-8" or "windows-31j" // **************************************** inputStream = openFileInput("syain.csv"); text = readTextAll(inputStream,"windows-31j"); sb.append(text); EditText editText = (EditText) MainActivity.this.findViewById(R.id.editText); editText.setText(sb.toString()); TextView textView = (TextView) MainActivity.this.findViewById(R.id.textView); textView.setText(sb.toString()); // **************************************** // private_data.xml からデータの取得 // **************************************** SharedPreferences data = getSharedPreferences("private_data", MODE_PRIVATE); Log.i("lightbox", data.getString("now", "このデータはありません")); Log.i("lightbox", data.getString("japan", "このデータはありません")); } catch (Exception e) { e.printStackTrace(); }
UTF-8 と SHIFT_JIS で保存してあるファイルの一括読み込みです。キャラクタセットに関する Oracle のドキュメントはこちらになります。 ※ プリファレンスは Log.i で表示しています 画面にファイルを読込み(2) 外部ストレージより読み込みます( Runtime Permision の対象処理 ) new FileInputStream(path) ※ test.txt は、画面表示の都合で読み込んでいます
StringBuilder sb = new StringBuilder(); InputStream inputStream; BufferedSource bufferedSource; String text; Log.i("lightbox", "読み込み2"); try { // **************************************** // プライベートなテキストファイルの読み込み // "UTF-8" or "windows-31j" // **************************************** inputStream = openFileInput("test.txt"); text = readTextAll(inputStream,"UTF-8"); sb.append(text); // **************************************** // 外部ストレージからテキストファイルの読み込み // "UTF-8" or "windows-31j" // **************************************** String csvPath = Environment.getExternalStorageDirectory().getPath() + "/textfiletest/syain.csv"; inputStream = new FileInputStream(csvPath); text = readTextAll(inputStream,"windows-31j"); sb.append(text); EditText editText = (EditText) MainActivity.this.findViewById(R.id.editText); editText.setText(sb.toString()); TextView textView = (TextView) MainActivity.this.findViewById(R.id.textView); textView.setText(sb.toString()); } catch (Exception e) { e.printStackTrace(); }
関連する記事 : 一般的な Java のテキスト読込み Java : テキストファイルを読み込んで正規表現で置換