Android數據存儲之文件

文件  Android中對文件的操作和Java是一樣的。
Android系統中存儲系統分爲內部存儲和外部存儲兩種

       內部存儲空間

RAM內存:運行內存,相當於電腦的內存。

ROM內存:存儲內存,相當於電腦的硬盤

ROM內存中寫寫數據不需要權限

Android中,組件之間不能相互轉換TditText不能轉換成EditText

案例記住登錄用戶名和密碼:

<LinearLayout 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:orientation="vertical"

   >

    <EditText

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:id="@+id/name"

        android:hint="請輸入用戶名:" />

<EditText

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:id="@+id/password"

        android:password="true"

        android:hint="請輸入密碼:" />

<RelativeLayout

    android:layout_width="fill_parent"

    android:layout_height="match_parent"

  >

    <Button

        android:id="@+id/login"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:layout_alignParentRight="true"

        android:text="登錄" 

        android:onClick="login"/>

    <CheckBox

        android:id="@+id/check"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:layout_alignBaseline="@+id/login"

        android:layout_alignBottom="@+id/login"

        android:layout_centerVertical="true"

        android:text="記住用戶名" />

 

</RelativeLayout>

</LinearLayout>

package com.test.storage;

 

import java.io.BufferedReader;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStreamReader;

 

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.widget.CheckBox;

import android.widget.EditText;

import android.widget.Toast;

public class MainActivity extends Activity {

    private EditText et_name = null;

    private EditText et_password = null;

   privateString name ="";

   privateString password="";

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        //全局變量的初始化,最好放在onCreate方法中

        //不要提前獲取組件的值,有可能會導致下一次使用時值改變或者爲空

        /*et_name = (EditText) this.findViewById(R.id.name);

         et_password = (EditText) this.findViewById(R.id.password);

         name = et_name.getText().toString().trim();

         password = et_password.getText().toString().trim();*/

