Context 提供了两个方法来打开本地应用程序的数据文件夹里的文件I/O流.
- FileInputStream openFileInput (String name): 打开应用程序中的数据文件夹下的name文件对应的输入流.
- FileOutputStream openFileOutput (String name, int mode) : 打开应用程序中的数据文件夹下的name文件对应的输出流.
上面两个方法分别用于打开文件的输入流和输出流, 其中第二个方法的第二个参数指定打开文件的模式,该模式支持如下几种方式.:
- MODE_APPEND:如果文件已经存在,那么将数据写入到现有文件的末尾,而不是覆盖它.
- MODE_PRIVATE :该文件只能被当前程序读写.
- MODE_WORLD_READABLE: 该文件的内容可以被其他程序读取.
- MODE_WORLD_WRITEABLE: 该文件的内容可以被其他程序读, 写.
另外 ,Context还提供了如下几个方法来访问应用程序的数据文件夹:
- getDir(String name, int mode) : 在应用程序的数据文件夹下,获取或创建name对应的子目录.
- File getFilesDir(): 获取该应用程序的数据文件夹的绝对路径.
- String[] fileList() :返回该应用程序的数据文件夹下的全部文件.
- deleteFile(String name) :删除该应用程序的数据文件夹下的指定的文件.
package com.test.filetest;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
/**
* 示范如何读写应用程序数据文件夹内的文件
*/
public class MainActivity extends AppCompatActivity {
Button btnWrite, btnRead;
EditText etWrite;
TextView etRead;
public static final String FILE_NAME = "a.txt";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnWrite = (Button) findViewById(R.id.btn_write);
btnRead = (Button) findViewById(R.id.btn_read);
etRead = (TextView) findViewById(R.id.et_read);
etWrite = (EditText) findViewById(R.id.et_write);
btnWrite.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//将edit1中的内容写入文件中
write(etWrite.getText().toString());
etWrite.setText(""); //将第一个输入框设置为空
}
});
btnRead.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
etRead.setText(read2());
}
});
}
private String read2() {
//打开文件输入流
try {
FileInputStream fis = openFileInput(FILE_NAME);
byte[] bytes = new byte[1024];
int hasRead = 0;
StringBuilder sb = new StringBuilder("");
//读取文件内容
while ((hasRead = fis.read(bytes)) > 0) {
sb.append(new String(bytes,0,hasRead));
}
fis.close();
return sb.toString();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
//写入内容的方法
private void write(String input) {
//以追加的模式打开文件输出流
try {
FileOutputStream fos = openFileOutput(FILE_NAME, MODE_APPEND);
//将文件FileOutputStream包装成 PrintStream
PrintStream ps = new PrintStream(fos);
//输出文件内容
ps.println(input);
ps.close(); //关闭文件输出流
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
布局界面
<?xml version="1.0" encoding="utf-8"?>
<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"
tools:context="com.test.filetest.MainActivity">
<Button
android:id="@+id/btn_write"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:text="写入内容"/>
<EditText
android:id="@+id/et_write"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/btn_write"
android:hint="请输入内容"/>
<Button
android:id="@+id/btn_read"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/btn_write"
android:text="读取内容"/>
<TextView
android:id="@+id/et_read"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ff9"
android:layout_below="@id/et_write"
android:layout_toEndOf="@id/btn_read"
android:layout_toRightOf="@id/btn_write"
android:hint="显示输入内容"/>
</RelativeLayout>