Android学习笔记--文件的读写

来源:互联网 发布:java如何获取访问者ip 编辑:程序博客网 时间:2024/05/02 02:01
Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中,可以使用Context.MODE_APPEND
Context.MODE_APPEND:模式会检查文件是否存在,存在应往文件中追加内容,否则就创建新文件。
Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其它应用程序是否有权限读写该文件;
MODE_WORLD_READ_READABLE:表示当前文件可以被其它应用读取;
MODE_WORLD_WRITEABLE:表示当前文件可以被其它应用写入;
如果希望文件被其它应用读和写,可以传入
openFileOutput("file.txt",Context.MODE_WORLD_READABLE+Context.MODE_WORLD_WRITEABLE);

android有一套自己的安全模型,当应用程序(.apk)在安装时系统就会分配给他一个userid,当该应用要去访问其它资源比如文件的时候,就需要userid匹配,任何应用创建的文件,sharedpreferences,数据库都应该是私有的,位于/data/data<package_name>/files,其它程序无法访问,除非在创建时指定了Context.MODE_READABLE或者Context.MODE_WORLD_WRITEABLE,其它程序才能正确访问。

Activity还提供了getCacheDir()和getFilesDir()方法:
getCacheDir()方法用于获取/data/data/<packagename>/cache目录
getFilesDir()方法用于获取/data/data/<packagename>/files目录


步骤一:配置strings.xml

<?xml version="1.0" encoding="utf-8"?><resources>    <string name="app_name">文件的保存与读取</string>    <string name="fileNameLabel">文件名</string><string name="fileContentLabel">文件内容</string><string name="btntext">保存</string><string name="success">保存成功</string><string name="fail">保存失败</string>
<span style="white-space:pre"></span><string name="sdcarderr">SD卡不存在或者写保护</string></resources>

步骤二:配置MainActivity.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:orientation="vertical"    android:layout_height="match_parent"    tools:context="${relativePackage}.${activityClass}" >    <TextView        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="@string/fileNameLabel" />    <EditText         android:layout_width="match_parent"        android:layout_height="wrap_content"        android:id="@+id/fileName"        />    <TextView         android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="@string/fileContentLabel"        />    <EditText         android:layout_width="match_parent"        android:layout_height="wrap_content"        android:minLines="3"        android:id="@+id/fileContent"        />    <Button         android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="@string/btntext"        android:id="@+id/btnsave"        /></LinearLayout>

步骤四:创建文件操作类

package com.example.files;import java.io.*;import android.content.Context;public class FileService {private Context context;public FileService(Context context){this.context=context;}/* * 保存文件 * @param fname:要保存成的文件名,不带路径 * @param content:要保存的文件内容 */public void save(String fname, String content) throws Exception {FileOutputStream ostream=context.openFileOutput(fname, context.MODE_APPEND);byte[] buffer=content.getBytes();ostream.write(buffer);ostream.close();}/* * 读取文件内容 * @param fname:要读取的文件名 */public String ReadFile(String fname) throws Exception{FileInputStream instream=context.openFileInput(fname);ByteArrayOutputStream farr=new ByteArrayOutputStream();byte[] buffer=new byte[1024];int len=0;while(true){len=instream.read(buffer);if (len>-1){farr.write(buffer,0,len);}elsebreak;}byte[] bdata=farr.toByteArray();return new String(bdata);}/* * 存储文件到存储卡上 */public void SaveFileOnSdCard(String fname,String Content) throws Exception{//这里用Environment.getExternalStorageDirectory()来获取sdcard的目录,以兼容早期的版本,早期版本sdcard位置为/sdcard,新的为/mnt/sdcardFile file=new File(Environment.getExternalStorageDirectory(),fname);//写在内存卡上不能用MODE,因为不支持FileOutputStream outstream=new FileOutputStream(file);outstream.write(Content.getBytes());outstream.close();}
}

步骤五:在MainActivity.java中调用

package com.example.filestreamreadandwrite;import com.example.files.FileService;import android.app.Activity;import android.os.Bundle;import android.view.*;import android.widget.*;public class MainActivity extends Activity {private EditText fileName;private EditText fileContent;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button button=(Button)this.findViewById(R.id.btnsave);fileName=(EditText)this.findViewById(R.id.fileName);fileContent=(EditText)this.findViewById(R.id.fileContent);button.setOnClickListener(new BtnClickListen());}private final class BtnClickListen implements View.OnClickListener{@Overridepublic void onClick(View v) {String fname=fileName.getText().toString();String content=fileContent.getText().toString();FileService fs=new FileService(getApplicationContext());/*以下方式是存手机本身的存储器上的try {fs.save(fname,content);Toast.makeText(getApplicationContext(), R.string.success, Toast.LENGTH_LONG).show();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();Toast.makeText(getApplicationContext(), R.string.success+e.getMessage(), Toast.LENGTH_LONG).show();}*///以下方式是存在内存卡中的try{//先判断是否存在sdcard,并且sdcard是否可读写if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){fs.SaveFileOnSdCard(fname, content);Toast.makeText(getApplicationContext(), R.string.success, Toast.LENGTH_LONG).show();}else{Toast.makeText(getApplicationContext(), R.string.sdcarderr, Toast.LENGTH_LONG).show();}}catch(Exception ex){}}}}


0 0
原创粉丝点击