android I/0流操作文件(文件存儲(chǔ))
文件存儲(chǔ)
文件存儲(chǔ)方式不受類型限制,可以將一些數(shù)據(jù)直接以文件的形式保存在設(shè)備中,例如文本文件、PDF ,音頻,圖片等。存儲(chǔ)類型復(fù)雜的數(shù)據(jù)時(shí),通常采用文件存儲(chǔ)。Java提供一套完整的I/О流體系,通過I/О流可以非常方便地訪問磁盤中的文件,同樣Android 也支持I/O流方式來訪問手機(jī)等移動(dòng)設(shè)備中的存儲(chǔ)文件。
I/0流操作文件
進(jìn)行I/О流操作文件時(shí),需要先獲得文件的輸人流和輸出流。在Android應(yīng)用程序中,可以通過上下文環(huán)境Context對(duì)象提供的openFileInput()和 openFileOuput()兩個(gè)方法分別來獲得文件的輸入流和輸出流,這兩個(gè)方法的具體介紹如下。
- FilelnputStream openFileInput(String name): 用于獲取應(yīng)用程序的數(shù)據(jù)文件夾下指定name文件名的標(biāo)準(zhǔn)文件輸入流,以便讀取設(shè)備中的文件。
- FileOutputStream openFileOuput(String name, int mode): 用于獲取應(yīng)用程序的數(shù)據(jù)文件夾下指定name文件名的標(biāo)準(zhǔn)文件輸出流,以便將數(shù)據(jù)寫入設(shè)備的文件中。
其中 openFileOutput()方法的第二個(gè)參數(shù)mode用于指定輸出流的模式,即打開文件進(jìn)行操作的模式。Context類中提供了4個(gè)靜態(tài)常量用于表示不同的輸出模式,如下表所示。
4種文件讀寫模式
| 模式 | 功能描述 |
|---|---|
| Context.MODE_PRIVATE | 私有模式,該模式所創(chuàng)建的文件都是私有文件,只能被應(yīng)用本身所訪問。因此,該模式下所寫入的內(nèi)容會(huì)覆蓋原來文件的內(nèi)容 |
| Context. MODE_APPEND | 附加模式,該模式首先會(huì)檢查文件是否存在,若文件不存在,則創(chuàng)建新文件;若文件存在,則在原文件的末尾追加內(nèi)容 |
| Context.MODE_WORLD_READABLE | 可讀模式,該模式的文件可以被其他應(yīng)用程序讀取 |
| Context.MODE_WORLD_WRITABLE | 可寫模式,該模式的文件可以被其他應(yīng)用程序讀寫 |
除此之外,Context上下文對(duì)象還提供了一些方法來訪問應(yīng)用程序的數(shù)據(jù)文件夾,如下表所示。
訪問數(shù)據(jù)文件夾的方法
| 方法 | 功能描述 |
|---|---|
| File getDir(String name, int mode) | 在應(yīng)用程序的數(shù)據(jù)文件夾下獲取或創(chuàng)建name對(duì)應(yīng)的子目錄 |
| File getFilesDir() | 獲取應(yīng)用程序的數(shù)據(jù)文件夾的絕對(duì)路徑 |
| String[] fileList() | 返回應(yīng)用程序的數(shù)據(jù)文件夾下的所有文件 |
| boolean deleteFile( String name) | 刪除應(yīng)用程序的數(shù)據(jù)文件夾下的指定文件 |
下面通過代碼演示如何使用I/O流對(duì)文件進(jìn)行讀寫操作
創(chuàng)建xml布局文件


xml布局代碼如下
<?xml version="1.0" encoding="utf-8"?>
<!-- 線性布局,寬度高度適應(yīng)屏幕變化,水平方向垂直 -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<!-- 編輯輸入框,寬度適應(yīng)線性布局變化,高度適應(yīng)自己,設(shè)置顯示行數(shù)為四行 -->
<EditText
android:id="@+id/ediFileOut"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:lines="4"/>
<!-- 保存文件按鈕,寬度,高度適應(yīng)自己,按鈕文本顯示-->
<Button
android:id="@+id/btnWrite"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="保存文件"/>
<!-- 編輯顯示框,寬度適應(yīng)線性布局變化,高度適應(yīng)自己,設(shè)置光標(biāo)不可見,不可編輯,行數(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"/>
<!-- 讀取文件按鈕寬度,高度適應(yīng)自己,按鈕文本顯示-->
<Button
android:id="@+id/btnRead"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="讀取文件"/>
</LinearLayout>
上述界面布局比較簡單,只包含兩個(gè)文本框和兩個(gè)按鈕,分別用于保存文件和讀取文件兩種操作。
接著創(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; //聲明兩個(gè)文本框
private Button btnRead, btnWrite; //聲明兩個(gè)按鈕
final String FILE_NAME = "qstIO.txt"; //指定文件名
@Override //重寫父類方法
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); //調(diào)用父類方法
setContentView(R.layout.activity_file_io); //設(shè)置布局
//獲取兩個(gè)文本框
editFileIn = (EditText) findViewById(R.id.editFileIn);
editFileOut = (EditText) findViewById(R.id.ediFileOut);
//獲取兩個(gè)按鈕
Button btnRead = (Button) findViewById(R.id.btnRead);
Button btnWrite = (Button) findViewById(R.id.btnWrite);
//以匿名類的形式設(shè)置btnRead按鈕的事件監(jiān)聽器
btnRead.setOnClickListener(new View.OnClickListener() {
@Override //重寫接口方法
public void onClick(View v) {
//讀取指定文件中的內(nèi)容,并在editFileIn文本框中顯示出來
editFileIn.setText(read());
}
});
//以匿名類的形式設(shè)置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]; //定義一個(gè)字節(jié)緩存數(shù)組
int hasRead = 0;
StringBuilder sb = new StringBuilder(""); //創(chuàng)建可變字符串
//讀取文件內(nèi)容
while ((hasRead = fis.read(buff)) > 0) {
//把字節(jié)數(shù)組轉(zhuǎn)化為字符串并添加到可變字符串中
sb.append(new String(buff, 0, hasRead));
}
fis.close(); //關(guān)閉文件輸入流
return sb.toString(); //返回一個(gè)字符串
}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(); //關(guān)閉文件輸出流
//使用Toast顯示保存成功
Toast.makeText(FileIOActivity.this,"保存成功", Toast.LENGTH_LONG).show();
}catch (Exception e) {
e.printStackTrace();
}
}
}
上述代碼的核心操作就是文件的保存和讀取,其中read()和 write()兩個(gè)方法分別用于讀文件和寫文件操作;代碼中分別對(duì)btnRead 和 btnWrite按鈕設(shè)置了事件監(jiān)聽器,并在事件處理方法中調(diào)用相應(yīng)的read()或write()方法實(shí)現(xiàn)文件的讀取或保存。
在AndroidMainfest中聲明Activity

運(yùn)行結(jié)果

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



總結(jié)
這篇關(guān)于微信demo的文章就到這里了,希望大家可以多多關(guān)注腳本之家的更多精彩內(nèi)容!
- Android實(shí)現(xiàn)保存QQ賬號(hào)與密碼功能(文件存儲(chǔ))
- Android開發(fā)文件存儲(chǔ)實(shí)例
- Android 文件存儲(chǔ)與SharedPreferences存儲(chǔ)方式詳解用法
- 淺析Android文件存儲(chǔ)
- 詳解Android 中的文件存儲(chǔ)
- Android存儲(chǔ)字符串?dāng)?shù)據(jù)到txt文件
- Android圖片添加水印圖片并把圖片保存到文件存儲(chǔ)的實(shí)現(xiàn)代碼
- Android開發(fā)實(shí)現(xiàn)讀取Assets下文件及文件寫入存儲(chǔ)卡的方法
- Android?文件存儲(chǔ)系統(tǒng)原理
相關(guān)文章
Android使用RadioGroup實(shí)現(xiàn)底部導(dǎo)航欄
這篇文章主要為大家詳細(xì)介紹了Android使用RadioGroup實(shí)現(xiàn)底部導(dǎo)航欄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08
詳解如何使用VisualStudio高效開發(fā)調(diào)試AndroidNDK
這篇文章主要介紹了詳解如何使用VisualStudio高效開發(fā)調(diào)試AndroidNDK,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-12-12
Android開發(fā)Jetpack組件LiveData使用講解
LiveData是Jetpack組件的一部分,更多的時(shí)候是搭配ViewModel來使用,相對(duì)于Observable,LiveData的最大優(yōu)勢是其具有生命感知的,換句話說,LiveData可以保證只有在組件( Activity、Fragment、Service)處于活動(dòng)生命周期狀態(tài)的時(shí)候才會(huì)更新數(shù)據(jù)2022-08-08
Android用SharedPreferences實(shí)現(xiàn)登錄注冊(cè)注銷功能
這篇文章主要為大家詳細(xì)介紹了Android用SharedPreferences實(shí)現(xiàn)登錄注冊(cè)注銷功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04
Android實(shí)戰(zhàn)教程第八篇之短信備份
這篇文章主要為大家詳細(xì)介紹了Android實(shí)戰(zhàn)教程第八篇之短信備份的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11
android端使用openCV實(shí)現(xiàn)車牌檢測
這篇文章主要為大家詳細(xì)介紹了android端使用openCV實(shí)現(xiàn)車牌檢測,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12
Android利用ShaderMask實(shí)現(xiàn)花里胡哨的文字特效
我們的?App?大部分時(shí)候的文字都是一種顏色,實(shí)際上,文字的顏色也可以多姿多彩。我們今天就來介紹一個(gè)能夠輕松實(shí)現(xiàn)文字漸變色的組件?——?ShaderMask,感興趣的可以了解一下2022-12-12

