היום נבחן את אחסון המידע הפנימי של Android. Android מציעה מספר דרכים מובנות ל־\texttt{אחסון נתונים}. אלו כוללים \texttt{
- העדפות משותפות
- אחסון פנימי
- אחסון חיצוני
- אחסון SQLite
- אחסון דרך חיבור לרשת (בענן)
. במדריך זה, אנו הולכים לבדוק כיצד לשמור ולקרוא נתונים לקבצים באמצעות \texttt{אחסון המידע הפנימי של Android}.
אחסון המידע הפנימי של Android
אחסון המידע הפנימי של Android הוא האחסון של הנתונים הפרטיים בזכרון התקן. כברירת מחדל, השמירה והטעינה של קבצים לאחסון הפנימי פרטיים לאפליקציה ואף לאפליקציות אחרות לא יהיו להם גישה אל קבצים אלו. כאשר המשתמש מסיר את האפליקציה, הקבצים המאוחסנים פנימית הקשורים לאפליקציה גם יוסרו. עם זאת, שימו לב שחלק מהמשתמשים משגרירים את טלפוני Android שלהם, ומרכיבים לעצמם גישה כמשתמשים ראשיים. משתמשים אלו יכולים לקרוא ולכתוב לקבצים כלשהם שיבחרו.
קריאה וכתיבה לקובץ טקסט באחסון הפנימי של Android
Android מציע את openFileInput
ו־openFileOutput
מתוך קבוצת המחלקות של Java I/O כדי לשנות קריאה וכתיבה של נתונים מקובץ ואל קובץ מקומי.
-
openFileOutput(): שיטה זו משמשת ליצירה ושמירה של קובץ. התחביר שלה ניתן למצוא למטה:
FileOutputStream fOut = openFileOutput("שם קובץ", Context.MODE_PRIVATE);
שיטת
openFileOutput()
מחזירה מופע שלFileOutputStream
. לאחר מכן, נוכל לקרוא לשיטת הכתיבה כדי לכתוב נתונים לקובץ. התחביר שלה ניתן למצוא למטה:String str = "נתוני מבחן"; fOut.write(str.getBytes()); fOut.close();
-
openFileInput(): שיטה זו משמשת לפתיחת קובץ וקריאתו. היא מחזירה מופע של FileInputStream. התחביר שלה ניתן להלן:
FileInputStream fin = openFileInput(file);
לאחר מכן, אנו קוראים את שיטת הקריאה כדי לקרוא תו אחד בכל פעם מהקובץ ולאחר מכן להדפיס אותו. התחביר שלה ניתן להלן:
int c; String temp=""; while( (c = fin.read()) != -1){ temp = temp + Character.toString((char)c); } fin.close();
בקוד לעיל, מחרוזת temp מכילה את כל הנתונים של הקובץ.
-
שימו לב ששיטות אלו לא מקבלות נתיבי קבצים (לדוגמה, path/to/file.txt), הן מקבלות רק שמות פשוטים של קבצים.
מבנה פרויקט אחסון פנימי של אנדרואיד
קוד דוגמה לאחסון פנימי ב-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 readstring=String.copyValueOf(inputBuffer,0,charRead);
s +=readstring;
}
InputRead.close();
textmsg.setText(s);
} catch (Exception e) {
e.printStackTrace();
}
}
}
כאן, התבשרת מוצגת כאשר הנתונים נכתבים בהצלחה לאחסון הפנימי והנתונים מוצגים ב־EditText בעצמו בעת קריאת הנתונים מהקובץ. התמונה שמוצגת למטה היא תוצאת הפרויקט. התמונה מתארת טקסט שנכתב לאחסון הפנימי ובלחיצה על כפתור הקריאה הטקסט מוצג שוב באותו EditText.
איפה הקובץ ממוקם?
כדי לראות את הקובץ בפועל, פתח את עוקב המכשיר של אנדרואיד מתוך כלים-> אנדרואיד-> עוקב מכשיר אנדרואיד. הקובץ נמצא בתיקייה data-> data-> {שם החבילה}-> קבצים כפי שמוצג בתמונות למטה: הקובץ "mytextfile.txt" נמצא בשם החבילה של הפרויקט כמו שמוצג למטה: com.journaldev.internalstorage כמו שמוצג למטה:
הורד את הפרויקט הסופי עבור דוגמת אחסון פנימי של אנדרואיד מהקישור למטה.
Source:
https://www.digitalocean.com/community/tutorials/android-internal-storage-example-tutorial