アンドロイドの内部ストレージの例のチュートリアル
本日は、Androidの内部ストレージについて調べてみましょう。Androidは、データを保存するためのいくつかの構造化された方法を提供しています。これらには、
- Shared Preferences
- Internal Storage
- External Storage
- SQLite Storage
- Storage via Network Connection(on cloud)
このチュートリアルでは、Androidの内部ストレージを使用してデータをファイルに保存および読み込む方法について見ていきます。
アンドロイドの内部ストレージ
Androidの内部ストレージは、デバイスのメモリ上にある個人データの保存領域です。デフォルトでは、内部ストレージへのファイルの保存や読み込みはアプリケーションに対してのみプライベートとなり、他のアプリケーションはこれらのファイルにアクセスできません。ユーザーがアプリケーションをアンインストールすると、そのアプリケーションに関連する内部ストレージに保存されているファイルも削除されます。ただし、一部のユーザーはAndroidの端末をルート化しており、スーパーユーザーアクセスを取得しています。これらのユーザーは、望むファイルを読み書きすることができます。
Android内部ストレージでのテキストファイルの読み込みと書き込み
Androidでは、JavaのI/OクラスからopenFileInputとopenFileOutputを提供しており、これを使ってローカルファイルからの読み取りや書き込みストリームを変更することができます。
- openFileOutput(): This method is used to create and save a file. Its syntax is given below:
FileOutputStream fOut = openFileOutput(“file name”,Context.MODE_PRIVATE);The method openFileOutput() returns an instance of FileOutputStream. After that we can call write method to write data on the file. Its syntax is given below:
String str = “test data”;
fOut.write(str.getBytes());
fOut.close(); - openFileInput(): This method is used to open a file and read it. It returns an instance of FileInputStream. Its syntax is given below:
FileInputStream fin = openFileInput(file);After that, we call read method to read one character at a time from the file and then print it. Its syntax is given below:
int c;
String temp=””;
while( (c = fin.read()) != -1){
temp = temp + Character.toString((char)c);
}fin.close();
In the above code, string temp contains all the data of the file.
- Note that these methods do not accept file paths (e.g. path/to/file.txt), they just take simple file names.
アンドロイドの内部ストレージのプロジェクト構造
Androidの内部ストレージのサンプルコード
XMLのレイアウトには、ファイルにデータを書き込むためのEditTextと、書き込みボタンと読み込みボタンが含まれています。以下のように、onClickメソッドはxmlファイルでのみ定義されていることに注意してください:activity_main.xml
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:padding="5dp"
android:text="Android Read and Write Text from/to a File"
android:textStyle="bold"
android:textSize="28sp" />
<EditText
android:id="@+id/editText1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_below="@+id/textView1"
android:layout_marginTop="22dp"
android:minLines="5"
android:layout_margin="5dp">
<requestFocus />
</EditText>
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Write Text into File"
android:onClick="WriteBtn"
android:layout_alignTop="@+id/button2"
android:layout_alignRight="@+id/editText1"
android:layout_alignEnd="@+id/editText1" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Read Text From file"
android:onClick="ReadBtn"
android:layout_centerVertical="true"
android:layout_alignLeft="@+id/editText1"
android:layout_alignStart="@+id/editText1" />
</RelativeLayout>
MainActivityには、上記で説明されたファイルへの読み書きの実装が含まれています。
package com.scdev.internalstorage;
import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class MainActivity extends Activity {
EditText textmsg;
static final int READ_BLOCK_SIZE = 100;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textmsg=(EditText)findViewById(R.id.editText1);
}
// write text to file
public void WriteBtn(View v) {
// add-write text into file
try {
FileOutputStream fileout=openFileOutput("mytextfile.txt", MODE_PRIVATE);
OutputStreamWriter outputWriter=new OutputStreamWriter(fileout);
outputWriter.write(textmsg.getText().toString());
outputWriter.close();
//display file saved message
Toast.makeText(getBaseContext(), "File saved successfully!",
Toast.LENGTH_SHORT).show();
} catch (Exception e) {
e.printStackTrace();
}
}
// Read text from file
public void ReadBtn(View v) {
//reading text from file
try {
FileInputStream fileIn=openFileInput("mytextfile.txt");
InputStreamReader InputRead= new InputStreamReader(fileIn);
char[] inputBuffer= new char[READ_BLOCK_SIZE];
String s="";
int charRead;
while ((charRead=InputRead.read(inputBuffer))>0) {
// char to string conversion
String readstring=String.copyValueOf(inputBuffer,0,charRead);
s +=readstring;
}
InputRead.close();
textmsg.setText(s);
} catch (Exception e) {
e.printStackTrace();
}
}
}
以下のように日本語で言い換えます。1つのオプションのみです:
データを内部ストレージに正常に書き込んだ場合は、トーストが表示され、ファイルからデータを読み取り、そのデータがEditTextに表示されます。下に示す画像は、プロジェクトの出力です。画像は、テキストが内部ストレージに書き込まれ、[読む]をクリックすると同じEditTextにテキストが表示されていることを示しています。
ファイルはどこにありますか?
実際にファイルを表示するには、[ツール]→[Android]→[Androidデバイスモニター]からAndroidデバイスモニターを開きます。ファイルは、以下のイメージに示されているように、データ→データ→{パッケージ名}→ファイルのフォルダに存在します。ファイル「mytextfile.txt」は、以下に示すように、プロジェクトのパッケージ名であるcom.scdev.internalstorage内に存在します。Android内部ストレージの実例の最終プロジェクトは、以下のリンクからダウンロードできます。
Android内部ストレージのサンプルプロジェクトをダウンロードしてください。