android I/0流操作文件(文件存儲)
文件存儲
文件存儲方式不受類型限制,可以將一些數(shù)據(jù)直接以文件的形式保存在設備中,例如文本文件、PDF ,音頻,圖片等。存儲類型復雜的數(shù)據(jù)時,通常采用文件存儲。Java提供一套完整的I/О流體系,通過I/О流可以非常方便地訪問磁盤中的文件,同樣Android 也支持I/O流方式來訪問手機等移動設備中的存儲文件。
I/0流操作文件
進行I/О流操作文件時,需要先獲得文件的輸人流和輸出流。在Android應用程序中,可以通過上下文環(huán)境Context對象提供的openFileInput()和 openFileOuput()兩個方法分別來獲得文件的輸入流和輸出流,這兩個方法的具體介紹如下。
- FilelnputStream openFileInput(String name): 用于獲取應用程序的數(shù)據(jù)文件夾下指定name文件名的標準文件輸入流,以便讀取設備中的文件。
- FileOutputStream openFileOuput(String name, int mode): 用于獲取應用程序的數(shù)據(jù)文件夾下指定name文件名的標準文件輸出流,以便將數(shù)據(jù)寫入設備的文件中。
其中 openFileOutput()方法的第二個參數(shù)mode用于指定輸出流的模式,即打開文件進行操作的模式。Context類中提供了4個靜態(tài)常量用于表示不同的輸出模式,如下表所示。
4種文件讀寫模式
| 模式 | 功能描述 |
|---|---|
| Context.MODE_PRIVATE | 私有模式,該模式所創(chuàng)建的文件都是私有文件,只能被應用本身所訪問。因此,該模式下所寫入的內(nèi)容會覆蓋原來文件的內(nèi)容 |
| Context. MODE_APPEND | 附加模式,該模式首先會檢查文件是否存在,若文件不存在,則創(chuàng)建新文件;若文件存在,則在原文件的末尾追加內(nèi)容 |
| Context.MODE_WORLD_READABLE | 可讀模式,該模式的文件可以被其他應用程序讀取 |
| Context.MODE_WORLD_WRITABLE | 可寫模式,該模式的文件可以被其他應用程序讀寫 |
除此之外,Context上下文對象還提供了一些方法來訪問應用程序的數(shù)據(jù)文件夾,如下表所示。
訪問數(shù)據(jù)文件夾的方法
| 方法 | 功能描述 |
|---|---|
| File getDir(String name, int mode) | 在應用程序的數(shù)據(jù)文件夾下獲取或創(chuàng)建name對應的子目錄 |
| File getFilesDir() | 獲取應用程序的數(shù)據(jù)文件夾的絕對路徑 |
| String[] fileList() | 返回應用程序的數(shù)據(jù)文件夾下的所有文件 |
| boolean deleteFile( String name) | 刪除應用程序的數(shù)據(jù)文件夾下的指定文件 |
下面通過代碼演示如何使用I/O流對文件進行讀寫操作
創(chuàng)建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">
<!-- 編輯輸入框,寬度適應線性布局變化,高度適應自己,設置顯示行數(shù)為四行 -->
<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="保存文件"/>
<!-- 編輯顯示框,寬度適應線性布局變化,高度適應自己,設置光標不可見,不可編輯,行數(shù)為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>
上述界面布局比較簡單,只包含兩個文本框和兩個按鈕,分別用于保存文件和讀取文件兩種操作。
接著創(chuàng)建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); //調(diào)用父類方法
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按鈕的事件監(jiān)聽器
btnRead.setOnClickListener(new View.OnClickListener() {
@Override //重寫接口方法
public void onClick(View v) {
//讀取指定文件中的內(nèi)容,并在editFileIn文本框中顯示出來
editFileIn.setText(read());
}
});
//以匿名類的形式設置btnWrite按鈕的事件監(jiān)聽器
btnWrite.setOnClickListener(new View.OnClickListener() {
@Override //重寫接口方法
public void onClick(View v) {
write(editFileOut.getText().toString()); //將editFileOut中的內(nèi)容寫入文件中
editFileOut.setText(""); //清空editFileOut文本框中的內(nèi)容
}
});
}
private String read() {
try {
FileInputStream fis = openFileInput(FILE_NAME); //打開文件輸入流
byte[] buff = new byte[1024]; //定義一個字節(jié)緩存數(shù)組
int hasRead = 0;
StringBuilder sb = new StringBuilder(""); //創(chuàng)建可變字符串
//讀取文件內(nèi)容
while ((hasRead = fis.read(buff)) > 0) {
//把字節(jié)數(shù)組轉化為字符串并添加到可變字符串中
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); //輸出文件內(nèi)容
ps.close(); //關閉文件輸出流
//使用Toast顯示保存成功
Toast.makeText(FileIOActivity.this,"保存成功", Toast.LENGTH_LONG).show();
}catch (Exception e) {
e.printStackTrace();
}
}
}
上述代碼的核心操作就是文件的保存和讀取,其中read()和 write()兩個方法分別用于讀文件和寫文件操作;代碼中分別對btnRead 和 btnWrite按鈕設置了事件監(jiān)聽器,并在事件處理方法中調(diào)用相應的read()或write()方法實現(xiàn)文件的讀取或保存。
在AndroidMainfest中聲明Activity

運行結果

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



總結
這篇關于微信demo的文章就到這里了,希望大家可以多多關注腳本之家的更多精彩內(nèi)容!
相關文章
android中實現(xiàn)OkHttp下載文件并帶進度條
本篇文章主要介紹了android中實現(xiàn)OkHttp下載文件并帶進度條,OkHttp是比較火的網(wǎng)絡框架,它支持同步與異步請求,支持緩存,可以攔截,更方便下載大文件與上傳文件的操作,有興趣的可以了解一下2017-07-07
解決Android-RecyclerView列表倒計時錯亂問題
這篇文章主要介紹了解決Android-RecyclerView列表倒計時錯亂問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08
Flutter沉浸式狀態(tài)欄/AppBar導航欄/仿咸魚底部凸起導航欄效果
這篇文章主要介紹了Flutter沉浸式狀態(tài)欄/AppBar導航欄/仿咸魚底部凸起導航欄效果,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04
Android中okhttp3.4.1+retrofit2.1.0實現(xiàn)離線緩存
這篇文章主要介紹了Android中okhttp3.4.1結合retrofit2.1.0實現(xiàn)離線緩存,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-10-10
Android 將 android view 的位置設為右下角的解決方法
Android 將 android view 的位置設為右下角的解決方法,需要的朋友可以參考一下2013-05-05
android studio 使用adb 命令傳遞文件到android 設備的方法
這篇文章主要介紹了android studio 使用adb 命令傳遞文件到android 設備的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-11-11
Android中實現(xiàn)Runnable接口簡單例子
這篇文章主要介紹了Android中實現(xiàn)Runnable接口簡單例子,著重點在如何實現(xiàn)run()方法,需要的朋友可以參考下2014-06-06

