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;
}
}