Android 在內部存儲讀寫文件


文件讀寫操作
* Ram內存:運行內存,相當於電腦的內存
* Rom內存:內部存儲空間,相當於電腦的硬盤
* sd卡:外部存儲空間,相當於電腦的移動硬盤
在內部存儲空間中讀寫文件
>小案例:用戶輸入賬號密碼,勾選“記住賬號密碼”,點擊登錄按鈕,登錄的同時持久化保存賬號和密碼。界面如下:

1. 定義布局

代碼如下:

<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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" 
    android:orientation="vertical"
    >

    <EditText
        android:id="@+id/et_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="請輸入賬號" />

    <EditText
        android:id="@+id/pass"
        android:inputType="textPassword"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="請輸入密碼" />
    <CheckBox 
        android:id="@+id/cb"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="記住賬號和密碼"     
        />
    <Button 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="click"
        android:text="登錄"
        />

</LinearLayout>

看着會不怎么舒服,重新調整布局,代碼如下:

<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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <EditText
        android:id="@+id/et_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="請輸入賬號" />

    <EditText
        android:id="@+id/et_pass"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="請輸入密碼"
        android:inputType="textPassword" />

    <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" >

        <CheckBox
            android:id="@+id/cb"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" android:layout_centerVertical="true"
            android:text="記住賬號和密碼" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" android:layout_alignParentRight="true"
            android:onClick="click"
            android:text="登錄" />
    </RelativeLayout>

</LinearLayout>

2. 完成按鈕的點擊事件

彈Toast提示用戶登錄成功

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

3. 拿到用戶輸入的數據

* 判斷用戶是否勾選保存賬號密碼

CheckBox cb = (CheckBox) findViewById(R.id.cb);
if(cb.isChecked()){

}

完整代碼如下:

package com.wuyudong.rwinrom;

import java.io.File;
import java.io.FileOutputStream;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void click(View v) {
        // 獲取用戶輸入的賬號和密碼
        EditText et_name = (EditText) findViewById(R.id.et_name);
        EditText et_pass = (EditText) findViewById(R.id.et_pass);

        String name = et_name.getText().toString();
        String pass = et_pass.getText().toString();

        // 獲取選框組件
        CheckBox cb = (CheckBox) findViewById(R.id.cb);
        // 檢測選框是否被勾選
        if (cb.isChecked()) {
            saveAccount(name, pass);
        }
        // 彈Toast提示框
        Toast.makeText(this, "登錄成功", Toast.LENGTH_SHORT).show();

    }

    public void saveAccount(String name, String pass) {
        File file = new File("data/data/com.wuyudong.rwinrom/info.txt");
        try {
            FileOutputStream fos = new FileOutputStream(file);
            fos.write((name + "##" + pass).getBytes());
            fos.close();
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    }
}

運行程序之前,內部存儲照中的文件夾如下

可以看到相關文件夾是空的

運行得到如下界面

點擊登錄按鈕,生成一個info.txt的文件

導出該文件到本地電腦

文件內容為:wuyudong##123456

4. 開啟io流把文件寫入內部存儲

* 直接開啟文件輸出流寫數據

//持久化保存數據
File file = new File("data/data/com.itheima.rwinrom/info.txt");
FileOutputStream fos = new FileOutputStream(file);
fos.write((name + "##" + pass).getBytes());
fos.close();
* 讀取數據前先檢測文件是否存在

if(file.exists())
* 讀取保存的數據,也是直接開文件輸入流讀取

File file = new File("data/data/com.itheima.rwinrom/info.txt");
FileInputStream fis = new FileInputStream(file);
//把字節流轉換成字符流
BufferedReader br = new BufferedReader(new InputStreamReader(fis));
String text = br.readLine();
String[] s = text.split("##");
* 讀取到數據之后,回顯至輸入框

et_name.setText(s[0]);
et_pass.setText(s[1]);
* 應用只能在自己的包名目錄下創建文件,不能到別人家去創建

最后的代碼如下:

package com.wuyudong.rwinrom;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {
    // File file = new File("data/data/com.wuyudong.rwinrom/info.txt");

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        loadAccount();
    }

    public void click(View v) {
        // 獲取用戶輸入的賬號和密碼
        EditText et_name = (EditText) findViewById(R.id.et_name);
        EditText et_pass = (EditText) findViewById(R.id.et_pass);

        String name = et_name.getText().toString();
        String pass = et_pass.getText().toString();

        // 獲取選框組件
        CheckBox cb = (CheckBox) findViewById(R.id.cb);
        // 檢測選框是否被勾選
        if (cb.isChecked()) {
            saveAccount(name, pass);
        }
        // 彈Toast提示框
        Toast.makeText(this, "登錄成功", Toast.LENGTH_SHORT).show();

    }

    public void saveAccount(String name, String pass) {
        File file = new File("data/data/com.wuyudong.rwinrom/info.txt");
        try {
            FileOutputStream fos = new FileOutputStream(file);
            fos.write((name + "##" + pass).getBytes());
            fos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void loadAccount() {
        File file = new File("data/data/com.wuyudong.rwinrom/info.txt");
        if (file.exists()) {
            try {
                FileInputStream fis = new FileInputStream(file);
                // 把字節流轉換為字節流
                BufferedReader br = new BufferedReader(new InputStreamReader(
                        fis));
                String text = br.readLine();
                String[] s = text.split("##");
                // 獲取用戶輸入的賬號和密碼
                EditText et_name = (EditText) findViewById(R.id.et_name);
                EditText et_pass = (EditText) findViewById(R.id.et_pass);
                et_name.setText(s[0]);
                et_pass.setText(s[1]);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM