Android Internal and External storage 讀寫檔案 - Tony Blog
文章推薦指數: 80 %
Android可以將檔案儲存在手機上的記憶體(Internal Storage),或是外部儲存 ... 取得外部儲存媒體的目錄(這裡會是/sdcard) String path = Environment.
AndroidInternalandExternalstorage讀寫檔案
Android
3月12,2012
Androidstorage
Android可以將檔案儲存在手機上的記憶體(InternalStorage),或是外部儲存媒體SDcard(ExternalStorage)。
Internalstorage是儲存在/data/data/package_name/files目錄中,每個App會有一個獨立的目錄來儲存檔案,其他App無法存取。
由於是儲存在手機的記憶體中,所有會有空間的限制,不建議在這裡儲存容量太大的檔案。
使用Internalstorage不需要額外設定權限。
使用ExternalStorage則必須設定讀取SDcard的權限:
儲存在Internalstorage時,當App被移除,所有的資料也會被移除,而Externalstorage因為是儲存在SDcard,所以不會因為App被移除而消失。
使用方法
兩者使用方式基本上都相同,只是在讀寫時會使用不同的類別。
Internalstorage:
//讀檔
FileInputStreamfin=this.openFileInput(filename);
//寫檔
FileOutputStreamfout=this.openFileOutput(filename,Context.MODE_PRIVATE);
對Internalstorage做讀寫時是使用android.content.ContextWrapper類別中的方法,this是指該Activity。
Context.MODE_PRIVATE是指該檔案為私有的,只能由該App讀寫。
另外還有其他指示性的常數,在Context抽象類別可以找到以MODE_開頭的常數。
Externalstorage:
//取得外部儲存媒體的目錄(這裡會是/sdcard)
Stringpath=Environment.getExternalStorageDirectory().getPath();
//檔案路徑,記得要加斜線(這樣/sdcard/filename)
Filefile=newFile(path+"/"+filename);
//讀檔
FileInputStreamfin=newFileInputStream(file);
//寫檔
FileOutputStreamfout=newFileOutputStream(file);
基本上就是使用原本的Java.io裡的類別。
這樣檔案會直接儲存在SDcard下,或許你會想要建立一個自己App使用的目錄,使用的方式如下:
//先取得sdcard目錄
Stringpath=Environment.getExternalStorageDirectory().getPath();
//利用File來設定目錄的名稱(myappdir)
Filedir=newFile(path+"/myappdir");
//先檢查該目錄是否存在
if(!dir.exists()){
//若不存在則建立它
dir.mkdir();
}
如此就會有一個/sdcard/myappdir的目錄產生。
之後你的檔案就可以放在
Filefile=newFile(path+"/myappdir/"+filename);
此外,在使用Externalstorage之前,最好先檢查一下外部媒是否存在及能否讀寫。
//取得外部儲存媒體的狀態
Stringstate=Environment.getExternalStorageState();
//判斷狀態
if(Environment.MEDIA_MOUNTED.equals(state)){
Log.d(TAG,"可以讀寫");
}elseif(Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)){
Log.d(TAG,"只可以讀取,無法寫入");
}else{
Log.d(TAG,"無法讀寫");
}
程式碼
我把實際使用的程式碼寫成方法,方便使用,請依自己的需求修改,如下:
Internalstorage:
//寫檔
privatevoidwriteDataToFile(Stringfilename,Stringdata){
try{
FileOutputStreamfout=this.openFileOutput(filename,Context.MODE_PRIVATE);
fout.write(data.getBytes());
fout.close();
}catch(FileNotFoundExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
}
//讀檔
privateStringreadDataFromFile(Stringfilename){
Stringresult=null;
try{
StringBuildersb=newStringBuilder();
FileInputStreamfin=this.openFileInput(filename);
byte[]data=newbyte[fin.available()];
while(fin.read(data)!=-1){
sb.append(newString(data));
}
fin.close();
result=sb.toString();
}catch(FileNotFoundExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
returnresult;
}
Externalstorage:
//寫檔到sdcard
privatevoidwriteToSDcard(Stringfilename,Stringdata){
//建立自己的目錄
Stringpath=Environment.getExternalStorageDirectory().getPath();
Filedir=newFile(path+"/movietime");
if(!dir.exists()){
dir.mkdir();
}
try{
Filefile=newFile(path+"/movietime/"+filename);
FileOutputStreamfout=newFileOutputStream(file);
fout.write(data.getBytes());
fout.close();
}catch(FileNotFoundExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
Log.d(TAG,"WritetoSDCARD!");
}
//從sdcard讀檔
privateStringreadFromSDcard(Stringfilename){
Stringpath=Environment.getExternalStorageDirectory().getPath();
Filefile=newFile(path+"/movietime/"+filename);
StringBuildersb=newStringBuilder();
try{
FileInputStreamfin=newFileInputStream(file);
byte[]data=newbyte[fin.available()];
while(fin.read(data)!=-1){
sb.append(newString(data));
}
fin.close();
}catch(FileNotFoundExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
Log.d("TAG","ReadfromSDCARD:"+json.toString());
returnsb.toString();
}
本文網址:http://blog.tonycube.com/2012/03/android-internal-and-external-storage.html
由TonyBlog撰寫,請勿全文複製,轉載時請註明出處及連結,謝謝😀
2則留言
Unknown2019年7月20日中午12:31請問有辦法讀取在Internalstorage中的javafile,並且使用/執行javafile中的方法嗎?回覆刪除回覆Tony2019年7月22日上午11:11應該是不行刪除回覆回覆回覆新增留言載入更多…
留言小提醒:1.回覆時間通常在晚上,如果太忙可能要等幾天。
2.請先瀏覽一下其他人的留言,也許有人問過同樣的問題。
3.程式碼請先將它編碼後再貼上。
(線上編碼:http://bit.ly/1DL6yog)4.文字請加上標點符號及斷行,難以閱讀者恕難回覆。
5.感謝您的留言,您的問題也可能幫助到其他有相同問題的人。
較新的文章
較舊的文章
首頁
電子書📚
GooglePlayPubu
Kobo
GooglePlayPubu
Kobo
GooglePlayPubu
Kobo
GooglePlayPubuGitbookKobo
熱門文章🔥
Java要收費?!是時候使用OpenJDK了
使用Composer管理PHP套件
VisualStudioCode極速上手指南
Java8新功能筆記(3)-Stream
Java8新功能筆記(4)-Optional
Android地圖與定位(MapsandPositioning)(3)
Android如何使用GET&POST取得資料
在Android中使用SQLite資料庫
系列文章📦
Kotlin實戰範例
動手學VPS架站:使用CentOS7+Nginx+PHP-FPM+MariaDB
Vue.js漸進式JavaScript框架入門
Laravel4學習筆記
文章分類🏷
Android
Laravel
PHP
Vuejs
Kotlin
Java
CentOS
Linux
WindowsPhone
C#
Flash
HTML
Objective-C
Cocos2D
Nginx
Xcode
ActionScript
iOS
web
Reading
SublimeText3
ssl
Chart
Eclipse
Swift
bash
Apache
JSON
git
shell
Ajax
Blogger
CSS
CocoaPods
Database
Gradle
Macbook
PC
Redmine
VSCode
VisualStudioCode
VisualStudio
Vuido
jQuery
ssh
電子書
延伸文章資訊
- 1How to get file path from Internal Storage in Android? - 11zon
Android Internal storage is used to read and write data to the internal memory that store data pr...
- 2File access with Xamarin.Android - Microsoft Docs
Android app determines the path to the file that will be manipulated, ... Because the actual path...
- 3Data and file storage overview | Android Developers
Android provides two types of physical storage locations: internal storage and external storage. ...
- 4(Android) Find path /Android in internal storage - Stack Overflow
Is there a method in Android that returns the data path on internal storage? I have 2 Android sma...
- 5[Android] 12-2 Internal Storage - 給你魚竿
官網https://developer.android.com/training/basics/data-storage/files.html ... 可以看到file path = /data...