        et_name = (EditTextthis.findViewById(R.id.name);

        et_password = (EditTextthis.findViewById(R.id.password);

        try {

            readInfo();

            } catch (IOException e) {

            // TODO Auto-generated catch block

        e.printStackTrace();

    }

}

public void login(View v) throws IOException{

     name = et_name.getText().toString().trim();

     password = et_password.getText().toString().trim();

    CheckBox cb = (CheckBoxthis.findViewById(R.id.check);

    //判斷checkbox是否被選中

    if (cb.isChecked()) {

    //內部存儲空間的路徑data/data/包名  在RAM

    //最好通過上下文Context可以獲取上下文的環境信息,getFilesDir():/data/data/當前包名.apirwinfrom/files/文件名

    //File file = new File(getFilesDir(), "userinfo.txt");

    //這種方式不好,當包名一旦改變,就會報異常。

       File file = new File("data/data/com.test.storage/info.txt");

        if (!file.exists()) {

            file.createNewFile();

        }

      FileOutputStream fos = new FileOutputStream(file);

        fos.write((name+" "+password).getBytes());

        fos.flush();

        fos.close();

    }

    //創建彈出對話框,參數:上下文內容  文本內容  顯示時間

    Toast.makeText(this"登錄成功",Toast.LENGTH_SHORT).show();

}

public void readInfo() throws IOException{

    File file = new File("data/data/com.test.storage/info.txt");

    if(file.exists()){

        FileInputStream fis = new FileInputStream(file);

        BufferedReader br = new BufferedReader(new InputStreamReader(fis));

        String line = null;

        line = br.readLine();

        String[] userInfo = line.split(" ");

        et_name.setText(userInfo[0]);

        et_password.setText(userInfo[1]);

    }

    }

}

 

當手機內部存儲空間不足時,Cache中文件會被刪除。重要的信息不要保存在Cache中。網絡中的照片可以保存在Cache中。

清空緩存是清空Cache文件夾下的所有內容。

清空數據是清空應用程序獨立空間下的所有內容,包括緩存。

 

 

外部存儲空間

sdcard:相當於電腦的移動硬盤

sdcard的位置:

Android2.3之前,sdcard路徑:在根目錄下sdcard文件夾

Android4.3版本之前,sdcard路徑:mnt/sdcard

Android4.3開始,sdcard路徑:storage/sdcard

爲了兼容低版本的程序,Android在之前各個版本的sdcard目錄下都留下了快捷方式,指向storage/sdcard

在外部存儲空間寫文件,需要添加權限<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 在sdcard中讀數據不需要權限。

如果用戶選擇了保護sdcard的選項,則讀取sdcard的文件上的數據,也是要權限的。

android.permission.READ_EXTERNAL_STORAGE

 

package com.test.storage;

 

import java.io.BufferedReader;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStreamReader;

 

import android.app.Activity;

import android.os.Bundle;

import android.os.Environment;

import android.view.View;

import android.widget.CheckBox;

import android.widget.EditText;

import android.widget.Toast;

 

public class MainActivity extends Activity {

    private EditText et_name = null;

    private EditText et_password = null;

    String name = "";

    String password = "";

 

@Override

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

// 全局變量的初始化,最好放在onCreate方法中

// 不要提前獲取組件的值,有可能會導致下一次使用時值改變或者爲空

/*

 * et_name = (EditText) this.findViewById(R.id.name); et_password =

 * (EditText) this.findViewById(R.id.password); name =

 * et_name.getText().toString().trim(); password =

 * et_password.getText().toString().trim();

 */

    et_name = (EditTextthis.findViewById(R.id.name);

    et_password = (EditTextthis.findViewById(R.id.password);

    try {

        readInfo();

catch (IOException e) {

// TODO Auto-generated catch block

    e.printStackTrace();

    }

}

 

public void login(View v) throws IOException {

    name = et_name.getText().toString().trim();

    password = et_password.getText().toString().trim();

    CheckBox cb = (CheckBoxthis.findViewById(R.id.check);

// 判斷checkbox是否被選中

    if (cb.isChecked()) {

 

// 這種方式不好,當包名一旦改變,就會報異常。

// File file = new File("sdcard/info.txt");

// 使用sdcard之前必須要檢測sdcard的狀態

/**

 * MEDIA_REMOVED:sdcard不存在 MEDIA_UNKNOWN:不能識別sdcard

 * MEDIA_UNMOUNTEDsd存在但是沒有掛載上 MEDIA_MOUNTED :sdcard已經掛載,可正常使用

 * MEDIA_MOUNTED_READ_ONLY:sdcard只讀 MEDIA_CHECKINGsdcard正在準備

 */

    if (Environment.getExternalStorageState().equals(

    Environment.MEDIA_MOUNTED)) {

// 最好通過上下文Context可以獲取上下文的環境信息,返回的是sdcard的真實路徑

    File file = new File(Environment.getExternalStorageDirectory(),

"userinfo.txt");

    if (!file.exists()) {

        file.createNewFile();

    }

    FileOutputStream fos = new FileOutputStream(file);

    fos.write((name + " " + password).getBytes());

    fos.flush();

    fos.close();

 

}

else {

    Toast.makeText(this"sdcard不可以用"Toast.LENGTH_SHORT);

}

// 創建彈出對話框,參數:上下文內容 文本內容 顯示時間

Toast.makeText(this"登錄成功"Toast.LENGTH_SHORT).show();

 

}

 

public void readInfo() throws IOException {

// File file = new File("sdcard/info.txt");

    if (Environment.getExternalStorageState().equals(

        Environment.MEDIA_MOUNTED)) {

        File file = new File(Environment.getExternalStorageDirectory(),

        "userinfo.txt");

        if (file.exists()) {

            FileInputStream fis = new FileInputStream(file);

            BufferedReader br = new BufferedReader(new InputStreamReader(

fis));

            String line = null;

            line = br.readLine();

            String[] userInfo = line.split(" ");

            et_name.setText(userInfo[0]);

            et_password.setText(userInfo[1]);

            }

        }

        }

}

發佈了70 篇原創文章 · 獲贊 4 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章