Android学习笔记之File存储(sd卡)

 在sd卡下读写文件

1、要在访问SD卡前还必须在配置文件中设置权限,这样才可以最SD卡进行存取操作:

  1.     <!-- 在SDCard中创建与删除文件权限 -->  
  2.     <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>  
  3.     <!-- 往SDCard写入数据权限 -->  
  4.     <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;
    }
}
原文地址:https://www.cnblogs.com/xingyyy/p/3265950.html