zoukankan      html  css  js  c++  java
  • 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;
        }
    }
  • 相关阅读:
    图像处理笔记(二十一):halcon在图像处理中的运用
    图像处理笔记(二十):LAWS纹理滤波应用于缺陷检测
    图像处理笔记(十九):分类器之高斯混合模型
    图像处理笔记(十八):模板匹配
    图像处理笔记(十七):再看傅里叶变换
    图像处理笔记(十六)
    python列表(list)的技巧及高级操作
    python多线程
    CD/CI的概念
    网络
  • 原文地址:https://www.cnblogs.com/xingyyy/p/3265950.html
Copyright © 2011-2022 走看看