ソース掲示板




すべてから検索

キーワード   条件 表示 現行ログ 過去ログ トピックス 名前 本文
Android Studio : okio によるテキストファイルの処理
日時: 2017/06/20 20:46
名前: lightbox



OkHttp はとても簡単にインターネットへのアクセスを提供してくれますが、その Okhttp が依存しているストリームの処理が okio です。

当然 okio は一般的なテキストファイルのアクセスにも簡単に使えて便利なので、Android の内部で実際に使用して整理してみました。
package com.example.lightbox.textfiletest;

import android.Manifest;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.content.res.AssetManager;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.widget.EditText;
import android.widget.TextView;

import com.example.lightbox.permission.CheckMyPermission;
import com.example.lightbox.permission.MyPermission;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.charset.Charset;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;

import okio.BufferedSink;
import okio.BufferedSource;
import okio.Okio;
import okio.Source;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

	private CheckMyPermission checkMyPermission;

	@Override
	public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
		// 全ての必要なパーミッションが許可された場合
		if ( checkMyPermission.checkPermission( requestCode,  grantResults )) {
			// onCreate で初期処理できるように、MainActivity をリスタート
			Intent intent = MainActivity.this.getIntent();
			MainActivity.this.finish();
			MainActivity.this.startActivity(intent);
		}
	}

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

		// 必要なパーミッションのリスト
		ArrayList<MyPermission> myPermission_list = new ArrayList<MyPermission>();
		myPermission_list.add(new MyPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE,100));
		// Runtime Permission 用のクラスのインスタンス
		checkMyPermission = new CheckMyPermission(MainActivity.this,myPermission_list);
		if ( checkMyPermission.checkPermission() ) {

			// ここから通常の初期処理
			Log.i("lightbox", "implements View.OnClickListener したら、setOnClickListener(this)");
			MainActivity.this.findViewById(R.id.button).setOnClickListener(this);
			MainActivity.this.findViewById(R.id.buttonReadPrivate).setOnClickListener(this);
			MainActivity.this.findViewById(R.id.buttonReadExternal).setOnClickListener(this);

			// 最初にソフトウェアキーボードを表示しない
			MainActivity.this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);

		}

	}

	// *************************
	// フォルダ作成
	// *************************
	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;
			}
		}
	}

	// *************************
	// テキストファイル一括読込
	// "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();

	}

	// ボタンの処理
	@Override
	public void onClick(View v) {

		// View から ID を取得して仕分け
		if (v.getId() == R.id.button) {

			Log.i("lightbox", "書き込み");
			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();
			}

			// 読み込みボタンを使用可能にする
			MainActivity.this.findViewById(R.id.buttonReadPrivate).setEnabled(true);
			MainActivity.this.findViewById(R.id.buttonReadExternal).setEnabled(true);

		} else if (v.getId() == R.id.buttonReadPrivate) {

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

		} else if (v.getId() == R.id.buttonReadExternal) {

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

		}

	}
}

メンテナンス

AndroidManifest.xml ( No.1 )
日時: 2017/06/20 20:47
名前: lightbox


日時: 2017/06/20 20:47
名前: lightbox
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.lightbox.textfiletest">

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
このアーティクルの参照用URLをクリップボードにコピー メンテナンス
画面(activity_main.xml) ( No.2 )
日時: 2017/06/20 20:51
名前: lightbox


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.lightbox.textfiletest.MainActivity">

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="書き込み" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:id="@+id/buttonReadPrivate"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:enabled="false"
            android:text="読み込み1"
            android:visibility="visible"/>

        <Button
            android:id="@+id/buttonReadExternal"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:enabled="false"
            android:text="読み込み2"/>
    </LinearLayout>

    <EditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="150dp"
        android:layout_margin="10dp"
        android:background="@drawable/border"
        android:ems="10"
        android:gravity="top|left"
        android:inputType="textMultiLine"
        android:padding="10dp" />

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:padding="10dp">

            <TextView
                android:id="@+id/textView"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@drawable/border"
                android:padding="10dp" />

        </LinearLayout>
    </ScrollView>

</LinearLayout>

このアーティクルの参照用URLをクリップボードにコピー メンテナンス
border.xml ( No.3 )
日時: 2017/06/20 20:50
名前: lightbox
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">

    <corners
        android:radius="4dp" />

    <stroke
        android:width="1dp"
        android:color="@android:color/black" />

</shape>
このアーティクルの参照用URLをクリップボードにコピー メンテナンス