在sd卡下读写文件

1、要在访问SD卡前还必须在配置文件中设置权限,这样才可以最SD卡进行存取操作:
1.     <!-- 在SDCard中创建与删除文件权限 -->  
2. "android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>  
3.     <!-- 往SDCard写入数据权限 -->  
4. "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();
        }
    }



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)删除文件



f.isFile()



 删除文件夹



if
(file.isDirectory())



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