zoukankan      html  css  js  c++  java
  • [android] 保存文件到SD卡

    /****************2016年5月4日 更新*****************************/

    知乎:为什么很多Android应用要把文件写到/sdcard目录下而不是写到/data/data/目录下?

    Android本身提供了/data/data/com.companyname.appname/这个路径供广大app存放configuration以及user data之类的东西,为什么很多App要把配置文件甚至log写到/sdcard目录下面?刚试了一下,禁用掉QQ的”修改手机存储空间“权限,手机QQ连发图片都发不出去了。。。

    ---

    想问一下,/data/data/com.companyname.appname/目录里的数据有什么限制么?比如空间大小限制?写到/sdcard里,又有什么优势么?

    祈雨蓝:

    没有限制 另外对应着 SD卡上也有一个文件夹 /Android/data/包名,这个文件夹也是用来给程序放应用数据的,此文件夹读写在4.4及以后不需要外置储存区读写权限。

    这两个文件夹区别在于 data 分区有权限控制,除非应用自己同意,否则其他应用无法读取内部的数据,而sdcard/Android下的文件只要有外置空间读取权限就可以读取。所以data下一般放私密信息,而sdcard/Android 下放可以公开的缓存数据。

    至于直接在sdcard下随便建文件夹的

    就是开发人员素质低 或者 产品用耍流氓的方式筛选用户

    处理方式:

    卸载+一星

    /*********************************************************************/

    手机里面有两块空间,手机内部空间(/data/data/)和外部存储空间(/mnt/sdcard/ 或者直接/sdcard/

    与上面的代码基本一样,只是在new File(“/sdcard/文件名”),此时会报错,primission denied

    Caused by: libcore.io.ErrnoException: open failed: EACCES (Permission denied)

    在清单文件中添加权限 android.primission.WRITE_EXTERNAL_STORAGE

    4.0以前的系统读sd卡不需要权限,有很大的安全隐患,4.0以后的有权限,在设置里面开发者选项,对sd卡进行读写保护。添加权限 android.primission.READ_EXTERNAL_STORAGE

    判断sd卡是否存在调用Evevironment.getExternalStorageState(),得到结果与Environment.MEDIA_MOUNTED比较,sd卡挂载Environment.getExternalStorageDirectory()可以得到sd卡根路径

    业务类修改:

    package com.tsh.savefile.service;
    
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.InputStreamReader;
    import java.util.HashMap;
    import java.util.Map;
    
    import android.content.Context;
    import android.os.Environment;
    import android.widget.Toast;
    
    public class LoginService {
        /**
         * 保存用户名和方法的业务方法
         * @param context 上下文
         * @param username 用户名
         * @param password 方法
         * @return
         */
        public static boolean saveUserInfo(Context context,String username,String password){
            if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
                Toast.makeText(context, "sd卡不可用", Toast.LENGTH_SHORT).show();
                return false;
            }
            File file=new File(Environment.getExternalStorageDirectory(),"/info1.txt");
            try {
                FileOutputStream fos=new FileOutputStream(file);
                String info=username+"##"+password;
                fos.write(info.getBytes());
                fos.close();
                return true;
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
            
        }
        /**
         * 读取
         * @return
         */
        public static Map<String,String> getSavedUserInfo(Context context){
            File file=new File(Environment.getExternalStorageDirectory(),"/info1.txt");
            try {
                FileInputStream fis=new FileInputStream(file);
                BufferedReader br=new BufferedReader(new InputStreamReader(fis));
                String[] res=br.readLine().split("##");
                Map<String, String> map=new HashMap<String,String>();
                map.put("username", res[0]);
                map.put("password", res[1]);
                return map;
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
            
        }
    }
  • 相关阅读:
    php 随机红包算法
    mysql window系统备份远程数据库到本地
    程序员 面试题【前端,java,php】
    PDMan 数据库建模工具
    数据结构之更多字符串的内容
    数据结构之参考-对象与参考
    数据结构之序列
    excel的宏与VBA入门——代码调试
    DataWorks使用小结(二)——功能面板使用指南
    DataWorks使用小结(一)——概述
  • 原文地址:https://www.cnblogs.com/taoshihan/p/5229183.html
Copyright © 2011-2022 走看看