在sd卡下读写文件
1、要在访问SD卡前还必须在配置文件中设置权限,这样才可以最SD卡进行存取操作:
- <!-- 在SDCard中创建与删除文件权限 -->
- <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
- <!-- 往SDCard写入数据权限 -->
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
2、常用操作
(1)获取SD卡的路径
//获取SD卡的路径
String SDPATH = Environment.getExternalStorageDirectory() + "/";
(2)为程序在sd卡建立专用的文件夹note:
String sDir=Environment.getExternalStorageDirectory() + "/"+"note"; File destDir = new File(sDir); if (!destDir.exists()) { destDir.mkdirs();}
创建文件:file.mkdir();
(3)在sd卡新建文件并写入内容
write(et2.getText().toString());
protected void write(String Content) { // 参数Content是要写入的内容 try{ String name=et1.getText().toString()+".txt";//确定文件名 String SDPATH = Environment.getExternalStorageDirectory() + "/note/"; //获取SD卡的路径+文件夹 File file = new File(SDPATH + name); file.createNewFile(); //新建文件 FileOutputStream fos = new FileOutputStream(file);//实例化文件输出流 fos.write(Content.getBytes()); fos.close();//关闭文件流 } catch(Exception e){ e.printStackTrace(); } }
注意:FileOutputStream(String name, boolean append)
append默认为false,即覆盖原内容;若为 true,则将字节写入文件末尾处,而不是写入文件开始处
(4)在sd卡读文件方法
tv.setText(read(File_Name));
public static String read(String path) {
// 参数FileName是一个文件的完整绝对路径
try {
File file = new File(path);
FileInputStream inStream = new FileInputStream(file);//实例化文件输入流对象
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];//定义缓存数组
int length = -1;
while((length = inStream.read(buffer)) != -1 ){
outStream.write(buffer, 0, length);
}
outStream.close();
inStream.close();
return outStream.toString();
}catch (IOException e){
Log.i("Fileread", e.getMessage());
return null;}
}
(5)对文件重命名
File file = new File(Environment.getExternalStorageDirectory() + "/MyNote/"+Title_Name); file.renameTo(new File(Environment.getExternalStorageDirectory() + "/MyNote/"+newname));
(6)判断是否是文件夹:
File root = new File(fromFile); if(root.isDirectory()){ }
(7)获取文件夹下的内容
String[] m=fileList(); //搜索应用程序私有文件夹下的私有文件,返回所有文件名的String数
或
(1) File file = new File(Environment.getExternalStorageDirectory() + "/note"); String[] m=file.list(); //列表项成为sd卡note文件夹下的文件名数组
(2) File[] currentFiles;//如果则获取当前目录下的全部文件 填充数组
currentFiles = file.listFiles();//文件数组
(8)删除文件
File f = new File(sDir);
if(f.exists()&f.isFile()
) f.delete();
删除文件夹
if
(file.isDirectory())
File files[] = file.listFiles(); // 声明目录下所有的文件 files[]; for (int i = 0; i < files.length; i++) { // 遍历目录下所有的文件 this.deleteFile(files[i]); // 把每个文件 用这个方法进行迭代
(8)获取File的文件名
String=File.getFilname();
返回的是 quick_search_widget_morning.jpg 这种形式
(9)文件(夹)的复制
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import android.app.Activity; import android.os.Bundle; import android.os.Environment; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; public class MainActivity extends Activity { private Button m_btn = null; static String SDPATH = Environment.getExternalStorageDirectory()+"" ; private final static String FROMPATH =SDPATH+"/MyNote";//文件名 private final static String TOPATH = SDPATH+"/tmp/picture";//文件夹名 /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); m_btn = (Button)findViewById(R.id.button1); m_btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub if(copy(FROMPATH, TOPATH)==0) { Toast.makeText(MainActivity.this,"文件拷贝成功!!!",20000).show(); }else { Toast.makeText(MainActivity.this,"文件拷贝失败!!!",20000).show(); } } }); } public int copy(String fromFile, String toFile) { File root = new File(fromFile); if(!root.exists()) return -1;//如果不存在则 return出去 File targetDir = new File(toFile); //目标目录 //创建目录 if(!targetDir.exists()) { targetDir.mkdirs(); } if(root.isDirectory()) { toFile=toFile+"/"+root.getName(); //要复制的文件目录 File[] currentFiles; //如果存在则获取当前目录下的全部文件 填充数组 currentFiles = root.listFiles(); //遍历要复制该目录下的全部文件 for(int i= 0;i<currentFiles.length;i++) { if(currentFiles[i].isDirectory())//如果当前项为子目录 进行递归 { //new File(toFile +"/"+currentFiles[i].getName()).mkdirs(); copy(currentFiles[i].getPath(), toFile); }else//如果当前项为文件则进行文件拷贝 { CopySdcardFile(currentFiles[i].getPath(), toFile +"/"+currentFiles[i].getName()); } } }else { //如果待复制目录是文件,则直接复制 CopySdcardFile(root.getPath(), toFile+"/"+root.getName()); } return 0; } //文件拷贝 //要复制的目录下的所有非子目录(文件夹)文件拷贝 public int CopySdcardFile(String fromFile, String toFile) { try { InputStream fosfrom = new FileInputStream(fromFile); OutputStream fosto = new FileOutputStream(toFile); byte bt[] = new byte[1024]; int c; while ((c = fosfrom.read(bt)) > 0) { fosto.write(bt, 0, c); } fosfrom.close(); fosto.close(); return 0; } catch (Exception ex) { return -1; } } }
文件(夹)的移动:
File root = new File(fromFile);
Mdelete(root);
.......
public void Mdelete(File file){ if(file.isFile()){ file.delete(); return; } if(file.isDirectory()){ File[] childFile = file.listFiles(); if(childFile == null || childFile.length == 0){ file.delete(); return; } for(File f : childFile){ Mdelete(f); } file.delete(); } }
(10)在sd卡搜索某类型的文件
File file=new File(SDPATH);
File[] files=file.listFiles(); MMove(files); .... public boolean MMove(File[] files) { if (files != null) {// 先判断目录是否为空,否则会报空指针 for (File file : files) { if (file.isDirectory()) { MMove(file.listFiles()); } else { //String fileName = file.getName(); if (file.getName().endsWith(".png") { copy(file.getPath(),TOPATH); } } } return true;} else return false; }
三、以下是一个对SD操作经常用到的类,以后如果需要对SD卡操作,直接可以拿过来用:
public class FileUtils { private String SDPATH; public String getSDPATH() { return SDPATH; } public FileUtils() { //得到当前外部存储设备的目录 // /SDCARD SDPATH = Environment.getExternalStorageDirectory() + "/"; } /** * 在SD卡上创建文件 * * @throws IOException */ public File creatSDFile(String fileName) throws IOException { File file = new File(SDPATH + fileName); file.createNewFile(); return file; } /** * 在SD卡上创建目录 * * @param dirName */ public File creatSDDir(String dirName) { File dir = new File(SDPATH + dirName); dir.mkdir(); return dir; } /** * 判断SD卡上的文件夹是否存在 */ public boolean isFileExist(String fileName){ File file = new File(SDPATH + fileName); return file.exists(); } /** * 将一个InputStream里面的数据写入到SD卡中 */ public File write2SDFromInput(String path,String fileName,InputStream input){ File file = null; OutputStream output = null; try{ creatSDDir(path); file = creatSDFile(path + fileName); output = new FileOutputStream(file); byte buffer [] = new byte[4 * 1024]; while((input.read(buffer)) != -1){ output.write(buffer); } output.flush(); } catch(Exception e){ e.printStackTrace(); } finally{ try{ output.close(); } catch(Exception e){ e.printStackTrace(); } } return file; } }