今日はAndroidの内部ストレージについて見ていきます。 Androidにはいくつかの構造化された方法がありますデータを保存するための。これには
- 共有プリファレンス
- 内部ストレージ
- 外部ストレージ
- SQLiteストレージ
- ネットワーク接続経由でのストレージ(クラウド上)
このチュートリアルでは、Androidの内部ストレージを使用してファイルにデータを保存および読み込む方法について見ていきます。
Androidの内部ストレージ
Androidの内部ストレージは、デバイスのメモリ上にプライベートデータを保存することです。デフォルトでは、内部ストレージへのファイルの保存と読み込みはアプリケーションに対してのみプライベートであり、他のアプリケーションはこれらのファイルにアクセスすることはできません。ユーザーがアプリケーションをアンインストールすると、アプリケーションに関連付けられた内部ストレージに保存されているファイルも削除されます。ただし、一部のユーザーはルート化されたAndroidの携帯電話を使用しており、スーパーユーザーアクセスを取得しています。これらのユーザーは望むファイルを読み書きすることができます。
Android内部ストレージでのテキストファイルの読み書き
Androidは、JavaのI/OクラスからopenFileInput
とopenFileOutput
を提供しています。これらを使用すると、ローカルファイルへの読み書きストリームの変更が可能です。
-
openFileOutput(): このメソッドは、ファイルを作成して保存するために使用されます。構文は以下の通りです:
FileOutputStream fOut = openFileOutput("ファイル名",Context.MODE_PRIVATE);
openFileOutput()
メソッドはFileOutputStream
のインスタンスを返します。その後、write
メソッドを呼び出してデータをファイルに書き込むことができます。構文は以下の通りです:String str = "テストデータ"; fOut.write(str.getBytes()); fOut.close();
-
openFileInput():このメソッドは、ファイルを開いて読み取るために使用されます。FileInputStreamのインスタンスを返します。以下に構文が示されています:
FileInputStream fin = openFileInput(file);
その後、ファイルから1文字ずつ読み取り、それを印刷するためにreadメソッドを呼び出します。以下に構文が示されています:
int c; String temp=""; while( (c = fin.read()) != -1){ temp = temp + Character.toString((char)c); } fin.close();
上記のコードでは、文字列tempにファイルのすべてのデータが含まれています。
-
これらのメソッドはファイルパス(例:path/to/file.txt)を受け付けないことに注意してください。単純なファイル名のみを取ります。
Androidの内部ストレージプロジェクト構造
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.journaldev.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);
}
// ファイルへのテキストの書き込み
public void WriteBtn(View v) {
// ファイルにテキストを追記
try {
FileOutputStream fileout=openFileOutput("mytextfile.txt", MODE_PRIVATE);
OutputStreamWriter outputWriter=new OutputStreamWriter(fileout);
outputWriter.write(textmsg.getText().toString());
outputWriter.close();
// ファイル保存メッセージの表示
Toast.makeText(getBaseContext(), "File saved successfully!",
Toast.LENGTH_SHORT).show();
} catch (Exception e) {
e.printStackTrace();
}
}
// ファイルからテキストを読み取る
public void ReadBtn(View v) {
// ファイルからテキストを読み込む
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からstringへの変換
String readstring=String.copyValueOf(inputBuffer,0,charRead);
s +=readstring;
}
InputRead.close();
textmsg.setText(s);
} catch (Exception e) {
e.printStackTrace();
}
}
}
ここでは、データが内部ストレージに正常に書き込まれた場合にはトーストが表示され、データがファイルから読み取られた場合には同じEditTextに表示されます。以下の画像は、プロジェクトの出力を示しています。画像は、テキストが内部ストレージに書き込まれ、Readをクリックすると同じEditTextにテキストが表示される様子を表しています。
ファイルはどこにありますか?
実際にファイルを表示するには、ツールからAndroid Device Monitorを開きます。ファイルは以下の画像で示されるように、data->data->{パッケージ名}->filesフォルダにあります:ファイル「mytextfile.txt」はプロジェクトのパッケージ名であるcom.journaldev.internalstorageにあります。以下のように表示されます:
以下のリンクからAndroid内部ストレージの例プロジェクトをダウンロードしてください。
Source:
https://www.digitalocean.com/community/tutorials/android-internal-storage-example-tutorial