SQLの窓

2017年06月20日


Android での保存用テキストデータの扱いを okio で簡素化する

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();

}
assets に syain.csv ファイルを置いて他の場所にコピー(書込み) syain.csv は、Windows の一般的な SHIFT_JIS のテキストファイル(CSV) です。このデータを パッケージの領域と 外部ストレージにコピーして、後でテキストファイルの読み込みをテストします。 他にバリエーションとして、okio で直接パッケージの領域にテキストファイル(test.txt)を "UTF-8" として書き込んでいます(23〜30)。
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 : テキストファイルを読み込んで正規表現で置換



【2017 Android Studioの最新記事】
posted by lightbox at 2017-06-20 21:17 | 2017 Android Studio | このブログの読者になる | 更新情報をチェックする
container 終わり



フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり