android I/0流操作文件(文件存儲(chǔ))
文件存儲(chǔ)
文件存儲(chǔ)方式不受類(lèi)型限制,可以將一些數(shù)據(jù)直接以文件的形式保存在設(shè)備中,例如文本文件、PDF ,音頻,圖片等。存儲(chǔ)類(lèi)型復(fù)雜的數(shù)據(jù)時(shí),通常采用文件存儲(chǔ)。Java提供一套完整的I/О流體系,通過(guò)I/О流可以非常方便地訪(fǎng)問(wèn)磁盤(pán)中的文件,同樣Android 也支持I/O流方式來(lái)訪(fǎng)問(wèn)手機(jī)等移動(dòng)設(shè)備中的存儲(chǔ)文件。
I/0流操作文件
進(jìn)行I/О流操作文件時(shí),需要先獲得文件的輸人流和輸出流。在Android應(yīng)用程序中,可以通過(guò)上下文環(huán)境Context對(duì)象提供的openFileInput()和 openFileOuput()兩個(gè)方法分別來(lái)獲得文件的輸入流和輸出流,這兩個(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ù)寫(xiě)入設(shè)備的文件中。
其中 openFileOutput()方法的第二個(gè)參數(shù)mode用于指定輸出流的模式,即打開(kāi)文件進(jìn)行操作的模式。Context類(lèi)中提供了4個(gè)靜態(tài)常量用于表示不同的輸出模式,如下表所示。
4種文件讀寫(xiě)模式
模式 | 功能描述 |
---|---|
Context.MODE_PRIVATE | 私有模式,該模式所創(chuàng)建的文件都是私有文件,只能被應(yīng)用本身所訪(fǎng)問(wèn)。因此,該模式下所寫(xiě)入的內(nèi)容會(huì)覆蓋原來(lái)文件的內(nèi)容 |
Context. MODE_APPEND | 附加模式,該模式首先會(huì)檢查文件是否存在,若文件不存在,則創(chuàng)建新文件;若文件存在,則在原文件的末尾追加內(nèi)容 |
Context.MODE_WORLD_READABLE | 可讀模式,該模式的文件可以被其他應(yīng)用程序讀取 |
Context.MODE_WORLD_WRITABLE | 可寫(xiě)模式,該模式的文件可以被其他應(yīng)用程序讀寫(xiě) |
除此之外,Context上下文對(duì)象還提供了一些方法來(lái)訪(fǎng)問(wèn)應(yīng)用程序的數(shù)據(jù)文件夾,如下表所示。
訪(fǎng)問(wèn)數(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ù)文件夾下的指定文件 |
下面通過(guò)代碼演示如何使用I/O流對(duì)文件進(jìn)行讀寫(xiě)操作
創(chuàng)建xml布局文件
xml布局代碼如下
<?xml version="1.0" encoding="utf-8"?> <!-- 線(xiàn)性布局,寬度高度適應(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)線(xiàn)性布局變化,高度適應(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)線(xiàn)性布局變化,高度適應(yīng)自己,設(shè)置光標(biāo)不可見(jiàn),不可編輯,行數(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>
上述界面布局比較簡(jiǎn)單,只包含兩個(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 //重寫(xiě)父類(lèi)方法 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //調(diào)用父類(lèi)方法 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); //以匿名類(lèi)的形式設(shè)置btnRead按鈕的事件監(jiān)聽(tīng)器 btnRead.setOnClickListener(new View.OnClickListener() { @Override //重寫(xiě)接口方法 public void onClick(View v) { //讀取指定文件中的內(nèi)容,并在editFileIn文本框中顯示出來(lái) editFileIn.setText(read()); } }); //以匿名類(lèi)的形式設(shè)置btnWrite按鈕的事件監(jiān)聽(tīng)器 btnWrite.setOnClickListener(new View.OnClickListener() { @Override //重寫(xiě)接口方法 public void onClick(View v) { write(editFileOut.getText().toString()); //將editFileOut中的內(nèi)容寫(xiě)入文件中 editFileOut.setText(""); //清空editFileOut文本框中的內(nèi)容 } }); } private String read() { try { FileInputStream fis = openFileInput(FILE_NAME); //打開(kāi)文件輸入流 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 { //以追加模式打開(kāi)文件輸出流 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è)方法分別用于讀文件和寫(xiě)文件操作;代碼中分別對(duì)btnRead 和 btnWrite按鈕設(shè)置了事件監(jiān)聽(tīng)器,并在事件處理方法中調(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)卡中,展開(kāi)/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開(kāi)發(fā)文件存儲(chǔ)實(shí)例
- Android 文件存儲(chǔ)與SharedPreferences存儲(chǔ)方式詳解用法
- 淺析Android文件存儲(chǔ)
- 詳解Android 中的文件存儲(chǔ)
- Android存儲(chǔ)字符串?dāng)?shù)據(jù)到txt文件
- Android圖片添加水印圖片并把圖片保存到文件存儲(chǔ)的實(shí)現(xiàn)代碼
- Android開(kāi)發(fā)實(shí)現(xiàn)讀取Assets下文件及文件寫(xiě)入存儲(chǔ)卡的方法
- Android?文件存儲(chǔ)系統(tǒng)原理
相關(guān)文章
Android 簡(jiǎn)易手勢(shì)密碼開(kāi)源庫(kù)詳解
本文主要介紹Android 簡(jiǎn)易手勢(shì)密碼,這里主要介紹手勢(shì)密碼如何實(shí)現(xiàn)及簡(jiǎn)單的示例代碼,有需要的同學(xué)可以參考下2016-08-08Android使用RadioGroup實(shí)現(xiàn)底部導(dǎo)航欄
這篇文章主要為大家詳細(xì)介紹了Android使用RadioGroup實(shí)現(xiàn)底部導(dǎo)航欄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08詳解如何使用VisualStudio高效開(kāi)發(fā)調(diào)試AndroidNDK
這篇文章主要介紹了詳解如何使用VisualStudio高效開(kāi)發(fā)調(diào)試AndroidNDK,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-12-12Android開(kāi)發(fā)Jetpack組件LiveData使用講解
LiveData是Jetpack組件的一部分,更多的時(shí)候是搭配ViewModel來(lái)使用,相對(duì)于Observable,LiveData的最大優(yōu)勢(shì)是其具有生命感知的,換句話(huà)說(shuō),LiveData可以保證只有在組件( Activity、Fragment、Service)處于活動(dòng)生命周期狀態(tài)的時(shí)候才會(huì)更新數(shù)據(jù)2022-08-08Android用SharedPreferences實(shí)現(xiàn)登錄注冊(cè)注銷(xiāo)功能
這篇文章主要為大家詳細(xì)介紹了Android用SharedPreferences實(shí)現(xiàn)登錄注冊(cè)注銷(xiāo)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04Android實(shí)戰(zhàn)教程第八篇之短信備份
這篇文章主要為大家詳細(xì)介紹了Android實(shí)戰(zhàn)教程第八篇之短信備份的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11android端使用openCV實(shí)現(xiàn)車(chē)牌檢測(cè)
這篇文章主要為大家詳細(xì)介紹了android端使用openCV實(shí)現(xiàn)車(chē)牌檢測(cè),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12Android利用ShaderMask實(shí)現(xiàn)花里胡哨的文字特效
我們的?App?大部分時(shí)候的文字都是一種顏色,實(shí)際上,文字的顏色也可以多姿多彩。我們今天就來(lái)介紹一個(gè)能夠輕松實(shí)現(xiàn)文字漸變色的組件?——?ShaderMask,感興趣的可以了解一下2022-12-12