Androidプログラミング日記 (仮)  

テキストファイル書き込み

あなたは

人目のプログラマーだよ。

Androidプログラミング日記 (仮).

 

 

 

 

ファイル書き込み

今回はファイル書き込みです。しかしちょっとした問題がいくつかあります。ちゃんと書き込めたかどうかたしかめるのには、書き込んだファイルを読み込む必要があります。それと前回読み込み編でやったように、外部ファイルに書き込むアプリケーションはあまりないということです。

以上のことから今回はその場でしか影響がない変数を使用してテキストを指定して書き込み、読み込みをし、タップしたらまた同じことを繰り返し表示させます。

それと今回使用するファイルはアプリのみで使用するファイルを使用してみようと思います。

 

 

assetsフォルダに入れたtextファイルを読み込み表示
その1のコードを使用して連続したデータを取り込み分解
今までの読み込みこんだデータを図形に変換してみた!
アプリケーション専用ファイルでの書き込み読み込み
アプリケーション終了→次回起動時までデータの保持
 

ファイル名「OutputTextActivity.java」内容はいつもの同じ

package and.roid.outputtext;

import android.app.Activity;
import android.graphics.PixelFormat;
import android.os.Bundle;
import android.view.Display;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;

public class OutputTextActivity extends Activity {
	public float disp_w,disp_h;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFormat(PixelFormat.TRANSLUCENT);
        Window window = getWindow();
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
        WindowManager manager = window.getWindowManager();
        Display disp = manager.getDefaultDisplay();
        disp_w = disp.getWidth();
        disp_h = disp.getHeight();
        setContentView(new OutputTextView(this));
    }
}
						                      

ファイル名「OutputTextActivity.java」

package and.roid.outputtext;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.MotionEvent;
import android.view.View;


public class OutputTextView extends View{

	private OutputTextActivity activity;//アクティビティクラスの登録準備
	private String text;//表示文字登録準備
	static private final String FILE_PATH = "object.txt";//ファイルパス

	//コンテキスト
	public OutputTextView(Context context) {
		super(context);
		initInOutText(context);
	}
	//ここでファイル読み込み
	private void initInOutText(Context context) {
		activity = (OutputTextActivity)context;//アクティビティクラス登録
		try{
			/* testtextはこのメソッドでのみの変数なのでちゃんと書き込んで
			 * から読み込まないと、グローバル変数のtextに代入して表示させられない。
			 * 回りくどいけどちゃんと書き込んでいるか確かめるために書き込みメソッド
			 * のあとに読み込みをしています
			 */
			String testtext =" ちゃんと書き込めるかな?タップすると新しいtextを書き込み読み込み。";
		    saveText(testtext);
		    text = readText();

		}catch (Exception e){
			text = "色々失敗";
		}
	}


	//読み込みメソッド
	public String readText() throws IOException{
		/*
		 * 今回はアプリケーション内だけで使用するファイルを使用して
		 * 読み込みをするため、今までのとはちょっとちがいます。
		 * ですがすごく似ています。基本は一緒なんですね
		 * このメソッドは呼び出し元にStringを返します。
		 */
		FileInputStream in = activity.openFileInput(FILE_PATH);
	    BufferedReader reader = new BufferedReader(new InputStreamReader(in));
	    StringBuffer sb = new StringBuffer();
	    String sbs;
	    while ((sbs = reader.readLine()) != null) {
	        sb.append(sbs);
	    }
	    in.close();
		return sb.toString();
		}

	//書き込みメソッド
	public void saveText(String text) throws IOException {
		/*
		 * 読み込みと違い、書き込みはすごく単純ですね
		 * FileOutputStreamで指定したファイルパスを作成書き込みし
		 * このメソッドの引数で受け取ったString値をこんな感じで
		 * 書き込みます。
		 * DRAWING_CACHE_QUALITY_AUTOはなんなんでしょう・・・・;;
		 */
		FileOutputStream output = activity.openFileOutput(FILE_PATH, DRAWING_CACHE_QUALITY_AUTO);
	    output.write(text.getBytes());
	    output.close();
	}
	//Viewを継承させるとここが自動的に呼ばれる
	protected void onDraw(Canvas c){
		setBackgroundColor(Color.WHITE);
		super.onDraw(c);
		Paint p = new Paint();
		p.setAntiAlias(true);

		c.drawText(text, 10, 400, p);
	}

	//タップイベント処理
	public boolean onTouchEvent(MotionEvent event){
		int action = event.getAction();
		int x = (int)event.getX();
		int y = (int)event.getY();
		switch(action){
		case MotionEvent.ACTION_DOWN:
			//タップするとここで指定したtextを書き込み読み込み
			String testtext = "新しいテキストだよ。";
			try {
				saveText(testtext);
				text = readText();
			} catch (IOException e) {
				e.printStackTrace();
			}
			break;
		case MotionEvent.ACTION_UP:
			break;
		case MotionEvent.ACTION_MOVE:
			break;
		}
		invalidate();
		return true;
	}

}
 
実行結果
無事に表示できました。

画面をタップするとテキスト表示が変わります。

前回の外部ファイルを読み込む方法は、ゲームでいえば、大きなMAPデータを読み込みたい場合とか、敵があらかじめ指定された動きをさせたくそのデータとか、そんな時に外部ファイルは便利です。

しかしながらほとんどの場合は、アプリケーションの状態を次回起動まで保持したい場合の状態書き込み、次回読み込み。人工無能的なアプリケーションなども、勉強させたテキストを保持書き込み、読み込み。ネット上からなんらかのデータを取り入れ、それを書き込み、読み込み。色々ありますが違うアプリケーション同士でデータを共有しないかきり、外部ファイルで読み書きする必要があまりなさそうですね。

今回は起動するごとにtextを指定しているので同じ結果になりますが、たとえばTextBoxを最初に起動させて内容を指定させるようにし、表示。いったんアプリを停止してもう一度起動させるとどうなるでしょう。

どうなるんだ・・・

 

assetsフォルダに入れたtextファイルを読み込み表示
その1のコードを使用して連続したデータを取り込み分解
今までの読み込みこんだデータを図形に変換してみた!
アプリケーション専用ファイルでの書き込み読み込み
アプリケーション終了→次回起動時までデータの保持
 

 

Androidプログラミング日記 (仮) | サイトマップ | 個人情報保護方針 | 応援メールテヘペロ | ©2012 Japan  相互リンク大募集中です