/****************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;
} }
}

[android] 保存文件到SD卡的更多相关文章

  1. android保存文件到SD卡中

    想把文件保存到SD卡中,一定要知道SD卡的路径,有人说可以用File explore来查看,这种方法不太好,因为随着android版本的升级,SD卡的路径可能会发生改变.在1.6的时候SD的路径是/s ...

  2. 无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)

    1.android下junit测试框架配置 单元测试需要在手机中进行安装测试 (1).在清单文件中manifest节点下配置如下节点 <instrumentation android:name= ...

  3. android 写文件到sd卡问题小记

    android 写文件到sd卡问题小记 事情是这样子的.... 这天我开始编写项目调试工具,高大上不?-----其实就是记录实时网络请求和崩溃日志相关等的小工具(此处一个会心的微笑). 然后我是这样写 ...

  4. Android下载文件到SD卡

    HttpURLConnection 上传方式: 尝试理解这两种流的区别: InputStreamReader 的读取方式: //创建一个URL对象 URL url = new URL(urlStrin ...

  5. Android(java)学习笔记182:保存数据到SD卡 (附加:保存数据到内存)

    1. 如果我们要想读写数据到SD卡中,首先必须知道SD的路径: File file = new File(Environment.getExternalStorageDirectory()," ...

  6. Android(java)学习笔记125:保存数据到SD卡 (附加:保存数据到内存)

    1. 如果我们要想读写数据到SD卡中,首先必须知道SD的路径: File file = new File(Environment.getExternalStorageDirectory()," ...

  7. android之写文件到sd卡

    1.main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:a ...

  8. Android入门开发之SD卡读写操作(转)

    SD卡的读写是我们在开发android 应用程序过程中最常见的操作.下面介绍SD卡的读写操作方式: 1. 获取SD卡的根目录 String  sdCardRoot = Environment.getE ...

  9. android复制数据库到SD卡(网上搜集,未经验证)

    android中使用sqlite.复制assets下的数据库到SD卡.支持大于1M的文件 如果使用SD卡,需要在AndroidManifest.xml中设置权限 <uses-permission ...

随机推荐

  1. display:inline-block; 在css中是什么意思?

    inline-block主要的用处是用来处理行内非替换元素的高宽问题的!行内非替换元素,比如span.a等标签,正常情况下士不能设置宽高的,加上该属性之后,就可以触发让这类标签表现得如块级元素一样,可 ...

  2. 【转载】ARCHIVE_LAG_TARGET参数的作用(定时切换redo)

    (一)  设置archive_lag_target参数1.      一旦设置了archive_lag_target初始化参数,数据库将会周期性的检查实例的当前重做日志.如果遇到下列情况,实例将会切换 ...

  3. cf Round#273 Div.2

    题目链接,点击一下 Round#273 Div.2 ================== problem A Initial Bet ================== 很简单,打了两三场的cf第一 ...

  4. MySQL优化技巧

    目录 MySQL的特点 数据类型优化 整型类型 小数类型 字符串类型 时间类型 主键类型的选择 特殊类型的数据 索引优化 一个使用Hash值创建索引的技巧 前缀索引 多列索引 聚簇索引 覆盖索引 重复 ...

  5. Javascript高级编程学习笔记(30)—— BOM(4)navigator对象

    window对象作为浏览器的全局对象.location对象保存了页面的url信息 那么navigator对象又有什么作用呢? navigator对象 该对象最早由 Netspace Navigator ...

  6. 使用HOG特征+BP神经网络进行车标识别

    先挖个坑,快期末考试了,有空填上w 好了,今晚刚好有点闲,就把坑填上吧. //-------------------------------开篇---------------------------- ...

  7. mysql命令行创建表,插入表数据

    create table t_hero( id int unsigned auto_increment primary key, name varchar(10) unique not null, a ...

  8. IntelliJ IDEA 常用快捷键使用说明

    Ctrl + / 可以实现单行注释的快速添加和取消.xml和html注释也能操作. Ctrl + Y 删除选中的代码,或者光标所在行,同时删除代码所占的空间. Ctrl + Alt + V 快速抽取变 ...

  9. MySQL分布式事物(XA事物)的使用

    有时一个系统的数据 放在不同的库之中.如果用普通的事物 一个分支库提交成功了,另外一个分支库提交失败了, 这候 两个库没有同步的成功或者失败.会导致系统数据的不完整. 对于处理这种情况 MySQL有了 ...

  10. rabbitmq在ios中实战采坑

    1. rabbitmq在ios中实战采坑 1.1. 问题 ios使用rabbitmq连接,没过多久就断开,并报错.且用android做相同的步骤并不会报错,错误如下 Received connecti ...