Android实现读写SD卡
SD卡的读写是我们在开发Android应用程序过程中最常见的操作。下面介绍SD卡的读写操作方式:
1.获取SD卡的根目录
String sdCardRoot=Environment.getExternalStorageDirectory().getAbsolutePath();
2.在SD卡上创建文件夹目录
/** *在SD卡上创建目录 */ publicFilecreateDirOnSDCard(Stringdir) { FiledirFile=newFile(sdCardRoot+File.separator+dir+File.separator); Log.v("createDirOnSDCard",sdCardRoot+File.separator+dir+File.separator); dirFile.mkdirs(); returndirFile; }
3.在SD卡上创建文件
/** *在SD卡上创建文件 */ publicFilecreateFileOnSDCard(StringfileName,Stringdir)throwsIOException { Filefile=newFile(sdCardRoot+File.separator+dir+File.separator+fileName); Log.v("createFileOnSDCard",sdCardRoot+File.separator+dir+File.separator+fileName); file.createNewFile(); returnfile; }
4.判断文件是否存在于SD卡的某个目录
/** *判断SD卡上文件是否存在 */ publicbooleanisFileExist(StringfileName,Stringpath) { Filefile=newFile(sdCardRoot+path+File.separator+fileName); returnfile.exists(); }
5.将数据写入到SD卡指定目录文件
/*写入数据到SD卡中 */ publicFilewriteData2SDCard(Stringpath,StringfileName,InputStreamdata) { Filefile=null; OutputStreamoutput=null; try{ createDirOnSDCard(path);//创建目录 file=createFileOnSDCard(fileName,path);//创建文件 output=newFileOutputStream(file); bytebuffer[]=newbyte[2*1024];//每次写2K数据 inttemp; while((temp=data.read(buffer))!=-1) { output.write(buffer,0,temp); } output.flush(); }catch(Exceptione){ e.printStackTrace(); } finally{ try{ output.close();//关闭数据流操作 }catch(Exceptione2){ e2.printStackTrace(); } } returnfile; }
注意事项
对SD卡的操作,必须要申请权限:
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
详情看这里https://www.nhooo.com/article/34296.htm
注意:不直接进行读出是为了防止打文件操作对内存的消耗,所以用输入流读到硬盘上。
publicStringreadFile(StringfileName)throwsException{ FileInputStreamfis=context.openFileInput(fileName); byte[]bytes=newbyte[fis.available()]; fis.read(bytes); fis.close(); returnnewString(bytes,"utf-8"); }
当文件很大的时候,byte[]会占用很大的内存。
packagecn.itcast.fileio.service; importjava.io.ByteArrayOutputStream; importjava.io.File; importjava.io.FileInputStream; importjava.io.FileOutputStream; importjava.io.IOException; importjava.io.InputStream; importjava.io.OutputStream; importandroid.content.Context; importandroid.os.Environment; publicclassSdCardService{ privateContextctx; publicSdCardService(Contextctx){ this.ctx=ctx; } /** *写文件入skcard */ publicvoidwriteToSdCard(StringfileName,Stringcont){ try{ //判断是否有挂载sdcard if(Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)){ //得到sdcar文件目录 Filedir=Environment.getExternalStorageDirectory(); Filefile=newFile(dir,"itcast.txt"); FileOutputStreamfos=newFileOutputStream(file); fos.write(cont.getBytes()); fos.close(); } } catch(Exceptione){ e.printStackTrace(); } } /** *读SdCard中的文件 */ publicStringreadSdCard(StringfileName){ try{ //判断是否有挂载sdcard if(Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)){ //得到sdcar文件目录 Filedir=Environment.getExternalStorageDirectory(); Filefile=newFile(dir,"itcast.txt"); FileInputStreamfis=newFileInputStream(file); returnreadIs2String(fis); } } catch(Exceptione){ e.printStackTrace(); } returnnull; } /** *将输入流数据读取到输出流当中 */ privateOutputStreamreadIs2Os(InputStreamis,OutputStreamos){ try{ byte[]bytes=newbyte[1024]; intlength=0; while((length=is.read(bytes))!=-1){ os.write(bytes,0,length); } is.close(); os.close(); } catch(IOExceptione){ e.printStackTrace(); } returnos; } /** *将输入流数据读取到输出流当中 */ publicbyte[]readIs2Bytes(InputStreamis){ ByteArrayOutputStreambaos=newByteArrayOutputStream(); readIs2Os(is,baos); returnbaos.toByteArray(); } publicStringreadIs2String(InputStreamis){ try{ returnnewString(readIs2Bytes(is),"utf-8"); } catch(Exceptione){ e.printStackTrace(); } returnnull; } publicStringreadIs2String(StringfileName){ try{ if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ Filedir=Environment.getExternalStorageDirectory(); Filefile=newFile(dir,fileName); FileInputStreamis=newFileInputStream(file); returnreadIs2String(is); } } catch(Exceptione){ e.printStackTrace(); } returnnull; } }