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

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);
			}
			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){
				
			}
			
		}
		
	}
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值