zoukankan      html  css  js  c++  java
  • android 开发-文件存储之读写sdcard

      android提供对可移除的外部存储进行文件存储。在对外部sdcard进行调用的时候首先要调用Environment.getExternalStorageState()检查sdcard的可用状态。通过Environment.getExternalStorageDirectory()得到Sdcard的路径。文件写入外部存储需要添加对sdcard的授权

      <!-- 写sdcard需要添加写sdcard的授权 -->
      <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

      boolean mExternalStorageAvailable = false;
      boolean mExternalStorageWriteable = false;
      String state = Environment.getExternalStorageState();

      if (Environment.MEDIA_MOUNTED.equals(state)) {
          // We can read and write the media
          mExternalStorageAvailable = mExternalStorageWriteable = true;
      } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
          // We can only read the media
          mExternalStorageAvailable = true;
          mExternalStorageWriteable = false;
      } else {
          // Something else is wrong. It may be one of many other states, but all we need
          //  to know is we can neither read nor write
          mExternalStorageAvailable = mExternalStorageWriteable = false;
      }
    android学习过程中的示例如下:
      文件读写工具类:
      
     1 package com.example.android_data_storage_sdcard.file;
     2 
     3 import java.io.ByteArrayOutputStream;
     4 import java.io.File;
     5 import java.io.FileInputStream;
     6 import java.io.FileNotFoundException;
     7 import java.io.FileOutputStream;
     8 import java.io.IOException;
     9 
    10 import android.os.Environment;
    11 import android.util.Log;
    12 /**
    13  * @author xiaowu
    14  * @note  文件存储之外部存储(sdcard存储)。
    15  *         外部存储不需要context        
    16  */
    17 public class FileUitls {
    18     private final String TAG = "FileUtil";
    19 
    20     /**
    21      * 保存文件至外部存储的SD卡
    22      * @param fileName
    23      * @param mode
    24      * @param data
    25      * @return 是否存储内容到sdcard成功
    26      */
    27     public boolean saveFileToSdcard(String fileName,  byte[] data) {
    28         boolean flag = false;
    29         // 判断sdcard的状态
    30         String state = Environment.getExternalStorageState();
    31         // 获取sdcard的根目录 /mnt/sdcard/...
    32         File root = Environment.getExternalStorageDirectory();
    33         FileOutputStream outputStream = null;
    34         // Environment.MEDIA_MOUNTED表示SD卡挂载在手机上并可以读写
    35         if (Environment.MEDIA_MOUNTED.equals(state)) {
    36             // 在sdcard的根目录下创建文件
    37             File file = new File(root, fileName);
    38             try {
    39                 outputStream = new FileOutputStream(file);
    40                 outputStream.write(data, 0, data.length);
    41                 flag = true ;
    42             } catch (FileNotFoundException e) {
    43                 Log.i(TAG, "文件未找到异常!");
    44             } catch (Exception e) {
    45                 Log.i(TAG, "写文件发生异常");
    46             } finally {
    47                 if (outputStream != null) {
    48                     try {
    49                         outputStream.close();
    50                     } catch (IOException e) {
    51                         Log.i(TAG, "关闭IO流发生异常!");
    52                     }
    53                 }
    54             }
    55         }
    56         return flag;
    57     }
    58     /**
    59      * 从sdcard中读文件
    60      * @param fileName
    61      * @return 文件内容
    62      */
    63     public String  readFromSdcard(String fileName){
    64         String  str = "" ;
    65         FileInputStream inputStream = null;
    66         String state = Environment.getExternalStorageState();
    67         ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    68         try {
    69             if (Environment.MEDIA_MOUNTED.equals(state)) {
    70                 //获取Sdcard路径
    71                 File root = Environment.getExternalStorageDirectory();
    72                 File file = new File(root.getAbsolutePath(),fileName);
    73                 if(file.exists()){
    74                     inputStream = new FileInputStream(file);
    75                     int len = 0 ;
    76                     byte[] data = new byte[1024];
    77                     while ((len = inputStream.read(data)) != -1) {
    78                         byteArrayOutputStream.write(data, 0, len);
    79                     }
    80                     return new String(byteArrayOutputStream.toByteArray());
    81                 }
    82             }
    83         } catch (Exception e) {
    84             Log.i(TAG, "文件读取异常!");
    85         }finally{
    86             if(inputStream != null){
    87                 try {
    88                     inputStream.close();
    89                 } catch (IOException e) {
    90                     Log.i(TAG, "关闭流异常!");
    91                 }
    92             }
    93         }
    94         return str ;
    95     }
    96 }

      Junit单元测试类:

      单元测试类必须继承自AndroidTestCase,并在资源清单文件中添加单元测试包  <uses-library android:name="android.test.runner"/>,并添加单元测试目标包

      <!-- 引入单元测试目标包 -->
      <instrumentation
        android:name="android.test.InstrumentationTestRunner"
        android:targetPackage="com.example.android_data_storage_sdcard" >
      </instrumentation>

     1 package com.example.android_data_storage_sdcard;
     2 
     3 import android.test.AndroidTestCase;
     4 
     5 import com.example.android_data_storage_sdcard.file.FileUitls;
     6 
     7 public class MyTest extends AndroidTestCase {
     8     
     9     public void test() {
    10         FileUitls fileUitls = new FileUitls();
    11         fileUitls.saveFileToSdcard("keji.txt", "橘子洲头".getBytes());
    12     }
    13 }

      
  • 相关阅读:
    新型监控告警工具prometheus(普罗米修斯)入门使用(附视频讲解)
    Nginx、OpenResty和Kong的基本概念与使用方法
    Kubernetes网络方案Flannel的学习笔记
    新型监控告警工具prometheus(普罗米修斯)的入门使用(附视频讲解)
    超级账本HyperLedger:Fabric nodejs SDK的使用(附视频讲解)
    超级账本HyperLedger:Fabric使用kafka进行区块排序(共识,附视频讲解)
    超级账本HyperLedger:Fabric Golang SDK的使用(附视频)
    超级账本HyperLedger:Fabric的Chaincode(智能合约、链码)开发、使用演示
    超级账本HyperLedger:Fabric源码走读(一):源代码阅读环境准备
    超级账本HyperLedger:Fabric从1.1.0升级到1.2.0
  • 原文地址:https://www.cnblogs.com/HEWU10/p/4375444.html
Copyright © 2011-2022 走看看