ذخیره  سازی  بر روی  فایل

ذخیره سازی بر روی فایل

بسم الله الرحمن الرحیم

بسم الله الرحمن الرحیم

ذخیره  سازی  بر روی  فایل

فصل ششم-بخش دوم

در   قسمت   قبل  شما   یاد  گرفتید که  با   شی 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();
}
}

نظرات یا سوالات خودرا با ما درمیان بگذارید

0912 097 5516 :شماره تماس
0713 625 1757 :شماره تماس