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);
步骤二:配置MainActivity.xml
步骤四:创建文件操作类
步骤五:在MainActivity.java中调用
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);
}
else
break;
}
byte[] bdata=farr.toByteArray();
return new String(bdata);
}
/*
* 存储文件到存储卡上
*/
public void SaveFileOnSdCard(String fname,String Content) throws Exception{
//这里用Environment.getExternalStorageDirectory()来获取sdcard的目录,以兼容早期的版本,早期版本sdcard位置为/sdcard,新的为/mnt/sdcard
File 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;
@Override
protected 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{
@Override
public 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 block
e.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){
}
}
}
}