Android實(shí)現(xiàn)讀寫SD卡
SD卡的讀寫是我們?cè)陂_發(fā)Android 應(yīng)用程序過程中最常見的操作。下面介紹SD卡的讀寫操作方式:
1. 獲取SD卡的根目錄
String sdCardRoot = Environment.getExternalStorageDirectory().getAbsolutePath();
2. 在SD卡上創(chuàng)建文件夾目錄
/** * 在SD卡上創(chuàng)建目錄 */ public File createDirOnSDCard(String dir) { File dirFile = new File(sdCardRoot + File.separator + dir +File.separator); Log.v("createDirOnSDCard", sdCardRoot + File.separator + dir +File.separator); dirFile.mkdirs(); return dirFile; }
3. 在SD卡上創(chuàng)建文件
/** * 在SD卡上創(chuàng)建文件 */ public File createFileOnSDCard(String fileName, String dir) throws IOException { File file = new File(sdCardRoot + File.separator + dir + File.separator + fileName); Log.v("createFileOnSDCard", sdCardRoot + File.separator + dir + File.separator + fileName); file.createNewFile(); return file; }
4.判斷文件是否存在于SD卡的某個(gè)目錄
/** * 判斷SD卡上文件是否存在 */ public boolean isFileExist(String fileName, String path) { File file = new File(sdCardRoot + path + File.separator + fileName); return file.exists(); }
5.將數(shù)據(jù)寫入到SD卡指定目錄文件
/* 寫入數(shù)據(jù)到SD卡中 */ public File writeData2SDCard(String path, String fileName, InputStream data) { File file = null; OutputStream output = null; try { createDirOnSDCard(path); //創(chuàng)建目錄 file = createFileOnSDCard(fileName, path); //創(chuàng)建文件 output = new FileOutputStream(file); byte buffer[] = new byte[2*1024]; //每次寫2K數(shù)據(jù) int temp; while((temp = data.read(buffer)) != -1 ) { output.write(buffer,0,temp); } output.flush(); } catch (Exception e) { e.printStackTrace(); } finally{ try { output.close(); //關(guān)閉數(shù)據(jù)流操作 } catch (Exception e2) { e2.printStackTrace(); } } return file; }
注意事項(xiàng)
對(duì)SD卡的操作,必須要申請(qǐng)權(quán)限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
詳情看這里 http://www.dbjr.com.cn/article/34296.htm
注意:不直接進(jìn)行讀出是為了防止打文件操作對(duì)內(nèi)存的消耗,所以用輸入流讀到硬盤上。
public String readFile(String fileName) throws Exception{ FileInputStream fis = context.openFileInput(fileName); byte[] bytes = new byte[fis.available()]; fis.read(bytes); fis.close(); return new String(bytes,"utf-8"); }
當(dāng)文件很大的時(shí)候,byte[]會(huì)占用很大的內(nèi)存。
package cn.itcast.fileio.service; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import android.content.Context; import android.os.Environment; public class SdCardService { private Context ctx; public SdCardService(Context ctx) { this.ctx = ctx; } /** * 寫文件入skcard */ public void writeToSdCard(String fileName, String cont) { try { // 判斷是否有掛載sdcard if (Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) { // 得到sdcar文件目錄 File dir = Environment.getExternalStorageDirectory(); File file = new File(dir, "itcast.txt"); FileOutputStream fos = new FileOutputStream(file); fos.write(cont.getBytes()); fos.close(); } } catch (Exception e) { e.printStackTrace(); } } /** * 讀SdCard中的文件 */ public String readSdCard(String fileName) { try { // 判斷是否有掛載sdcard if (Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) { // 得到sdcar文件目錄 File dir = Environment.getExternalStorageDirectory(); File file = new File(dir, "itcast.txt"); FileInputStream fis = new FileInputStream(file); return readIs2String(fis); } } catch (Exception e) { e.printStackTrace(); } return null; } /** * 將輸入流數(shù)據(jù)讀取到輸出流當(dāng)中 */ private OutputStream readIs2Os(InputStream is ,OutputStream os){ try { byte[] bytes = new byte[1024]; int length = 0 ; while((length = is.read(bytes)) != -1){ os.write(bytes, 0, length); } is.close(); os.close(); } catch (IOException e) { e.printStackTrace(); } return os ; } /** * 將輸入流數(shù)據(jù)讀取到輸出流當(dāng)中 */ public byte[] readIs2Bytes(InputStream is){ ByteArrayOutputStream baos = new ByteArrayOutputStream(); readIs2Os(is,baos); return baos.toByteArray() ; } public String readIs2String(InputStream is){ try { return new String(readIs2Bytes(is),"utf-8"); } catch (Exception e) { e.printStackTrace(); } return null ; } public String readIs2String(String fileName){ try { if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ File dir = Environment.getExternalStorageDirectory(); File file = new File(dir,fileName); FileInputStream is = new FileInputStream(file); return readIs2String(is); } } catch (Exception e) { e.printStackTrace(); } return null ; } }
- Android數(shù)據(jù)持久化之I/O操作詳解
- Android數(shù)據(jù)持久化之File機(jī)制分析
- Android數(shù)據(jù)持久化之Preferences機(jī)制詳解
- 詳解Android開發(fā)數(shù)據(jù)持久化之文件存儲(chǔ)(附源碼)
- Android仿QQ好友列表分組實(shí)現(xiàn)增刪改及持久化
- Android持久化技術(shù)之SharedPreferences存儲(chǔ)實(shí)例詳解
- Android持久化技術(shù)之文件的讀取與寫入實(shí)例詳解
- android讀寫sd卡操作寫入數(shù)據(jù)讀取數(shù)據(jù)示例
- Android編程之在SD卡上進(jìn)行文件讀寫操作實(shí)例詳解
- android 手機(jī)SD卡讀寫操作(以txt文本為例)實(shí)現(xiàn)步驟
- Android數(shù)據(jù)持久化之讀寫SD卡中內(nèi)容的方法詳解
相關(guān)文章
利用Kotlin Tools如何快速添加Kotlin依賴詳解
這篇文章主要給大家介紹了關(guān)于利用Kotlin Tools如何快速添加Kotlin依賴的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-11-11Android studio listview實(shí)現(xiàn)列表數(shù)據(jù)顯示 數(shù)據(jù)循環(huán)顯示效果
這篇文章主要介紹了Android studio listview實(shí)現(xiàn)列表數(shù)據(jù)顯示 數(shù)據(jù)循環(huán)顯示功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04Android 自定義view之畫圖板實(shí)現(xiàn)方法
本文重在對(duì)自定義view,以及其常用類,常用方法的初步了解,提供一個(gè)思路,效果是其次,畫板只是例子,需要的朋友可以參考下2018-01-01使用flutter的showModalBottomSheet遇到的坑及解決
這篇文章主要介紹了使用flutter的showModalBottomSheet遇到的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09DrawerLayout結(jié)合Tollbar實(shí)現(xiàn)菜單側(cè)滑效果
這篇文章主要為大家詳細(xì)介紹了DrawerLayout結(jié)合Tollbar實(shí)現(xiàn)菜單側(cè)滑效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12簡單了解Android性能優(yōu)化方向及相關(guān)工具
這篇文章主要介紹了簡單了解Android性能優(yōu)化方向及相關(guān)工具,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08Android實(shí)現(xiàn)dialog的3D翻轉(zhuǎn)示例
這篇文章主要介紹了Android實(shí)現(xiàn)dialog的3D翻轉(zhuǎn)示例,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-08-08Android 通過httppost上傳文本文件到服務(wù)器的實(shí)例代碼
這篇文章主要介紹了Android 通過httppost上傳文本文件到服務(wù)器的實(shí)例代碼,非常簡單易懂,非常實(shí)用,需要的朋友可以參考下2016-08-08