اندروید انواع مختلفی از فضای ذخیره سازی را برای برنامه ها فراهم می کند تا داده های خود را ذخیره سازی کنند. این مکانهای ذخیرهسازی shared preferences، حافظه داخلی و خارجی، پایگاه داده SQLite و ذخیرهسازی از طریق اتصال شبکه هستند. در این آموزش به بررسی حافظه داخلی می پردازیم. حافظه داخلی امکان ذخیره سازی داده های خصوصی در حافظه دستگاه را برای برنامه ها فراهم میکند.
به طور پیشفرض این فایلها خصوصی هستند و فقط برنامه شما به آنها دسترسی دارد و زمانی که کاربر برنامه شما را حذف میکند، این داده ها نیز حذف میشوند.
نوشتن درون یک فایل یا ذخیره در حافظه داخلی
به منظور استفاده از حافظه داخلی برای نوشتن برخی از داده ها درون یک فایل، متد openFileOutput() فراخوانی میکنیم. در این متد ما نام فایل و mode آن را مشخص میکنیم. این حالت می تواند خصوصی، عمومی و غیره باشد. به کد های زیر دقت کنید :
FileOutputStream fOut = openFileOutput("file name here",MODE_WORLD_READABLE);
متد openFileOutput() نمونه ای از آبجکت FileOutputStream را برمی گرداند. به این ترتیب شما یک نمونه از این کلاس را دارید و با استفاده از آن می توانید اقدام به نوشتن درون فایل مشخص شده بکنید. به کد های نمونه زیر دقت کنید :
String str = "7cloner.com"; fOut.write(str.getBytes()); fOut.close();
خواندن اطلاعات درون یک فایل
برای خواندن اطلاعات از فایلی که ایجاد کرده اید، متد openFileInput() را باید فراخوانی کنید که نام فایل را به عنوان پارامتر ورودی باید به آن بدهید. این متد یک نمونه از کلاس FileInputStream را برمی گرداند. به کدهای زیر دقت کنید :
FileInputStream fin = openFileInput(file);
پس از آن، می توانید متد read را از این کلاس فراخوانی کنید تا هر بار یک کاراکتر از فایل مشخص شده را بخواند و برای شما برگرداند. سر آخر میتوانید این اطلاعات را در متغییر مد نظر ذخیره کنید. به کد های زیر دقت کنید :
int c; String temp=""; while( (c = fin.read()) != -1){ temp = temp + Character.toString((char)c); } //رشته temp شامل تمام داده های فایل است. fin.close();
متدهای کلاس FileOutputStream
علاوه بر متد های که در نمونه کد های بالا معرفی کردیم کلاس FileOutputStream دارای متدهای دیگری نیز می باشد که هر کدام می تواند کاری خاص خود را داشته باشد. این متد ها در پایین لیست شده اند:
متد و توضیحات | ردیف |
FileOutputStream(File file, boolean append)
این متد یک نمونه جدید از کلاس FileOutputStream می سازد که امکان قرار دادن داده ها را درون فایل ها فراهم میکند. |
1 |
getChannel()
این متد یک نمونه از کلاس FileChannel فقط قابل نوشتن را برمی گرداند که موقعیت خود را درون stream به اشتراک می گذارد. |
2 |
getFD()
این متد توصیفگر فایل زیرین را برمی گرداند. |
3 |
write(byte[] buffer, int byteOffset, int byteCount)
این متد تعداد byteهای درون آرایه byte بافر را از موقعیتی که در offset مشخص میکنید درون این stream قرار میدهد. |
4 |
متد های کلاس FileInputStream
علاوه بر متد های که در نمونه کد های بالا معرفی کردیم کلاس FileInputStream دارای متدهای دیگری نیز می باشد که هر کدام می تواند کاری خاص خود را داشته باشد. این متد ها در پایین لیست شده اند:
متد و توضیحات | ردیف |
available()
این متد تعداد تخمینی بایتهایی را برمیگرداند که میتوان آنها را بدون مسدود کردن برای ورودی بیشتر خواند یا رد کرد. |
1 |
getChannel()
این متد یک نمونه از کلاس FileChannel فقط قابل نوشتن را برمی گرداند که موقعیت خود را درون stream به اشتراک می گذارد. |
2 |
getFD()
این متد توصیفگر فایل زیرین را برمی گرداند. |
3 |
write(byte[] buffer, int byteOffset, int byteCount)
این متد تعداد byteهای درون آرایه byte بافر را از موقعیتی که در offset مشخص میکنید از این stream می خواند. |
4 |
مثال
در این آموزش مثالی را تهیه کرده ایم که استفاده از حافظه داخلی برای ذخیره و خواندن فایل ها را مورد بررسی قرار می دهد. در این آموزش یک برنامه ذخیره سازی اساسی ایجاد می کنیم که به شما امکان خواندن و نوشتن از حافظه داخلی را فراهم میکند. دقت داشته باشید در این روش از ذخیره سازی و خواندن اطلاعات نیازی به تعریف مجوز در AndroidManifest.xml ندارید.
برای آزمایش این مثال، باید آن را روی یک دستگاه واقعی یا شبیه ساز اجرا کنید.
توضیحات | مرحله |
ابتدا یک پروژه جدید در اندروید استودیو با یک پکیج دلخواه ایجاد کنید. | 1 |
کدهای درون فایل MainActivity.class را مطابق کدهای که در پایین آورده ایم تغییر بدهید. | 2 |
کدهای درون فایل activity_main.xml را مطابق کدهای که در پایین آورده ایم تغییر بدهید. | 3 |
برنامه را بر روی یک تلفن واقعی یا شبیه ساز اجرا کنید و تست را انجام بدهید. | 4 |
کدهای فایل MainActivity.class
package com.foray.articlelib; import android.os.Bundle; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; import java.io.FileInputStream; import java.io.FileOutputStream; public class MainActivity extends AppCompatActivity { Button b1,b2; TextView tv; EditText ed1; String data; private final String file = "7Cloner.com site url"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); b1=(Button)findViewById(R.id.button); b2=(Button)findViewById(R.id.button2); ed1=(EditText)findViewById(R.id.editText); tv=(TextView)findViewById(R.id.textView2); b1.setOnClickListener(v -> { data=ed1.getText().toString(); try { FileOutputStream fOut = openFileOutput(file, MODE_PRIVATE); fOut.write(data.getBytes()); fOut.close(); Toast.makeText(getBaseContext(),"فایل ذخیره سازی شد",Toast.LENGTH_SHORT).show(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }); b2.setOnClickListener(v -> { try { FileInputStream fin = openFileInput(file); int c; StringBuilder temp= new StringBuilder(); while( (c = fin.read()) != -1){ temp.append((char) c); } tv.setText(temp.toString()); Toast.makeText(getBaseContext(),"file read",Toast.LENGTH_SHORT).show(); } catch(Exception ignored){ } }); } }
کدهای فایل activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="16dp" tools:context=".MainActivity"> <TextView android:id="@+id/textview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:text="حافظه داخلی" android:textSize="35dp" /> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/textview" android:layout_centerHorizontal="true" android:text="7Cloner.com" android:textColor="#000000" android:textSize="35dp" /> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentStart="true" android:text="ذخیره سازی" /> <EditText android:id="@+id/editText" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/imageView" android:layout_marginTop="42dp" android:focusable="true" android:hint="متن مد نظر خود را اینجا وارد کنید ..." android:textColorHighlight="#000000" android:textColorHint="#B6B6B6" /> <ImageView android:id="@+id/imageView" android:layout_width="wrap_content" android:layout_height="200dp" android:layout_below="@+id/textView" android:layout_centerHorizontal="true" android:src="@drawable/abc" /> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentEnd="true" android:text="خواندن" /> <TextView android:id="@+id/textView2" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/editText" android:text="اطلاعاتی که خوانده میشود در اینجا نمایش داده میشود." android:textColor="#000000" android:textSize="14sp" /> </RelativeLayout>
نتیجه
در تصاویر بالا می توانید به دقت مشاهده کنید که به راحتی توانستیم یک اپ شبیه به یک ویرایشگر بسیار ساده ایجاد کنیم که میتواند یک فایل را به صورت خصوصی در حافظه داخلی برای اپلیکیشن ما ایجاد کند و متنی را که میخواهیم درون آن قرار بدهد. بعد از آن می توانیم به راحتی از این فایل اطلاعاتی را که از قبل درون آن ریخته ایم فراخوانی کنیم.
در تصویر بالا هم می توانید مشاهده کنید که فایل در حافظه خصوصی ذخیره شده است که میتوانیم از آن کپی کنیم یا آن را باز کنیم و محتوای درون آن را مشاهده کنیم.