android SD卡学习3-读写文件

    中所周知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" />

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值