Android 數(shù)據(jù)存儲(chǔ)之 FileInputStream 工具類及FileInputStream類的使用
安卓的三種本地的典型數(shù)據(jù)存儲(chǔ)方式
SharedPreferences
以文件格式保存在本地存儲(chǔ)中
SQL數(shù)據(jù)庫(kù)
這篇文章就是講解一下如何使用 SharedPreferences 保存文件。主要解釋什么都寫在注釋里面的。
IDE : Android Studio
參考文章:http://www.dbjr.com.cn/article/74215.htm
絮叨一下:本來文件操作這一塊上周就想把其弄懂,然后繼續(xù)進(jìn)一步的學(xué)習(xí)。但是因?yàn)楣俜降?Android Training 之中的概念太過于繁雜。導(dǎo)致我認(rèn)為存儲(chǔ)到內(nèi)部之中要查詢空間,得到返回之類。結(jié)果是因?yàn)槲野驯4嬖趦?nèi)部空間(data目錄下的包名下的file文件夾)與外部空間(存儲(chǔ)空間)的概念混淆。所以耽誤了大量時(shí)間并且不得法。最后還是看到參考文章才知道應(yīng)該怎么去寫。然后自己跟著參考文章過了一遍。
同樣的,我采用了分離寫法,也就是創(chuàng)建一個(gè)工具類,模塊化方便使用。希望能幫助到別人,也是給自己建立一種概念。
話不多說,上代碼:
import android.content.Context; import android.util.Log; import java.io.FileInputStream; import java.io.FileOutputStream; /** * Created by zhizhao on 2015/11/1 0001 in 16:00. */ public class UsingFileInputStream { private Context fileContext; private String fileName; private String fileUserName; private String filePassword; public UsingFileInputStream(String name, Context context, String userName, String password) { this.fileName = name; this.fileContext = context; this.fileUserName = userName; this.filePassword = password; } //保存的時(shí)候是在文件內(nèi)容中連續(xù)寫入,也就是在之前保存的數(shù)據(jù)基礎(chǔ)上再次寫入。 public void writeFileInputStream() { try { FileOutputStream fileOutputStream = fileContext.openFileOutput(fileName, fileContext.MODE_PRIVATE); byte[] byteUserName = fileUserName.getBytes(); byte[] bytePassword = filePassword.getBytes(); fileOutputStream.write(byteUserName); fileOutputStream.write(bytePassword); Log.v("FileInputStream保存結(jié)果 ", "UserName = " + fileUserName + " Password = " + filePassword); fileOutputStream.flush(); fileOutputStream.close(); } catch (Exception e) { e.printStackTrace(); } } //讀取文件是把整個(gè)文件的內(nèi)容進(jìn)行讀取。如果要加入解析,則保存的時(shí)候保存為特殊格式。 public void readFileInputStream() { try { FileInputStream fileInputStream = fileContext.openFileInput(fileName); int len = fileInputStream.available(); byte[] buffer = new byte[len]; fileInputStream.read(buffer); Log.v("讀取到的文件為:", ""+new String(buffer)); fileInputStream.close(); } catch (Exception e) { e.printStackTrace(); } } }
下面是使用:
private void writeFile(){ UsingFileInputStream fileInputStream = new UsingFileInputStream("account", MySaveDataActivity.this, userName, userPass); fileInputStream.writeFileInputStream(); tvReadInformation.setText("保存成功!" + "\n UserName = " + userName + "\n UserPass = " + userPass); } private void readFile(){ UsingFileInputStream fileInputStream = new UsingFileInputStream("account", MySaveDataActivity.this, userName, userPass); fileInputStream.readFileInputStream(); tvReadInformation.setText("讀取成功!"+"\n UserName = "+userName+"\n UserPass = "+userPass); }
總結(jié)一下:
我覺得自己目前寫的也不是很對(duì),很完美。因?yàn)樵谡{(diào)用過程中要反復(fù)去填寫文件名,傳入值。并且在返回值之中很難知道成功失敗。
況且我并沒有把文件異常捕獲并進(jìn)行操作,因?yàn)槿绻菦]有文件的情況下去操作的話,必然會(huì)報(bào)錯(cuò):空指針異常。
不過既然是練習(xí)也就沒考慮那么多,因?yàn)檫@種時(shí)候只要在 try{}catch(){} 代碼塊里面加入自己的操作手段就可以了。
下面還有點(diǎn)時(shí)間接著給大家介紹Android FileInputStream類的使用
1.FileInputStream類概述
繼承關(guān)系:
java.io.FileInputStream->java.io.InputStream->java.lang.Object
實(shí)現(xiàn)接口:
Closeable
類的功能:
FileInputStream 從文件系統(tǒng)中的某個(gè)文件中獲取輸入字節(jié)。哪些文件可用取決于主機(jī)環(huán)境。
FileInputStream 用于讀取諸如圖像數(shù)據(jù)之類的原始字節(jié)流。要讀取字符流,請(qǐng)考慮使用 FileReader。
2.類的屬性和行為
(1) public void close() throws IOException
功能: 關(guān)閉此文件輸入流并釋放與此流有關(guān)的所有系統(tǒng)資源。
如果此流有一個(gè)與之關(guān)聯(lián)的通道,則關(guān)閉該通道。
指定者:接口 Closeable 中的 close
覆蓋: 類 InputStream 中的 close
拋出: IOException - 如果發(fā)生 I/O 錯(cuò)誤。
(2) public int read() throws IOException
功能: 從此輸入流中讀取一個(gè)數(shù)據(jù)字節(jié)。如果沒有輸入可用,則此方法將阻塞。
指定者:類 InputStream 中的 read
返回: 下一個(gè)數(shù)據(jù)字節(jié);如果已到達(dá)文件末尾,則返回 -1。
拋出: IOException - 如果發(fā)生 I/O 錯(cuò)誤。
(3) public int read(byte[] b) throws IOException
功能:從此輸入流中將最多b.length個(gè)字節(jié)的數(shù)據(jù)讀入一個(gè)字節(jié)數(shù)組中。在某些輸入可用前,此方法將阻塞
覆蓋:類 InputStream 中的 read
參數(shù):b - 存儲(chǔ)讀取數(shù)據(jù)的緩沖區(qū)
返回:讀入緩沖區(qū)的字節(jié)總數(shù),如果因?yàn)橐呀?jīng)到達(dá)文件末尾而沒有更多的數(shù)據(jù),則返回 -1。
拋出:IOException - 如果發(fā)生 I/O 錯(cuò)誤。
(4) public int read(byte[] b, int off, int len) throws IOException
功能:從此輸入流中將最多l(xiāng)en個(gè)字節(jié)的數(shù)據(jù)讀入一個(gè)字節(jié)數(shù)組中。在某些輸入可用之前,此方法將阻塞。
覆蓋:類 InputStream 中的 read
參數(shù):b - 存儲(chǔ)讀取數(shù)據(jù)的緩沖區(qū)。
off - 數(shù)據(jù)的起始偏移量。
len - 讀取的最大字節(jié)數(shù)。
返回:讀入緩沖區(qū)的字節(jié)總數(shù),如果因?yàn)橐呀?jīng)到達(dá)文件末尾而沒有更多的數(shù)據(jù),則返回 -1。
拋出:IOException - 如果發(fā)生 I/O 錯(cuò)誤。
3.常見錯(cuò)誤
在eclipse下使用FileInputStream,提示找不到指定文件
代碼:
filename = "abc.txt" ; FileInputStream fis = new FileInputStream(filename);
錯(cuò)誤顯示:
java.io.FileNotFoundException: dbconfig.properties (系統(tǒng)找不到指定的文件。) at java.io.FileInputStream.open(Native Method) at java.io.FileInputStream.<init>(FileInputStream.java:106) at java.io.FileInputStream.<init>(FileInputStream.java:66)
解決方法:
因?yàn)閑clipse下運(yùn)行main程序時(shí),eclipse會(huì)自動(dòng)將發(fā)布目錄作為其根目錄,所以會(huì)提示找不到文件,將filename改為絕對(duì)目錄即可
filename = "\sdcard\...\abc.txt" ;
- Android中的windowSoftInputMode屬性詳解
- android 使用uinput模擬輸入設(shè)備的方法
- Android WebView 不支持 H5 input type="file" 解決方法
- Android編程開發(fā)之EditText中inputType屬性小結(jié)
- Android WebView支持input file啟用相機(jī)/選取照片功能
- Android網(wǎng)頁H5 Input選擇相機(jī)和系統(tǒng)相冊(cè)
- 詳解Android WebView的input上傳照片的兼容問題
- Android自定義PasswordInputView密碼輸入
- Android InputMethodManager輸入法簡(jiǎn)介
- 從"Show?tabs"了解Android?Input系統(tǒng)
相關(guān)文章
Android使用GestureOverlayView控件實(shí)現(xiàn)手勢(shì)識(shí)別
這篇文章主要為大家詳細(xì)介紹了Android使用GestureOverlayView控件實(shí)現(xiàn)手勢(shì)識(shí)別,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04Flutter實(shí)現(xiàn)可以縮放拖拽的圖片示例代碼
這篇文章主要給大家介紹了關(guān)于利用Flutter實(shí)現(xiàn)可以縮放拖拽的圖片的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Flutter具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06Android實(shí)現(xiàn)炫酷的網(wǎng)絡(luò)直播彈幕功能
這篇文章主要為大家詳細(xì)介紹了Android仿網(wǎng)絡(luò)直播彈幕功能的實(shí)現(xiàn)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11Android自定義Chronometer實(shí)現(xiàn)短信驗(yàn)證碼秒表倒計(jì)時(shí)功能
這篇文章主要介紹了Android自定義ChronometerView實(shí)現(xiàn)類似秒表倒計(jì)時(shí),短信驗(yàn)證碼倒計(jì)時(shí)功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11Android結(jié)合kotlin使用coroutine的方法實(shí)例
這篇文章主要給大家介紹了關(guān)于Android結(jié)合kotlin使用coroutine的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12