素人プログラマ奮闘記

javaの初心者がAndroidのことを独学で勉強しつつ、メモを残していきます。

ローカルファイル保存

Androidアプリでは、ファイルを操作する方法がいくつか用意されていますが、今回はローカルファイルについて調べていきます。

ローカルファイルとは保存場(パス)が決まっている場所にしかファイル入出力はできません。

例えば、パッケージ名がcom.java.ougiなら/data/data/com.java.ougi/filesとなります。
filesフォルダとファイルが無くても作成されます。

画面上のテキストに入力した内容を保存ボタンでファイルに保存するアプリを作ってみます。

レイアウトはこんな感じです。




レイアウト(main.xml)の内容

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    
    	<LinearLayout
	    android:layout_width="fill_parent"
	    android:layout_height="wrap_content"
	    android:layout_marginTop="5dp"
	    android:orientation="horizontal" >    	    
    	    <EditText
    	    	android:id="@+id/input_text"
    	    	android:layout_width="fill_parent"
    	    	android:layout_height="fill_parent"
    	    	android:inputType= "text"
    	    	android:background="@drawable/text_border"
    	    	android:textSize="36px"
    	    	android:text=""
    	    />
    	</LinearLayout>
    	<LinearLayout
    		android:layout_width="fill_parent"
    		android:layout_height="wrap_content"
    		android:layout_marginTop="5dp"
        	android:orientation="horizontal" >
        	<Button
        		android:id="@+id/zm_in_button"
        		android:layout_width="fill_parent"
        		android:layout_height="fill_parent"
        		android:text="@string/button.fileSave"
        	/>
        </LinearLayout>    	        	
</LinearLayout>

次にファイルに書き出す方法ですが、openFileOutput()メソッドを使用します。
ストリームを取得し、指定したファイルを書き出すためのメソッドです。。

●openFileOutput (String name, int mode)

第一引数にはパス無しでファイル名を指定します。
ファイルパスは、アプリ毎に一意に決められますので、アプリ側からパスを指定する事は出来ません。
よってファイルパスなしのファイル名を指定します。

第二引数には操作モードを下記から指定します。(複数選択可)
MODE_APPEND:既存ファイルを追記モードで開きます。
MODE_PRIVATE:ローカルファイルを作成したAndroidアプリのみに
アクセス許可を与える場合に指定します。
MODE_WORLD_READABLE:他アプリから読み取り可能にします。
MODE_WORLD_WRITEABLE:他アプリから書込み可能にします。

このファイル入出力メソッドを利用して作ったファイルは、基本的には作成したアプリケーション専用のローカルファイルになります。

openFileOutputメソッドを使えば他のアプリケーションへ読み書きの権限を付与できます。

権限付与はアプリケーションごと個別に設定することができず、allかprivateかのどちらかとなりますので、セキュリティには十分、注意してください。

上記を踏まえたうえで、以下MainActivity.javaのソースです。
package com.example.filetest;

