中所周知android有一套自己的安全模型, 具体可参见android开发文档 。。当应用程序(.apk)在安装时就会分配一个userid,当该应用要去访问其他资源比如文件的时候,就需要userid匹配。默认情况下 ,任何应用创建的文件,数据库, sharedpreferences都应该是私有的(位于/data/data/your_project/files/),其余程序无法访问。除非在创建时指明是MODE_WORLD_READABLE 或者 MODE_WORLD_WRITEABLE,只要这样其余程序才能正确访问。

因为有这种安全上保障,进程打开文件时android要求检查进程的user id。所以不能直接用java的api来打开,因为java的io函数没有提这个机制 。

//无法用java的api直接打开程序私有的数据 ,默认路径为/data/data/your_project/files/
FileReader file = new FileReader("android.txt");

这里特别强调私有数据!言外之意是如果某个文件或者数据不是程序私有的,既访问它时无须经过android的权限检查,那么还是可以用java的io api来直接访问的。所谓的非私有数据是只放在sdcard上的文件或者数据,

//可以用java的io api来直接打开sdcard上文件。

FileReader file = new FileReader("/sdcard/android.txt");

如果要打开程序自己私有的文件和数据,那必须使用Activity提供openFileOutput和openFileInput方法。

//创建程序私有的文件,由于权限方面的要求,必须使用activity提供的方法

FileOutputStream os = this.openFileOutput("android.txt", MODE_PRIVATE);
OutputStreamWriter outWriter = new OutputStreamWriter (os);

//读取程序私有的文件,由于权限方面的要求,必须使用activity提供的方法

FileInputStream os =this.openFileInput("android.txt");
InputStreamReader inReader = new InputStreamReader(os);

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lijiecong/archive/2009/11/26/4881362.aspx

在介绍如何在Android平台下进行文件的读取之前,有必要了解Android平台下的数据存储规则。在其他的操作系统如Windows 平台下,应用程序可以自由地或者在特定的访问权限基础上访问或修改其他应用程序名下的文件等资源,而在Android平台下,一个应用程序中所有的数据都是私有的。

当应用程序被安装到系统中后,其所在的包会有一个文件夹用于存放自己的数据,只有这个应用程序才有对这个文件夹的写入权限,这个私有的文件夹位于Android系统的/data/data/<应用程序包名>目录下,其他的应用程序都无法再这个文件夹中写入数据。除了存放私有的数据文件夹外,应用程序也具有SD卡的写入权限。

使用文件I/O 方法可以直接往手机中存储数据,默认情况下这些文件不可以被其他的应用程序访问。Android平台支持 java平台下的 文件I/O操作, 主要使用FileInputStream 和 FileOutputStream 这两个类来实现文件的存储与读取。获取这两个类对象的方式有两种。
一:第一种方式就是像Java平台下的实现方式一样通过构造器直接创建,如果需要向打开的文件末尾写入数据,可以通过使用构造器FileOutputStream(File file, boolean append)将 append设置为true来实现。不过需要注意的是采用这种方式获得FileOutputStream 对象时如果文件不存在或不可写入时,会抛出 FileNotFoundException 异常。

二:第二种获取 FileInputStream 和 FileOutputStream 对象的方式是调用 Context.openFileInput 和 Context.openFileOutput两个方法来创建。除了这两个方法外,Context对象还提供了其他几个用于对文件操作的方法,如下所示


Context对象中文操作的API及说明
方法名 说明
openFileInput(String filename) 打开应用程序私有目录下的的指定私有文件以读入数据,返回一个FileInputStream 对象

openFileOutput 打开应用程序私有目录下的的指定私有文件以写入数据,返回一个FileOutputStream 对象,如果文件不存在就创建这个文件。

fileList() 搜索应用程序私有文件夹下的私有文件,返回所有文件名的String数组

deleteFile(String fileName) 删除指定文件名的文件,成功返回true,失败返回false


在使用openFileOutput方法打开文件以写入数据时,需要指定打开模式。默认为零,即MODE_PRIVATE。不同的模式对应的的含义如下:

openFileOutput方法打开文件时的模式

常量 含义
MODE_PRIVATE 默认模式,文件只可以被调用该方法的应用程序访问

MODE_APPEND 如果文件已存在就向该文件的末尾继续写入数据,而不是覆盖原来的数据。

