android I/0流操作文件(文件存儲)

文件存儲

文件存儲方式不受類型限制,可以將一些數據直接以文件的形式保存在設備中,例如文本文件、PDF ,音頻,圖片等。存儲類型復雜的數據時,通常采用文件存儲。Java提供一套完整的I/О流體系,通過I/О流可以非常方便地訪問磁盤中的文件,同樣Android 也支持I/O流方式來訪問手機等移動設備中的存儲文件。

I/0流操作文件

進行I/О流操作文件時,需要先獲得文件的輸人流和輸出流。在Android應用程序中,可以通過上下文環境Context對象提供的openFileInput()和 openFileOuput()兩個方法分別來獲得文件的輸入流和輸出流,這兩個方法的具體介紹如下。

  • FilelnputStream openFileInput(String name): 用於獲取應用程序的數據文件夾下指定name文件名的標準文件輸入流,以便讀取設備中的文件。
  • FileOutputStream openFileOuput(String name, int mode): 用於獲取應用程序的數據文件夾下指定name文件名的標準文件輸出流,以便將數據寫入設備的文件中。

其中 openFileOutput()方法的第二個參數mode用於指定輸出流的模式,即打開文件進行操作的模式。Context類中提供瞭4個靜態常量用於表示不同的輸出模式,如下表所示。

4種文件讀寫模式

模式 功能描述
Context.MODE_PRIVATE 私有模式,該模式所創建的文件都是私有文件,隻能被應用本身所訪問。因此,該模式下所寫入的內容會覆蓋原來文件的內容
Context. MODE_APPEND 附加模式,該模式首先會檢查文件是否存在,若文件不存在,則創建新文件;若文件存在,則在原文件的末尾追加內容
Context.MODE_WORLD_READABLE 可讀模式,該模式的文件可以被其他應用程序讀取
Context.MODE_WORLD_WRITABLE 可寫模式,該模式的文件可以被其他應用程序讀寫

除此之外,Context上下文對象還提供瞭一些方法來訪問應用程序的數據文件夾,如下表所示。

訪問數據文件夾的方法

方法 功能描述
File getDir(String name, int mode) 在應用程序的數據文件夾下獲取或創建name對應的子目錄
File getFilesDir() 獲取應用程序的數據文件夾的絕對路徑
String[] fileList() 返回應用程序的數據文件夾下的所有文件
boolean deleteFile( String name) 刪除應用程序的數據文件夾下的指定文件

下面通過代碼演示如何使用I/O流對文件進行讀寫操作

創建xml佈局文件

在這裡插入圖片描述

在這裡插入圖片描述

xml佈局代碼如下

<?xml version="1.0" encoding="utf-8"?>
<!-- 線性佈局,寬度高度適應屏幕變化,水平方向垂直 -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <!-- 編輯輸入框,寬度適應線性佈局變化,高度適應自己,設置顯示行數為四行 -->
    <EditText
        android:id="@+id/ediFileOut"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:lines="4"/>
    <!-- 保存文件按鈕,寬度,高度適應自己,按鈕文本顯示-->
    <Button
        android:id="@+id/btnWrite"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="保存文件"/>
    <!-- 編輯顯示框,寬度適應線性佈局變化,高度適應自己,設置光標不可見,不可編輯,行數為4-->
    <EditText
        android:id="@+id/editFileIn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:cursorVisible="false"
        android:editable="false"
        android:lines="4"/>
    <!-- 讀取文件按鈕寬度,高度適應自己,按鈕文本顯示-->
    <Button
        android:id="@+id/btnRead"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="讀取文件"/>
</LinearLayout>

上述界面佈局比較簡單,隻包含兩個文本框和兩個按鈕,分別用於保存文件和讀取文件兩種操作。

接著創建Activity程序

在這裡插入圖片描述

在這裡插入圖片描述

activity代碼如下

package com.example.wenjiancuncu;
import android.content.Context;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.PrintStream;
public class FileIOActivity extends AppCompatActivity {
    private EditText editFileIn, editFileOut; //聲明兩個文本框
    private Button btnRead, btnWrite; //聲明兩個按鈕
    final String FILE_NAME = "qstIO.txt"; //指定文件名
    @Override //重寫父類方法
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState); //調用父類方法
        setContentView(R.layout.activity_file_io); //設置佈局
        //獲取兩個文本框
        editFileIn = (EditText) findViewById(R.id.editFileIn);
        editFileOut = (EditText) findViewById(R.id.ediFileOut);
        //獲取兩個按鈕
        Button btnRead = (Button) findViewById(R.id.btnRead);
        Button btnWrite = (Button) findViewById(R.id.btnWrite);
        //以匿名類的形式設置btnRead按鈕的事件監聽器
        btnRead.setOnClickListener(new View.OnClickListener() {
            @Override //重寫接口方法
            public void onClick(View v) {
                //讀取指定文件中的內容,並在editFileIn文本框中顯示出來
                editFileIn.setText(read());
            }
        });
        //以匿名類的形式設置btnWrite按鈕的事件監聽器
        btnWrite.setOnClickListener(new View.OnClickListener() {
            @Override //重寫接口方法
            public void onClick(View v) {
                write(editFileOut.getText().toString()); //將editFileOut中的內容寫入文件中
                editFileOut.setText(""); //清空editFileOut文本框中的內容
            }
        });
    }
    private String read() {
        try {
            FileInputStream fis = openFileInput(FILE_NAME); //打開文件輸入流
            byte[] buff = new byte[1024]; //定義一個字節緩存數組
            int hasRead = 0;
            StringBuilder sb = new StringBuilder(""); //創建可變字符串
            //讀取文件內容
            while ((hasRead = fis.read(buff)) > 0) {
                //把字節數組轉化為字符串並添加到可變字符串中
                sb.append(new String(buff, 0, hasRead));
            }
            fis.close(); //關閉文件輸入流
            return sb.toString(); //返回一個字符串
        }catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    private void write(String content) {
        try {
            //以追加模式打開文件輸出流
            FileOutputStream fos = openFileOutput(FILE_NAME, Context.MODE_APPEND);
            PrintStream ps = new PrintStream(fos); //將FileOutStream包裝成PrintStream
            ps.println(content); //輸出文件內容
            ps.close(); //關閉文件輸出流
            //使用Toast顯示保存成功
            Toast.makeText(FileIOActivity.this,"保存成功", Toast.LENGTH_LONG).show();
        }catch (Exception e) {
            e.printStackTrace();
        }
    }
}

上述代碼的核心操作就是文件的保存和讀取,其中read()和 write()兩個方法分別用於讀文件和寫文件操作;代碼中分別對btnRead 和 btnWrite按鈕設置瞭事件監聽器,並在事件處理方法中調用相應的read()或write()方法實現文件的讀取或保存。

在AndroidMainfest中聲明Activity

在這裡插入圖片描述

運行結果

在這裡插入圖片描述

Android應用程序的數據文件默認保存在/data/data/包名/files目錄下。在 AndroidDevice Monitor的 File Explorer選項卡中,展開/data/data/com. 包名/files目錄,在該目錄下可以看到保存的qstIO.txt 數據文件,如下圖所示。

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

總結

這篇關於微信demo的文章就到這裡瞭,希望大傢可以多多關註WalkonNet的更多精彩內容!

推薦閱讀: