ذخیره سازی بر روی فایل
بسم الله الرحمن الرحیم
ذخیره سازی بر روی فایل
فصل ششم-بخش دوم
در قسمت قبل شما یاد گرفتید که با شی SharedPreferences چگونه داده های ساده به شکل name/vale را ذخیره کنید به عنوان مثال ID نام و تاریخ تولد یا شما ره تلفن و...
زمان ها ممکن شما نیاز به ذخیره داده ها بر روی فایل داشته باشید به عنوان مثال متن یک شعر در برنامه نمایش دهید
برای این کار شما باید از پکیج java.io استفاده کنید
ذخیره در حافظه داخلی
اولین راه این است که برنامه کاربردی اطلاعات فایل را در حافظه داخلی دستگاه ذخیره نمایید. که در ادامه آن را شرح میدهیم.
پروژه جدید به نامFiles. ایجد کنید
فایل main.xml را به تغییر دهید.
dir="ltr"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Please enter some text" />
<EditText
android:id="@+id/txtText1"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<Button
android:id="@+id/btnSave"
android:text="Save"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:onClick="onClickSave" />
<Button
android:id="@+id/btnLoad"
android:text="Load"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:onClick="onClickLoad" />
</LinearLayout>
فایل بهMainActivity.java صورت زر تغییر دهید
package com.MehrdadJavidi.files;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity {
EditText textBox;
static final int READ_BLOCK_SIZE = 100;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
textBox = (EditText) findViewById(R.id.txtText1);
}
public void onClickSave(View view) {
String str = textBox.getText().toString();
try
{
FileOutputStream fOut =
openFileOutput("textfile.txt",
MODE_WORLD_READABLE);
OutputStreamWriter osw = new
OutputStreamWriter(fOut);
/**---write the string to the file---*/
osw.write(str);
osw.flush();
osw.close();
/**---display file saved message---*/
Toast.makeText(getBaseContext(),
"File saved successfully!",
Toast.LENGTH_SHORT).show();
/**---clears the EditText---*/
textBox.setText("");
}
catch (IOException ioe)
{
ioe.printStackTrace();
}
}
public void onClickLoad(View view) {
try
{
FileInputStream fIn =
openFileInput("textfile.txt");
InputStreamReader isr = new
InputStreamReader(fIn);
char[] inputBuffer = new char[READ_BLOCK_SIZE];
String s = "";
int charRead;
while ((charRead = isr.read(inputBuffer))>0)
{
/**---convert the chars to a String---*/
String readString =
String.copyValueOf(inputBuffer, 0,
charRead);
s += readString;
inputBuffer = new char[READ_BLOCK_SIZE];
}
/**---set the EditText to the text that has been*/
/** read---*/
textBox.setText(s);
Toast.makeText(getBaseContext(),
"File loaded successfully!",
Toast.LENGTH_SHORT).show();
}
catch (IOException ioe) {
ioe.printStackTrace();
}
}
برنامه را با F11 اجرا کنید
متنی در EditView وارد کنید و دکمه Saveرا بزنید
متن با موفقیت ذخیره شده شما می تونید یک پیغام با
کلاس Toast به عنوان “File saved successfully مشاهده کنید
حال بر روی دکمه Load کلیک کنید
توضیحات
برای ذخیر بر روی فایل متنی شما می تواندی از کلاس FileOutputStream استفاده کنید شما با متد openFileOutput() می توانید نام فایل و حالت آن را مشخص کنید شما در این جا با ثابت MODE_WORLD_READABLE تعیین کردید که این فایل توسط تمام برنامه های دیگر قابل خواندن باشد.
FileOutputStream fOut =
openFileOutput("textfile.txt",
MODE_WORLD_READABLE);
به جای ثابت MODE_WORLD_READABLE شما می توانید MODE_PRIVATE استفاده کنید که فقط توسط برنامه ای که آن را ا یجاد کرده است قابل دسترسی باشد اگر فایل قبلا وجود داشته و می خواهید به اخر ان اضافه کنید می توانید از MODE_APPENDاستفاده کیند و MODE_WORLD_WRITEABLEتوسط تمام برنامه ها قابل نوشتن می باشد.
برای ذخیره تمام کاراکتر های متن به صورت بایتی شما می توانید از OutputStreamWriter استفاده کنید که و یک شی به آن FileOutputStream ارسال کنید
OutputStreamWriter osw = new
OutputStreamWriter(fOut);
شما می توانید از متد write()برای ذخیره متن در آن استفاده کنید برای اینکه شما مطمئتن شوید که تمام اطلاعت نوشته شده در فایل ذخیره شود از متد flush() استفاده می کنید و در اخر هم برای بستن فایل از متد close() استفاده می کنید
osw.write(str);
osw.flush();
osw.close();
برای خواند محتوای فایل شما از کلاسFileInputStream همراه با InputStreamReader استفاده می کنید
FileInputStream fIn =
openFileInput("textfile.txt");
InputStreamReader isr = new
InputStreamReader(fIn);
از انجا که سایز فایل را برای خواندن نمی دانید شما آن را در بلاک های 100 کاراکتری خوانده و در String ذخییر ه می کنید
while ((charRead = isr.read(inputBuffer))>0)
{
/**---convert the chars to a String---*/
String readString =
String.copyValueOf(inputBuffer, 0,
charRead);
s += readString;
inputBuffer = new char[READ_BLOCK_SIZE];
}
متد read() درInputStreamReader تعیین می کند تعداد کاراکتر های که باید خواند شود اگر
1- بود یعنی به انتهای فایل رسیده است
زمانیکه تست برنامه را انجام دادید به قسمت DDMS بروید همان طور که مشاهده می کنید فایل در پوشه برنامه به صورت /data/data/ com.MehrdadJavidi.Files/filesایجاد شده است
ذخیره بر رو حافظه خارجی (SDCART)
در قسمت قبل یاد گرفتید که چگونه فایل را بر روی حافظه داخلی دستگاه اندروید ذخیره کنید گاهی اوقات شما نیاز دارید که آن را در حافظه خارجی ذخیره کنید زیرا ممکن است حجم فایل زیاد باشد و همچنین sdCard فضای بیشتری دارد. با این کار شما می توانید فایل بین دیگر کاربران به اشتراک بگذارید با جابه sd Card و دادن آن به دیگ کاربران.
به پروژه قبلی رفته و فایل mainActivity آن را به صورت زیر تغییر دهید.
package com.MehrdadJavidi.files;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity {
EditText textBox;
static final int READ_BLOCK_SIZE = 100;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
textBox = (EditText) findViewById(R.id.txtText1);
}
public void onClickSave(View view) {
String str = textBox.getText().toString();
try
{
/**---SD Card Storage---*/
File sdCard = Environment.getExternalStorageDirectory();
File directory = new File (sdCard.getAbsolutePath() +
"/MyFiles");
directory.mkdirs();
File file = new File(directory, "textfile.txt");
FileOutputStream fOut = new FileOutputStream(file);
/*
FileOutputStream fOut =
openFileOutput("textfile.txt",
MODE_WORLD_READABLE);
*/
OutputStreamWriter osw = new
OutputStreamWriter(fOut);
/**---write the string to the file---*/
osw.write(str);
osw.flush();
osw.close();
/**---display file saved message---*/
Toast.makeText(getBaseContext(),
"File saved successfully!",
Toast.LENGTH_SHORT).show();
/**---clears the EditText---*/
textBox.setText("");
}
catch (IOException ioe)
{
ioe.printStackTrace();
}
}
public void onClickLoad(View view) {
try
{
FileInputStream fIn =
openFileInput("textfile.txt");
InputStreamReader isr = new
InputStreamReader(fIn);
char[] inputBuffer = new char[READ_BLOCK_SIZE];
String s = "";
int charRead;
while ((charRead = isr.read(inputBuffer))>0)
{
/**---convert the chars to a String---*/
String readString =
String.copyValueOf(inputBuffer, 0,
charRead);
s += readString;
inputBuffer = new char[READ_BLOCK_SIZE];
}
/**---set the EditText to the text that has been*/
/** read---*/
textBox.setText(s);
Toast.makeText(getBaseContext(),
"File loaded successfully!",
Toast.LENGTH_SHORT).show();
}
catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
در کد بالا شما از متد getExternalStorageDirectory() استفاده کردید که مسیر کامل SD Card را بر می گرداند که معمولا /sdcard برای دستگاه واقعی وsdcard /mnt/ برای Android emulator می باشد سپس شما پوشه MyFiles ایحاد می کنید و سپس فایل را در آن ذخیر ه می کنید
برای باز یابی محتوا به صورت زیر عمل می کنید
public void onClickLoad(View view) {
try
{
/**---SD Storage---*/
File sdCard = Environment.getExternalStorageDirectory();
File directory = new File (sdCard.getAbsolutePath() +
"/MyFiles");
File file = new File(directory, "textfile.txt");
FileInputStream fIn = new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(fIn);
/*
FileInputStream fIn =
openFileInput("textfile.txt");
InputStreamReader isr = new
InputStreamReader(fIn);
*/
char[] inputBuffer = new char[READ_BLOCK_SIZE];
String s = "";
int charRead;
while ((charRead = isr.read(inputBuffer))>0)
{
/**---convert the chars to a String---*/
String readString =String.copyValueOf(inputBuffer, 0,
charRead);
s += readString;
inputBuffer = new char[READ_BLOCK_SIZE];
}
/**---set the EditText to the text that has been*/
/** read---*/
textBox.setText(s);
Toast.makeText(getBaseContext(),
"File loaded successfully!",
Toast.LENGTH_SHORT).show();
}
catch (IOException ioe) {
ioe.printStackTrace();
}
}
توجه کنید که شما برای ذخیره در فایل خارجی باید permission با عنوان WRITE_EXTERNAL_STORAGE در فایل AndroidManifest.xml اضافه کیند
style="text-align: left;"><?xml version=“1.0“ encoding=“utf-8“?>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.MehrdadJavidi.files"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="14" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.MehrdadJavidi.files.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
همان طور که مشاهده می کنید فایل در MyFiles/ /mnt/sdcard/ ذخیره شده است
انتخاب بهترین نحوه ای ذخیره داده ها
در قسمت های قبلی شما دو روش برای ذخیر ه داده ها با استفاده ازSharedPreferences و ذخیره بروی حافظه داخلی و خارجی را یاد گرفتید
کدام یک را برای ذخیره استفاده کنیم در اینجا شما را راهنمایی می کنیم :
- اگر داده های شما بر اساس name/value می باشد شما از SharedPreferences استفاده کنید به عوان مثال اگر ما می خواهید نام کاربری و رنگ پس زمینه و تاریخ تولد آخرین زمان LOGIN را ذخیره کنید از این گزینه استفاده کنید. اگر حجم داده های شما کم می باشد این بهترین گزینه می باشد .
- اگر شما نیاز به ذخیره سازی موقت داده های داشته باشد استفاده از حافظه داخلی گزینه خوبی می باشد به عنوان مثال برنامه شما نیاز به دریافت یک تصویر از وب برای نمایش را دارد که ذخیره بر روی حافظه داخلی راه حل خوبی میباشد. به عنوان مثال دیگر شما نیاز دارید داد های را ذخیره کنید تا برنامه از همان جا شروع به اجرا شدن داشته باشد استفاده از حافظه داخلی گزینه مناسبی می باشد
- زمان های وجود دارد که شما می خواهید داده های بین کاربران به اشتراک بگذارید به عنوان مثال شما برنامه نوشته اید که مکان های که کاربر رفته را ذخیره می کند و شما می خواهید آن را بین کاربران به اشتراک بگذارید برای این کار شما می توانید از SD card برای ذخیره اطلاعات استفاده کنید
استفاده از منابع استاتیک
قبل از این که شما تصمیم به ایجاد فایل های داینامیک کنید شما نیاز داربد فایلی را به برنامه اضافه کنید تا در زمان اجرا از آن استفاده کنید. به عنوان مثال شما می خواهد یک راهنما به برنامه خود اضافه کنید تا در زمان اجرا برنامه پیام های را به کاربر نشان و راهنمایی برا ی کاربر باشد
برای این کار شما می توانید فایبل مورد نظر را در فولدر res/raw (در صورت نیاز می توانید فولدر هم اضافه کنید) اضافه کنید در شکا یک فایل به عنوان textFile.txt ایجاد کرده ایم.
برای استفاده از این فایل شما از متد getResources() استفاده می کنید(یک متد از کلاس Activity می باشد ) که یک شی Resources بر می گرداند و سپس از متد openRawResource() برای برای بر گرداند فایلی که در res/raw میباشد استفاده می کنید
style="text-align: left;">
import java.io.BufferedReader;
import java.io.InputStream;
public class FilesActivity extends Activity {
EditText textBox;
static final int READ_BLOCK_SIZE = 100;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
textBox = (EditText) findViewById(R.id.txtText1);
InputStream is = this.getResources().openRawResource(R.raw.textfile);
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String str = null;
try {
while ((str = br.readLine()) != null) {
Toast.makeText(getBaseContext(),
str, Toast.LENGTH_SHORT).show();
}
is.close();
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}