SD Card File Storage

一,说明

  • 应用运行用到的数据文件可以保存到SD卡中
  • 文件类型:任意
  • 数据保存路径:
    • 路径一:/storage/sdcard/Android/data/packageName/files/
    • 此路径其他应用可以访问,应用卸载时删除
    • 路径二:/storage/sdcark/xxx
    • 此路径其他应用可以访问,应用卸载时不删除
  • 必须保证sd卡挂载在手机上才能读写,否则不能操作

二,API

操作SD卡的工具类Environment
  • Environment.getExternalStorageState()
    得到SD卡状态,可挂载状态:Environment.MEDIA_MOUNTED
  • Environment.getExternalStorageDirectory()
    得到SD卡路径
路径一
  • context.getExternalFilesDir(String type)
    得到/storage/sdcard/Android/data/packageName/files(type=null)
    当type取其他常量可在files文件夹下建立不同子文件夹,详见源码
SD卡的权限
  • android.permission.WRITE_EXTERNAL_STORAGE

三,测试源码

/**
 * 测试手机外部文件储存
 * 
 * @author quantai.zhu
 *
 */
public class SDActivity extends Activity {
    private EditText et_sd_name;
    private EditText et_sd_content;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sd);
        et_sd_name = (EditText) findViewById(R.id.et_sd_name);
        et_sd_content = (EditText) findViewById(R.id.et_sd_content);
    }

    /**
     * SD卡文件保存测试
     * 
     * @param v
     * @throws IOException
     */
    public void onClickSave(View v) throws IOException {

        // step1.判断SD卡挂载状态
        if (Environment.getExternalStorageState().equals(
                Environment.MEDIA_MOUNTED)) {
            // step2.得到输入的文件名和内容
            String fileName = et_sd_name.getText().toString();
            String content = et_sd_content.getText().toString();

            // step3.构建路径
            // 注:需要读取SD卡的权限才能在调用此方法是实时建立对应文件夹,否则得到可能为null
            File externalFilesDir = this.getExternalFilesDir(null);
            String filePath = externalFilesDir.getAbsolutePath() + "/"
                    + fileName;

            // step4.传输
            FileOutputStream fos = new FileOutputStream(filePath);
            fos.write(content.getBytes("utf-8"));
            fos.close();

            // step5.提示完成
            Toast.makeText(this, "传输完成", 0).show();
        } else {
            Toast.makeText(this, "SD卡未挂载!", 0).show();
        }
    }

    public void onClickRead(View v) throws IOException {
        // 1. 判断是否挂载SD卡
        if (Environment.getExternalStorageState().equals(
                Environment.MEDIA_MOUNTED)) {
            // 2. 得到文件路径
            String fileName = et_sd_name.getText().toString();
            String filePath = this.getExternalFilesDir(null).getAbsolutePath()
                    + "/" + fileName;

            // 3. 创建输入流
            FileInputStream fis = new FileInputStream(filePath);
            byte[] buffer = new byte[1024];
            // 注:此处使用ByteArrayOutputStream来存储byte数据
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            int len = -1;
            while ((len = fis.read(buffer)) != -1) {
                baos.write(buffer, 0, len);
            }
            baos.close();
            fis.close();
            String content = baos.toString();

            // 4. 显示
            et_sd_content.setText(content);
        } else {
            Toast.makeText(this, "SD卡未挂载!", 0).show();
        }
    }

    public void onClickSave2(View v) throws IOException {
        // 1.检查SD卡状态
        if (Environment.getExternalStorageState().equals(
                Environment.MEDIA_MOUNTED)) {
            // 2.得到SD卡根路径
            String storageDirPath = Environment.getExternalStorageDirectory()
                    .getAbsolutePath();
            String path = storageDirPath + "/zhu";
            new File(path).mkdir();

            // 3.得到输入内容
            String name = et_sd_name.getText().toString();
            String content = et_sd_content.getText().toString();

            // 4.输出流写文件
            String filePath = path + "/" + name;
            FileOutputStream fos = new FileOutputStream(filePath);
            fos.write(content.getBytes("utf-8"));
            fos.close();

            // 5.完成提示
            Toast.makeText(this, "已保存!", 0).show();

        } else {
            Toast.makeText(this, "SD卡未挂载!", 0).show();
        }
    }

    public void onClickRead2(View v) throws IOException {
        // 1.检测SD卡挂载
        if (Environment.getExternalStorageState().equals(
                Environment.MEDIA_MOUNTED)) {
            // 2.得到文件路径
            String storageDirPath = Environment.getExternalStorageDirectory()
                    .getAbsolutePath();
            String filePath = storageDirPath + "/zhu/"
                    + et_sd_name.getText().toString();

            // 3.输入流读数据
            FileInputStream fis = new FileInputStream(filePath);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int len = -1;
            while ((len = fis.read(buffer)) != -1) {
                baos.write(buffer, 0, len);
            }
            String content = baos.toString();

            baos.close();
            fis.close();

            // 4.显示
            et_sd_content.setText(content);
        } else {
            Toast.makeText(this, "SD卡未挂载!", 0).show();
        }

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值