MODE_WORLD_READABLE 赋予所有的应用程序对该文件读的权限。

MODE_WORLD_WRITEABLE 赋予所有的应用程序对该文件写的权限。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/hustpzb/archive/2011/03/04/6223328.aspx

查看文章 Android SD 读取文件内容 2011年03月21日 星期一 00:15

业务层

public class FileService {

/**
* 保存数据
* @param outStream
* @param content
* @throws Exception
*/
public static void save(OutputStream outStream, String content)
throws Exception {
outStream.write(content.getBytes());
outStream.close();
}
/**
* 读取数据
* @param inStream
* @return 结果
* @throws Exception
*/
public static String read(InputStream inStream) throws Exception {
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = -1;
//=-1已读到文件末尾
while ((len = inStream.read(buffer)) != -1) {
outStream.write(buffer, 0, len);
}
byte[] data = outStream.toByteArray();
outStream.close();
inStream.close();
return new String (data);
}
}

Activity

public class DataActivity extends Activity {
private static final String TGA = "DataActivity";
private EditText filenameEdit;
private EditText contentEdit;
private TextView resultView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//获取控件
filenameEdit = (EditText) this.findViewById(R.id.filename);
contentEdit = (EditText) this.findViewById(R.id.content);
resultView = (TextView) this.findViewById(R.id.result);
Button btnSave = (Button) this.findViewById(R.id.btnSave);
Button btnRead = (Button) this.findViewById(R.id.btnRead);
//处理按钮事件
btnSave.setOnClickListener(listener);
btnRead.setOnClickListener(listener);
}


/**
* 事件处理
*/
private View.OnClickListener listener = new View.OnClickListener() {
@Override
public void onClick(View v) {
Button button =(Button)v;
int resId = R.string.success;
String filename = filenameEdit.getText().toString();
//方式一
File file = new File(Environment.getExternalStorageDirectory(),filename);//获取SDCard目录
//方式二 File file = new File("/sdcard/" + filename);
switch (button.getId()) {
//保存
case R.id.btnSave:
//如果SD卡存在就进行读写
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
String content = contentEdit.getText().toString();
try {
//OutputStream outStream = DataActivity.this.openFileOutput(filename,Context.MODE_APPEND); //存入手机内存
FileOutputStream outStream = new FileOutputStream(file);
FileService.save(outStream, content);
} catch (Exception e) {
Log.e(TGA, e.toString());
resId = R.string.error;
Toast.makeText(DataActivity.this, resId, Toast.LENGTH_LONG).show();
}
Toast.makeText(DataActivity.this, resId, Toast.LENGTH_LONG).show();
}else{
Toast.makeText(DataActivity.this, "SD卡不存在或没有读写权限!", Toast.LENGTH_LONG).show();
}
break;

case R.id.btnRead: //读取
try{
//InputStream inStream = DataActivity.this.openFileInput(filename);
InputStream inStream = new FileInputStream(file);
String info = FileService.read(inStream);
resultView.setText(info);
}catch(Exception e){
Log.e(TGA, e.toString());
Toast.makeText(DataActivity.this, "读取失败", Toast.LENGTH_LONG).show();
}
break;
}
}
};
}

要操作SD卡要在AndroidManifest.xml文件中加入 SDCrad权限

<!-- 在SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

更多相关文章

  1. Android中数据存储——ContentProvider存储数据
  2. Android(安卓)ListView中点击单行实现RadioButton的单选功能,自定
  3. android aidl摘要
  4. Android启动界面优化技巧-Splash Screens的正确方式
  5. 无废话Android之常见adb指令、电话拨号器、点击事件的4种写法、
  6. android 识别U盘以及读写文件
  7. mybatisplus的坑 insert标签insert into select无参数问题的解决
  8. python起点网月票榜字体反爬案例
  9. NPM 和webpack 的基础使用

随机推荐

  1. Android压缩
  2. 代码中如何设置TextView为不可见
  3. Android判断当前线程是否是主线程的方法
  4. Android(安卓)OpenGL ES(八)----纹理编程
  5. android-passwordsafe - Android Passwor
  6. Android判断横屏竖屏代码
  7. Android Studio v1.0 项目无法运行
  8. Android Unable to find instrumentation
  9. Android使用Aidl实现跨进程通信
  10. android 静默安装 卸载 资料汇总