IO流(操作文件內(nèi)容): 字節(jié)流
10年積累的成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先網(wǎng)站設(shè)計后付款的網(wǎng)站建設(shè)流程,更有城固免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
參考:
AssetManager
assets 文件夾用于存儲應(yīng)用需要的文件,在安裝后可直接從其中讀取使用或者寫入本地存儲中
Android Studio 默認(rèn)不建立該文件夾,可以手動新建 : app - src - main - assets
或者,右鍵 main - New - Folder - Assets Folder
AssetManager 對象可以直接訪問該文件夾:
獲取方法:
使用函數(shù) open 可以打開 assets 文件夾中對象,返回一個 InputStream 對象:
open
獲取方法:
!--往sdcard中寫入數(shù)據(jù)的權(quán)限 --uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/uses-permission!--在sdcard中創(chuàng)建/刪除文件的權(quán)限 --uses-permission android:name="android.permission.MOUNT_U
android中的apk必須簽名
這種簽名不是基于權(quán)威證書的,不會決定某個應(yīng)用允不允許安裝,而是一種自簽名證書。
重要的是,android系統(tǒng)有的權(quán)限是基于簽名的。比如:system等級的權(quán)限有專門對應(yīng)的簽名,簽名不對,權(quán)限也就獲取不到。默認(rèn)生成的APK文件是debug簽名的。
獲取system權(quán)限時用到的簽名,見:如何使Android應(yīng)用程序獲取系統(tǒng)權(quán)限?;赨serID的進(jìn)程級別的安全機(jī)。這種簽名不是基于權(quán)威證書的,不會決定某個應(yīng)用允不允許安裝,而是一種自簽名證書。重要的是,android系統(tǒng)有的權(quán)限是基于簽名的。
讀寫文件,和java中沒有區(qū)別的
File file = new FIle("文件絕對路徑");
注意這里的文件路徑,windows平臺下盤符是 c: d: e: 等
android是linux內(nèi)核,路徑是 / 開頭的
其它的就是InputStream outputStream 沒什么區(qū)別
讀文件:
1、通過File獲取文件
2、打開輸入流,讀取文件
寫文件:
1、創(chuàng)建文件
2、打開輸出流,寫入文件內(nèi)容
示例:
讀文件:
String?content?=?"";?//文件內(nèi)容字符串
//通過路徑/sdcard/foo.txt打開文件
File?file?=?new?File("/sdcard/foo.txt");
try?{
InputStream?instream?=?new?FileInputStream(file);//讀取輸入流
InputStreamReader?inputreader?=?new?InputStreamReader(instream);//設(shè)置流讀取方式
BufferedReader?buffreader?=?new?BufferedReader(inputreader);
while?((?line?=?buffreader.readLine())?!=?null)?{
content?+=?line?+?"\n";//讀取的文件內(nèi)容
}
}catch(Exception?ex){
}
寫文件:
File?file?=?new?File("/sdcard/foo.txt");//
if(!file.exists())
file.createNewFile();//如果文件不存在,創(chuàng)建foo.txt
try?{
OutputStream?outstream?=?new?FileOutputStream(file);//設(shè)置輸出流
OutputStreamWriter?out?=?new?OutputStreamWriter(outstream);//設(shè)置內(nèi)容輸出方式
out.write("文字內(nèi)容");//輸出內(nèi)容到文件中
out.close();
}?catch?(java.io.IOException?e)?{
e.printStackTrace();
}
【轉(zhuǎn)】
首先介紹如何存儲數(shù)據(jù),顯然,要將數(shù)據(jù)從應(yīng)用中輸出到文件中,必須得到一個輸出流outPutStream,然后往輸出流中寫入數(shù)據(jù),在這里Android自帶了一個得到應(yīng)用輸出流的方法
FileOutputStream fos =context.openFileOutput(“yuchao.txt”,Context.MODE_PRIVATE); ?(1)
其中第一個屬性為文件名,第二個屬性為讀寫模式(有關(guān)讀寫模式的說明下面將詳細(xì)闡述),
然后在文件輸出流fos中便可以寫入數(shù)據(jù)
Fos.write(“Hi,”I’m Chao Yu!”.getBytes());
用完文件輸出流之后記得關(guān)閉
fos.close();
這樣,在/data/data/packageName/file目錄下就生成了一個文件名為yuchao.txt的文件,文件中的內(nèi)容為” Hi,I’m Chao Yu!”
有關(guān)(1)中讀寫模式其實就是制定創(chuàng)建文件的權(quán)限以及在讀寫的時候的方式,Android中提供了以下幾種讀寫模式
Context.MODE_PRIVATE ? ?= ?0
該模式下創(chuàng)建的文件其他應(yīng)用無權(quán)訪問,并且本應(yīng)用將覆蓋原有的內(nèi)容
Context.MODE_APPEND ? ?= ?32768
該模式下創(chuàng)建的文件其他應(yīng)用無權(quán)訪問,并且本應(yīng)用將在原有的內(nèi)容后面追加內(nèi)容
Context.MODE_WORLD_READABLE = ?1
該模式下創(chuàng)建的文件其他應(yīng)用有讀的權(quán)限
Context.MODE_WORLD_WRITEABLE = ?2
該模式下創(chuàng)建的文件其他應(yīng)用有寫的權(quán)限
如果需要將文件設(shè)置為外部應(yīng)用可以讀寫,可將讀寫模式設(shè)置為Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE
一般情況下,各個應(yīng)用維護(hù)的數(shù)據(jù)都在一個特定的文件夾中,即上面所提到的/data/data/packageName/file(存在于手機(jī)存儲中),但手機(jī)內(nèi)存畢竟有限,所以有些情況下,我們需要往SD卡中寫入數(shù)據(jù)文件,這其實和普通的java web 應(yīng)用步驟一樣,都是先創(chuàng)建特針對特定目錄特定文件的輸出流,然后往輸出流中寫數(shù)據(jù),這里要注意一個方法,就是獲取SD卡根目錄的方法,隨著Android系統(tǒng)不斷升級,SD卡的根目錄隨時都有可能改變,Android中得到SD卡根目錄的方法是
File sdCardDir = Environment.getExternalStorageDirectory();
然后就可以進(jìn)行下面的步驟
File saveFile = new File(sdCardDir, “yuchao.txt”);
FileOutputStream outStream = new FileOutputStream(saveFile);
outStream.write("Hi,I’m ChaoYu".getBytes());
outStream.close();
值得注意的是,在往SD卡中寫數(shù)據(jù)的時候,健壯的代碼必須考慮SD卡不存在或者寫保護(hù)的情況,故在寫入之前,先做判斷
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
……
}
接著,我們來學(xué)習(xí)下我們的應(yīng)用程序如何讀取文件中的數(shù)據(jù),其實就是寫的逆向過程
若要讀取應(yīng)用程序默認(rèn)維護(hù)的文件(即/data/data/packageName/file目錄下的文件),首先得到文件輸入流
FileInputStream istream = this.context.openFileInput(“yuchao.txt”);
然后在內(nèi)存中開辟一段緩沖區(qū)
byte[] buffer = new byte[1024];
然后創(chuàng)建一個字節(jié)數(shù)組輸出流
ByteArrayOutputStream ostream = new ByteArrayOutputStream();
讀出來的數(shù)據(jù)首先放入緩沖區(qū),滿了之后再寫到字符輸出流中
while((len=istream.read(buffer))!=-1){
ostream.write(buffer, 0, len);
}
最后關(guān)閉輸入流和輸出流
istream.close();
ostream.close();
將得到的內(nèi)容以字符串的形式返回便得到了文件中的內(nèi)容了,這里的流操作較多,故以一張圖片來說明,見圖1
return new String(ostream.toByteArray());
從SD卡中讀取數(shù)據(jù)與上述兩個步驟類似,故不再贅述,留給讀者自己思考
如在開發(fā)過程中進(jìn)行SD卡地讀寫,切忌忘了加入權(quán)限
uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /
uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/
至此,Android系統(tǒng)中有關(guān)文件數(shù)據(jù)的讀寫介紹完畢。
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
String fileName = "/sdcard/y.txt";//文件路徑
// 也可以用String fileName = "mnt/sdcard/Y.txt";
String res = "";
try {
FileInputStream fin = new FileInputStream(fileName);
// FileInputStream fin = openFileInput(fileName);
// 用這個就不行了,必須用FileInputStream
int length = fin.available();
byte[] buffer = new byte[length];
fin.read(buffer);
res = EncodingUtils.getString(buffer, "UTF-8");////依Y.txt的編碼類型選擇合適的編碼,如果不調(diào)整會亂碼
fin.close();//關(guān)閉資源
System.out.println("res---"+res);
int a=Integer.parseInt(res.substring(3, 5));
int b=Integer.parseInt(res.substring(8, 10));
System.out.println(a+"res---"+b);//獲取的a.b
} catch (Exception e) {
e.printStackTrace();
}
}
希望能解決您的問題。