文件存储——实际使用

我尽量不打错别字,用词准确,不造成阅读障碍。

本篇讲述一般情况下的文件操作,如不理解外部存储和内部存储的概念,请阅读我之前的一篇文章:http://blog.csdn.net/Fly_li_sir/article/details/79496933;Android文件操作就是java的文件操作,不同之处就是你要知道Android的文件结构才能做到” 存哪里“、”读哪里“。

一般文件操作对象为简单文件存放和媒体数据(语音、视频、图片等)存放,数据媒体的存放在初始化设备的时候就指定了存放地址,你只要会创建临时文件就好了,所以本文主要以简单文件结合Android手机的内部存储和外部存储来讲解。

一.外部存储

一般情况下我们的文件操作是指对外部存储的操作,所以要设置文件路径,网上有很多案例是直接写文件名及后缀的,那是存储在内部存储中的。

public static final String APPLICATION_DIRECTORY = "/fileManagerDemo";   // “/”别忘了

先判断外部存储是否可用:

public static boolean isSDCardAvailable() {
        return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState());
    }
创建文件夹
//fileName = "/fileManagerDemo";
public boolean createDir(String fileName) {
  //首先要判断外部存储是否可用,此处用SDCard代替外部存储
  if (isSDCardAvailable()) {
   File file = new File(Environment.getExternalStorageDirectory() + fileName);
      if (!file.exists()) {
          return file.mkdirs();
         }
      }
     return false;
  }

顺便提一下mkdirs();和mkdir();的区别:

mkdir():只能创建一级目录且父目录必须存在,否则文件夹不会创建并返回false。

mkdirs():可以创建多级目录,父目录可以不存在,没有父目录会自动创建,所以一般直接写路径就好,开发中我用的比较多。

创建文件

文件名请带后缀,下同

//fileName = "/test.txt";
public boolean createFile(String fileName) {
    if (isSDCardAvailable()) {
       File mkDir = new File(Environment.getExternalStorageDirectory() + APPLICATION_DIRECTORY, fileName);
      if (!mkDir.exists()) {
            try {
               return mkDir.createNewFile();
            } catch (IOException e) {
                 e.printStackTrace();
             }
          }
      }
       return false;
   }
写文件

写文件的方法有很多,这里介绍两种:

一.FileOutputStream形式

这是最基本的Java文件流操作形式:

//若路径详细,无文件时自动创建 fileName = "/test.txt";
public void writeFileToOutStorageOne(String content, String fileName) {
        if (isSDCardAvailable()) {
            try {
                File file = new File(Environment.getExternalStorageDirectory() + APPLICATION_DIRECTORY + fileName);
                FileOutputStream fileOutputStream = new FileOutputStream(file);
                fileOutputStream.write(content.getBytes());  //会覆盖文件内容
                fileOutputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
二.RandomAccessFile形式

这个是随机读取类,File类更倾向于对文件本身进行操作,RandomAccessFile可以对文件内容进行更多操作,比如在文件的任意位置读取或写入,实际开发中本人更喜欢用这种。

//无文件时不会自动创建文件 fileName = "/test.txt";
public void writeFileToOutStorageTwo(String content, String fileName) {
        if (isSDCardAvailable()) {
            try {
                File file = new File(Environment.getExternalStorageDirectory() + APPLICATION_DIRECTORY + fileName);
//                file.delete();
//                file.createNewFile();
                RandomAccessFile raf = null;
                if (file.canWrite()) {
                    raf = new RandomAccessFile(file, "rw"); //"rw"为读写,"r"为只读
                    raf.seek(raf.length());  //设置文件的写入位置,否则将覆盖内容  
                    raf.write(content.getBytes());
                    raf.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
读文件
//fileName = "/test.txt";
public String readFile(String fileName) {
        String result = null;
        if (isSDCardAvailable()) {
            try {
                File file = new File(Environment.getExternalStorageDirectory() + APPLICATION_DIRECTORY, fileName);
                FileInputStream fileInputStream = new FileInputStream(file);
                byte[] buffer = new byte[1024];
                int len = 0;
                ByteArrayOutputStream baso = new ByteArrayOutputStream();
                while ((len = fileInputStream.read(buffer)) != -1) {
                    baso.write(buffer, 0, len);
                }
                result = baso.toString();
                fileInputStream.close();
                baso.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return result;
    }
删除文件
 public boolean deleteFile(String fileName) {
        if (isSDCardAvailable()) {
            File file = new File(Environment.getExternalStorageDirectory() + APPLICATION_DIRECTORY + fileName);
            return file.delete();
        }
        return false;
    }

二.内部存储

想了一下,还是把内部存储的部分也写一写,只写读文件和写文件就可以了,因为写文件时文件会创建,删除文件与外部存储一摸一样。

写文件
public boolean createFile(String content) {
        try {
            FileOutputStream fos = mContext.openFileOutput("a.txt",Context.MODE_PRIVATE);
            byte[] bytes = content.getBytes();
            fos.write(bytes);
            fos.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return false;
    }
读文件
public String readFile(){
        String content = null;
        try {
            FileInputStream fis= mContext.openFileInput("a.txt");
            ByteArrayOutputStream baos =  new ByteArrayOutputStream();
            byte [] buffer =  new byte[1024];
            int len = 0;
            while ((len=fis.read(buffer))!=-1) {
                baos.write(buffer, 0, len);
            }
            content = baos.toString();
            fis.close();
            baos.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return content;
    }

根据情况稍稍修改一下就好了。本文介绍的都是基础的用法,实际开发中会有很多方法可以用:附上File的一些方法:

方法名作用
File.getName();获得文件或文件夹的名称
File.getParent();获得文件或文件夹的父目录
File.getAbsoultePath();获取绝对路径
File.getPath();获取相对路径
File.createNewFile();创建文件
File.mkDir(); /File.mkdirs();创建文件夹
File.isDirectory();判断是否是文件或文件夹
File.listFiles();列出文件夹下的所有文件和文件夹名
File.renameTo(dest);修改文件夹和文件名
File.delete();删除文件夹或文件

可以看出File类主要是对文件本身的操作;

如有不对的地方欢迎指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值