Android知识点梳理--sdcard读写操作

    xiaoxiao2021-12-14  20

    从事Android开发也很长时间了,知识点多而杂,一直以来都想做个系统的整理和总结,心动不如行动。

    做软件开发,不管什么系统下的,总是少不了文件的读写操作,就先从SDcard的文件读写操作开始吧。

    1权限

    读写SDcard自然是需要从系统那获取相应的许可的,就是权限。这个是第一步,没有这个什么都做不下去。

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 读写SDcard的时候经常打交道的一个类就是Environment类,列一下常见静态方法:

      1:getDataDirectory() 获取到Android中的data数据目录(sd卡中的data文件夹)     2:getDownloadCacheDirectory() 获取到下载的缓存目录(sd卡中的download文件夹)     3:getExternalStorageDirectory() 获取到外部存储的目录 一般指SDcard(/storage/sdcard0)     4:getExternalStorageState() 获取外部设置的当前状态 一般指SDcard,比较常用的应该是 MEDIA_MOUNTED(SDcard存在并且可以进行读写)还有其他的一些状态,可以在文档中进行查找。

        5:getRootDirectory()  获取到Android Root路径

    2判断SDcard是否存在

    这个也是先决条件,很多初学者会忘记的。

    /** * 判断sd卡是否存在,[当没有外挂SD卡时,内置ROM也被识别为存在sd卡] * @return */ private static boolean isExitSDcard(){ boolean isExit; isExit = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED); return isExit; } 这里又有Environment类里的常量了,我总结了一下,在这里列出来供大家参考 MEDIA_BAD_REMOVAL 在没有挂载前存储媒体已经被移除。MEDIA_CHECKING 正在检查存储媒体。MEDIA_MOUNTED 存储媒体已经挂载,并且挂载点可读/写。MEDIA_MOUNTED_READ_ONLY 存储媒体已经挂载,挂载点只读。MEDIA_NOFS 存储媒体是空白或是不支持的文件系统MEDIA_REMOVED 存储媒体被移除。MEDIA_SHARED 存储媒体正在通过USB共享。MEDIA_UNMOUNTABLE 存储媒体无法挂载。MEDIA_UNMOUNTED 存储媒体没有挂载。 在Environment中还提供了Android标准目录的路径,以String类型提供。 DIRECTORY_ALARMS 系统提醒铃声存放的标准目录。 DIRECTORY_DCIM 相机拍摄照片和视频的标准目录。 DIRECTORY_DOWNLOADS 下载的标准目录。 DIRECTORY_MOVIES 电影存放的标准目录。 DIRECTORY_MUSIC 音乐存放的标准目录。 DIRECTORY_NOTIFICATIONS 系统通知铃声存放的标准目录。 DIRECTORY_PICTURES 图片存放的标准目录 DIRECTORY_PODCASTS 系统广播存放的标准目录。 DIRECTORY_RINGTONES 系统铃声存放的标准目录。

    3获取路径和创建文件,文件夹

    1)获取常用的路径,一般开发者这两种路径常用到

    //SD卡的路径

    SDPATH = Environment.getExternalStorageDirectory().getPath(); //当前程序包的路径 FILESPATH = this.getFilesDir().getPath(); 2)创建文件夹,文件 private final static String PATH = "/sdsd/talk/tehst.txt"; private final static String PATH1 = "/sdsd/talk/";//创建文件夹 File file1 = new File(SDPATH+PATH1); if (!file1.exists()){ file1.mkdirs(); } //创建文件 File file = new File(SDPATH + PATH); if (!file.exists()) { file.createNewFile(); } 3)删除文件

    //单个 public boolean deleteSDFile(String fileName) { File file = new File(SDPATH + fileName); if (file == null || !file.exists() || file.isDirectory()) return false; return file.delete(); } //目录下的 public void deleteFile(File file) { if (file.exists()) { // 判断文件是否存在 if (file.isFile()) { // 判断是否是文件 file.delete(); } else if (file.isDirectory()) { // 否则如果它是一个目录 File files[] = file.listFiles(); // 声明目录下所有的文件 files[]; for (int i = 0; i < files.length; i++) { // 遍历目录下所有的文件 this.deleteFile(files[i]); // 把每个文件 用这个方法进行迭代 } } file.delete(); } else { // Log.i("文件不存在!"+"\n"); } } //删除目录下的所有文件及文件夹

    public static void delete(File file) {           if (file.isFile()) {               file.delete();               return;           }           if(file.isDirectory()){               File[] childFiles = file.listFiles();               if (childFiles == null || childFiles.length == 0) {                   file.delete();                   return;               }                      for (int i = 0; i < childFiles.length; i++) {                   delete(childFiles[i]);               }               file.delete();           }       } 

    4)文件的读写

    闲话少说,直接上代码

    FileOutputStream写入文件

    /** * 写入内容到SD卡中的txt文本中 * str为内容 */ public void writeSDFile(String str,String fileName) { try { FileWriter fw = new FileWriter(SDPATH + fileName); File f = new File(SDPATH + fileName); fw.write(str); FileOutputStream os = new FileOutputStream(f); DataOutputStream out = new DataOutputStream(os); out.writeShort(2); out.writeUTF(""); System.out.println(out); fw.flush(); fw.close(); System.out.println(fw); } catch (Exception e) { } } BufferedWriter写入文件 try {       File file = new File(Environment.getExternalStorageDirectory(),               DEFAULT_FILENAME);       //第二个参数意义是说是否以append方式添加内容       BufferedWriter bw = new BufferedWriter(new FileWriter(file, true));       String info = " hey, you gey!";       bw.write(info);       bw.flush();       System.out.println("写入成功");   } catch (Exception e) {       e.printStackTrace();   }   使用FileInputStream读取文件 /** * 读取SD卡中文本文件 * * @param fileName * @return */ public String readSDFile(String fileName) { StringBuffer sb = new StringBuffer(); File file = new File(SDPATH + fileName); try { FileInputStream fis = new FileInputStream(file); int c; while ((c = fis.read()) != -1) { sb.append((char) c); } fis.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return sb.toString(); } 使用BufferReader读取文件

    public String readFile(String fileName){ try { File file = new File(Environment.getExternalStorageDirectory(), fileName); BufferedReader br = new BufferedReader(new FileReader(file)); String readline = ""; StringBuffer sb = new StringBuffer(); while ((readline = br.readLine()) != null) { System.out.println("readline:" + readline); sb.append(readline); } br.close(); System.out.println("读取成功:" + sb.toString()); return sb.toString(); } catch (Exception e) { e.printStackTrace(); } return null; } RandomAccessFile对文件的读写

    import java.io.*;          public class RandomAccessFileDemo {      public static void main(String[] args) throws Exception {       RandomAccessFile file = new RandomAccessFile("file""rw");       // 以下向file文件中写数据       file.writeInt(20);// 占4个字节       file.writeDouble(8.236598);// 占8个字节       file.writeUTF("这是一个UTF字符串");// 这个长度写在当前文件指针的前两个字节处,可用readShort()读取       file.writeBoolean(true);// 占1个字节       file.writeShort(395);// 占2个字节       file.writeLong(2325451l);// 占8个字节       file.writeUTF("又是一个UTF字符串");       file.writeFloat(35.5f);// 占4个字节       file.writeChar('a');// 占2个字节            file.seek(0);// 把文件指针位置设置到文件起始处            // 以下从file文件中读数据,要注意文件指针的位置       System.out.println("——————从file文件指定位置读数据——————");       System.out.println(file.readInt());       System.out.println(file.readDouble());       System.out.println(file.readUTF());            file.skipBytes(3);// 将文件指针跳过3个字节,本例中即跳过了一个boolean值和short值。       System.out.println(file.readLong());            file.skipBytes(file.readShort()); // 跳过文件中“又是一个UTF字符串”所占字节,注意readShort()方法会移动文件指针,所以不用加2。       System.out.println(file.readFloat());              //以下演示文件复制操作       System.out.println("——————文件复制(从file到fileCopy)——————");       file.seek(0);       RandomAccessFile fileCopy=new RandomAccessFile("fileCopy","rw");       int len=(int)file.length();//取得文件长度(字节数)       byte[] b=new byte[len];       file.readFully(b);       fileCopy.write(b);       System.out.println("复制完成!");      }    

    除了对SDcard上的文件进行读写,在很多时候还需要读取项目文件夹下的资源,如raw和asset

    从resource的raw中读取文件数据:

    String res = "";    try{            //得到资源中的Raw数据流       InputStream in = getResources().openRawResource(R.raw.test);           //得到数据的大小       int length = in.available();                 byte [] buffer = new byte[length];                  //读取数据       in.read(buffer);                   //依test.txt的编码类型选择合适的编码,如果不调整会乱码        res = EncodingUtils.getString(buffer, "BIG5");               //关闭           in.close();                     }catch(Exception e){          e.printStackTrace();               }   从resource的asset中读取文件数据:

    String fileName = "test.txt"//文件名字    String res="";    try{          //得到资源中的asset数据流      InputStream in = getResources().getAssets().open(fileName);          int length = in.available();               byte [] buffer = new byte[length];                 in.read(buffer);                  in.close();      res = EncodingUtils.getString(buffer, "UTF-8");             }catch(Exception e){             e.printStackTrace();                  }   

    获取扩展存储设备的大小      String sdcard = Environment.getExternalStorageDirectory().getPath();    StatFs statFs = new StatFs(sdcard);    long blockSize = statFs.getBlockSize();//返回以字节为单位的一个文件系统大小    long blockCount = statFs.getBlockCount() ;    long blocks = statFs.getAvailableBlocks();//获取当前可用的存储空间    long availableSpare = (blocks * blockSize) / (1024 * 1024);

    String Name = File.getName();  //获得文件或文件夹的名称:   String parentPath = File.getParent();  //获得文件或文件夹的父目录   String path = File.getAbsoultePath();//绝对路经   String path = File.getPath();//相对路经    File.createNewFile();//建立文件     File.mkDir(); //建立文件夹     File.isDirectory(); //判断是文件或文件夹   File[] files = File.listFiles();  //列出文件夹下的所有文件和文件夹名   File.renameTo(dest);  //修改文件夹和文件名   File.delete();  //删除文件夹或文件 

    1、apk中有两种资源文件,使用两种不同的方式进行打开使用。 raw使用InputStream in = getResources().openRawResource(R.raw.test); asset使用InputStream in = getResources().getAssets().open(fileName);

    这些数据只能读取,不能写入。更重要的是该目录下的文件大小不能超过1M。

    同时,需要注意的是,在使用InputStream的时候需要在函数名称后加上throws IOException。

    2、SD卡中的文件使用FileInputStream和FileOutputStream进行文件的操作。 3、存放在数据区(/data/data/..)的文件只能使用openFileOutput和openFileInput进行操作。 注意不能使用FileInputStream和FileOutputStream进行文件的操作。 4、RandomAccessFile类仅限于文件的操作,不能访问其他IO设备。它可以跳转到文件的任意位置,从当前位置开始读写。

    5、InputStream和FileInputStream都可以使用skip和read(buffre,offset,length)函数来实现文件的随机读取。

    文件的读写操作基础也就这些了,对于深入复杂的暂不总结,这些知识点也很常见,大路边上的,浮于表面,只是总结一下,闲暇时候可以翻出来看看,希望也能对你有帮助。

    特别感谢以下大神的文章:

    参考:http://www.2cto.com/kf/201408/327215.html

    http://blog.sina.com.cn/s/blog_5da93c8f010110sn.html

    http://blog.csdn.net/mad1989/article/details/37568667

    http://www.jb51.net/article/34296.htm

    http://blog.csdn.net/ztp800201/article/details/7322110

    转载请注明原文地址: https://ju.6miu.com/read-963693.html

    最新回复(0)