1、Activity提供了openFileOutput()方法可以用于把数据输出到文件中,具体的实现过程与在J2SE环境中保存数据到文件中是一样的。
package com.example.service; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import android.content.Context; public class FileService { /** * 上下文对象 */ private Context context; public FileService(Context context) { super(); this.context = context; } /** * 保存文件 * @param filename 文件名称 * @param content 文件内容 * @throws Exception */ public void save(String filename,String content) throws Exception{ //私有操作模式:创建出来的文件只能被本应用访问,其他应用无法访问,另外采用私有模式创建的文件,写入的内容会覆盖原内容。 //私有操作特点:1、其他应用无法访问;2、内容会覆盖原内容。 FileOutputStream fos = context.openFileOutput(filename, Context.MODE_PRIVATE); fos.write(content.getBytes()); fos.close(); } /** * 读取文件内容 * @param filename 文件名称 * @return * @throws Exception */ public String read(String filename) throws Exception{ FileInputStream fis=context.openFileInput(filename); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); byte[] buf = new byte[1024]; int len=0; while((len=fis.read(buf))!=-1){ //把读取的数据写入到内存中 outputStream.write(buf,0,len); } outputStream.close(); fis.close(); byte[] data = outputStream.toByteArray(); return new String(data); } }
2、查看文件和四种操作模式:
openFileOutput()方法的第一参数用于指定文件名称,不能包含路径分隔符“/” ,如果文件不存在,Android 会自动创建它。创建的文件保存 在/data/data/<package name>/files目录,如: /data/data/com.example.service/files/1.txt ,通过点击Eclipse菜单“Window”-“Show View”-“Other”,在对话窗口中展开android文件夹,选择下面的File Explorer视图,然后在File Explorer视图中展开/data/data/<package name>/files目录就可以看到该文件。
openFileOutput()方法的第二参数用于指定操作模式,有四种模式,分别为:
Context.MODE_PRIVATE = 0
Context.MODE_APPEND = 32768
Context.MODE_WORLD_READABLE = 1
Context.MODE_WORLD_WRITEABLE = 2
Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中。可以使用Context.MODE_APPEND
Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件。
MODE_WORLD_READABLE:表示当前文件可以被其他应用读取;
MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。
如果希望文件被其他应用读和写,可以传入:openFileOutput("itcast.txt", Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE);
android有一套自己的安全模型,当应用程序(.apk)在安装时系统就会分配给他一个userid,当该应用要去访问其他资源比如文件的时候,就需要userid匹配。默认情况下,任何应用创建的文件,sharedpreferences,数据库都应该是私有的(位于/data/data/<package name>/files),其他程序无法访问。除非在创建时指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE ,只有这样其他程序才能正确访问。
3、读取文件:
如果要打开存放在/data/data/<package name>/files目录应用私有的文件,可以使用Activity提供openFileInput()方法或者直接使用文件的绝对路径:
File file = new File("/data/data/com.example.service/files/itcast.txt"); FileInputStream inStream = new FileInputStream(file); Log.i("FileTest", readInStream(inStream)); //注意:上面文件路径中的“com.example.service”为应用所在包,当你在编写代码时应替换为你自己应用使用的包。
4、获取目录
Activity还提供了getCacheDir()和getFilesDir()方法:
getCacheDir()方法用于获取/data/data/<package name>/cache目录
getFilesDir()方法用于获取/data/data/<package name>/files目录
5、Activity类读取文件代码:
package com.example.fileoperator; import com.example.service.FileService; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends Activity { private EditText filename; private EditText filecontent; private Button btnSave; private Button btnRead; private TextView tvContent; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); filename = (EditText) this.findViewById(R.id.filename); filecontent = (EditText) this.findViewById(R.id.filecontent); tvContent=(TextView)this.findViewById(R.id.readFileContent); tvContent.setText(""); btnSave = (Button) this.findViewById(R.id.btnSave); //保存文件 btnSave.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { String nameString = filename.getText().toString(); String contentString=filecontent.getText().toString(); FileService fs = new FileService(MainActivity.this); try { fs.save(nameString, contentString); Toast.makeText(MainActivity.this, R.string.success, Toast.LENGTH_LONG).show(); } catch (Exception e) { e.printStackTrace(); Toast.makeText(MainActivity.this, R.string.fail, Toast.LENGTH_LONG).show(); } } }); //读取文件内容 btnRead = (Button) this.findViewById(R.id.btnRead); btnRead.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { String nameString = filename.getText().toString(); FileService fs = new FileService(MainActivity.this); try { String content =fs.read(nameString); tvContent.setText(content); } catch (Exception e) { e.printStackTrace(); Toast.makeText(MainActivity.this,"读取失败", Toast.LENGTH_LONG).show(); } } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } }