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学习过程中的示例如下:
  文件读写工具类:
  
 package com.example.android_data_storage_sdcard.file;

 import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException; import android.os.Environment;
import android.util.Log;
/**
* @author xiaowu
* @note 文件存储之外部存储(sdcard存储)。
* 外部存储不需要context
*/
public class FileUitls {
private final String TAG = "FileUtil"; /**
* 保存文件至外部存储的SD卡
* @param fileName
* @param mode
* @param data
* @return 是否存储内容到sdcard成功
*/
public boolean saveFileToSdcard(String fileName, byte[] data) {
boolean flag = false;
// 判断sdcard的状态
String state = Environment.getExternalStorageState();
// 获取sdcard的根目录 /mnt/sdcard/...
File root = Environment.getExternalStorageDirectory();
FileOutputStream outputStream = null;
// Environment.MEDIA_MOUNTED表示SD卡挂载在手机上并可以读写
if (Environment.MEDIA_MOUNTED.equals(state)) {
// 在sdcard的根目录下创建文件
File file = new File(root, fileName);
try {
outputStream = new FileOutputStream(file);
outputStream.write(data, 0, data.length);
flag = true ;
} catch (FileNotFoundException e) {
Log.i(TAG, "文件未找到异常!");
} catch (Exception e) {
Log.i(TAG, "写文件发生异常");
} finally {
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
Log.i(TAG, "关闭IO流发生异常!");
}
}
}
}
return flag;
}
/**
* 从sdcard中读文件
* @param fileName
* @return 文件内容
*/
public String readFromSdcard(String fileName){
String str = "" ;
FileInputStream inputStream = null;
String state = Environment.getExternalStorageState();
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
try {
if (Environment.MEDIA_MOUNTED.equals(state)) {
//获取Sdcard路径
File root = Environment.getExternalStorageDirectory();
File file = new File(root.getAbsolutePath(),fileName);
if(file.exists()){
inputStream = new FileInputStream(file);
int len = 0 ;
byte[] data = new byte[1024];
while ((len = inputStream.read(data)) != -1) {
byteArrayOutputStream.write(data, 0, len);
}
return new String(byteArrayOutputStream.toByteArray());
}
}
} catch (Exception e) {
Log.i(TAG, "文件读取异常!");
}finally{
if(inputStream != null){
try {
inputStream.close();
} catch (IOException e) {
Log.i(TAG, "关闭流异常!");
}
}
}
return str ;
}
}

  Junit单元测试类:

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

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

 package com.example.android_data_storage_sdcard;

 import android.test.AndroidTestCase;

 import com.example.android_data_storage_sdcard.file.FileUitls;

 public class MyTest extends AndroidTestCase {

     public void test() {
FileUitls fileUitls = new FileUitls();
fileUitls.saveFileToSdcard("keji.txt", "橘子洲头".getBytes());
}
}
  
05-11 15:34
查看更多