import java.io.FileNotFoundException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends Activity implements OnClickListener{

	Button fileSaveButton = null;	//ファイル保存ボタン
	EditText inputText = null;		//入力内容
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		
		inputText = (EditText)findViewById(R.id.input_text);
		
		fileSaveButton = (Button)findViewById(R.id.fileSave_button);		
		fileSaveButton.setOnClickListener(this);		
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	@Override
	public void onClick(View v) {
		// TODO 自動生成されたメソッド・スタブ
		
		switch (v.getId()) {
		case R.id.fileSave_button:
			try {
				//入力内容取得
				String s = inputText.getText().toString();
				//OutputStream取得
				OutputStream out = openFileOutput("test.txt", MODE_PRIVATE);
				PrintWriter writer = new PrintWriter(new OutputStreamWriter(out,"UTF-8"));
				writer.append(s);
				writer.close();
			
			} catch (FileNotFoundException e) {
				// TODO 自動生成された catch ブロック
				e.printStackTrace();
			} catch (UnsupportedEncodingException e) {
				// TODO 自動生成された catch ブロック
				e.printStackTrace();
			} 
			break;
		default:
			break;
		}
		
	}

}
例外処理を省略しているので、実際に使用するにはきちんと例外処理をしましょう(´・ω・`)

カテゴリーへ

ローカルファイル読込

今回はローカルファイルを読み込んでその内容を画面に表示したいと思います。

前回作成したソフトに画面上に読込ボタンと読込んだ内容を表示するTextViewを設置します。

レイアウトはこんな感じです。




レイアウト(main.xml)の内容一部抜粋

<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"            
android:layout_marginTop="20dp"
android:orientation="horizontal" >
	<Button
	    android:id="@+id/fileRead_button"
	    android:layout_width="fill_parent"
	    android:layout_height="fill_parent"
	    android:text="@string/button.fileRead"
    />    	    
</LinearLayout>    	        	
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"            
android:layout_marginTop="5dp"
android:orientation="horizontal" >    	    
    <TextView
	    android:id="@+id/read_text"
	    android:layout_width="fill_parent"
	    android:layout_height="fill_parent"
	    android:background="@drawable/text_border"
	    android:textSize="36px"
	    android:text=""
    />
</LinearLayout>

次にファイルに書き出す方法ですが、openFileInput()メソッドを使用します。
ストリームを取得し、指定したファイルを読みだすためのメソッドです。。

●openFileInput(String name)

第一引数にはパス無しでファイル名を指定します。
ファイルパスは、アプリ毎に一意に決められますので、アプリ側からパスを指定する事は出来ません。
よってファイルパスなしのファイル名を指定します。

上記を踏まえたうえで、以下MainActivity.javaの一部ソース抜粋です。
@Override
public void onClick(View v) {
	// TODO 自動生成されたメソッド・スタブ
	
	
	switch (v.getId()) {
	case R.id.fileRead_button :
		// ストリームを開く  
		FileInputStream input ;
		try {
				input = this.openFileInput("test.txt");
				BufferedReader reader = new BufferedReader(new InputStreamReader(input));  
				StringBuffer strBuffer = new StringBuffer();  
				String line;  
				while ((line = reader.readLine()) != null) {  
					strBuffer.append(line);  
					}
				// ストリームを閉じる  
				reader.close();				
				this.readText.setText(strBuffer.toString());				
		} catch (FileNotFoundException e) {
			// TODO 自動生成された catch ブロック
			e.printStackTrace();
		} catch (IOException e) {
			// TODO 自動生成された catch ブロック
			e.printStackTrace();
		}  
		break;
	
	default:
		break;
	}
}

これで基本的なローカルファイル操作ができました。

カテゴリーへ

ローカルファイル編集ソフト(1)

今回からはローカルファイルを使って、新規作成、読み込み、編集、削除を一通り勉強するために

サンプルソフトを作成して見たいと思います。

え?いつ使うソフトなの?サンプルソフトを作成して見たいと思います。

画面は2画面でローカルファイル一覧表示画面とローカルファイル編集画面です。

まずはローカルファイル一覧表示画面レイアウト作成からです。 画面イメージ



ソース

	<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical";>    
	<!-- リストビュー --;>
	<!-- divider 区切り線の色 --;>
	<!-- dividerHeight 区切り線の幅 --;>
	<ListView
	    android:id="@+id/filelist_list"
	    android:layout_width="fill_parent"
		android:layout_height="wrap_content" 
		android:divider="#000000" 
		android:dividerHeight="1sp"
		/;>
	<!-- リストが空のときに表示 --;>
	<TextView
		android:id="@+id/fileList_empty_text"
		android:layout_width="wrap_content"
		android:layout_height="wrap_content" 
		android:text="@string/message.nodata"/;>
</LinearLayout;>				

inserted by FC2 system