Android Internal and External storage 讀寫檔案 - Tony Blog

文章推薦指數: 80 %
投票人數:10人

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的權限: 儲存目錄為/sdcard,容量則取決於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 電子書



請為這篇文章評分?