积土而为山,积水而为海。——《荀子·儒效》


本讲内容:File文件存储

Context类中提供了一个openFileOutput()方法用于将数据存储到指定的文件中,这个方法接收两个参数,第一个参数是文件名,注意这里指定的文件名不可以包含路径,因为所有的文件都是默认存到/data/data/<packagename>/files/目录下的。第二个参数是文件的操作模式,主要有两种模式可选,MODE_PRIVATE和MODE_APPEND。其中MODE_PRIVATE是默认的操作模式,表示当指定同样文件名的时候,所写入的内容将会覆盖原文件中的内容,而MODE_APPEND则表示如果该文件已存在就往文件里面追加内容,不存在就创建新文件。

openFileOutput()方法返回的是一个FileOutputStream对象,得到这个对象之后就可以使用Java流的方式将数据写入到文件夹中了。


示例一:将一段文本内容保存到文件中

android content uri转化为file android documentfile_Text

然后按下Back键关闭程序,这时我们输入的内容就已经保存到文件中了,打开DDMS的File Explorer来查看一下。可以看到生成了一个data文件。

android content uri转化为file android documentfile_android_02

用记事本打开这个文件

android content uri转化为file android documentfile_android_03

下面是res/layout/activity_main.xml 布局文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <EditText
        android:id="@+id/edit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Type something here" />

</RelativeLayout>



下面是MainActivity.java主界面文件:


public class MainActivity extends Activity {
	private EditText edit;
	
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		edit=(EditText) findViewById(R.id.edit);
	}
	
	//活动销毁之前一定会调用这个方法保存数据
	protected void onDestroy() {
		super.onDestroy();
		String inputText=edit.getText().toString();
		save(inputText);
	}
	
	//将文本内容保存到文件的方法
	private void save(String inputText) {
		FileOutputStream out=null;
		BufferedWriter writer=null;
		
		try {
			out=openFileOutput("data", Context.MODE_APPEND);
			writer=new BufferedWriter(new OutputStreamWriter(out));
			writer.write(inputText);
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			try {
				if(writer!=null){
					writer.close();
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

}



示例二:从文件中读取数据


Context类中还提供了一个openFileInput()方法用于从文件中读取数据。它只接收一个参数,即要读取的文件名,然后系统自动到/data/data/<packagename>/files/目录下去加载这个文件,并返回一个FileInputStream对象,得到这个对象之后再通过Java流的方式就可以将数据读取出来了。

譬如在EditText中输入Hello world,接着按下Back键退出程序,再重新启动程序,这时刚才输入的内容并不会丢失,而是还原到EditText中。

android content uri转化为file android documentfile_文件名_04

下面是MainActivity.java主界面文件:

public class MainActivity extends Activity {
	private EditText edit;
	
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		edit=(EditText) findViewById(R.id.edit);
		String inputText=load();
		//对字符串进行非空判断使用TextUtils.isEmpty()方法,它可以一次性进行两种空值的判断,当传入的字符串等于null或者等于空字符串时
		//这个方法都会返回true
		if(!TextUtils.isEmpty(inputText)){
			edit.setText(inputText);
			//setSelection()方法将输入光标移动到文本的末尾位置以便于继续输入
			edit.setSelection(inputText.length());
			Toast.makeText(this, "Restoring succeeded", Toast.LENGTH_LONG).show();
		}
	}
	
	//从文件中读取数据
	public String load(){
		FileInputStream in=null;
		BufferedReader reader=null;
		//把文件中所有的文本内容全部读取出来并存放在一个StringBuilder对象中
		StringBuilder content=new StringBuilder();
		
		try {
			in=openFileInput("data");
			reader=new BufferedReader(new InputStreamReader(in));
			String line="";
			while((line=reader.readLine())!=null){
				content.append(line);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			if(reader!=null){
				try {
					reader.close();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
		return content.toString();
	}

}




Take your time and enjoy it 要原码的、路过的、学习过的请留个言,顶个呗~~