对于文件的存储操作,在Android中有两种形式:
1.直接利用Activity提供的文件操作方法。此类操作的所有文件路径只能是“\data\data\<package name>\files\文件名称".
2.利用Java IO 操作流执行操作。此类操作的文件可以是任意路径(包括sdcard)下,但是需要为其操作授权。
一、利用Activity类操作数据文件
Activity类对文件操作的支持
方法 | 普通 | 描述 |
public FileInputStream openFileInput(String name) | 普通 | 设置要打开的文件输入流 |
public FileOutputStream openFileOutput(String name,int mode) | 普通 | 设置要打开的文件输出流,指定操作的模式,可以是0,MODE_APPEND、MOSE_PRIVATE、 MODE_WORLD_READABLE、MODE_WORLD_WRITEABLE |
这里要注意:使用openFileInput()和openFileOutput()方法进行写入\读取写入操作时,接收的文件名称中不能包括任何的分隔符(\),只能写文件名称,而文件会默认保存在”data\data\<package name>\files\"目录中。
下面通过openFileOutput()方法演示一个输出的操作
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
import android.app.Activity;
import android.os.Bundle;
public class FileOperate extends Activity {
private static final String FILENAME = "mldn.txt" ; // 设置文件名称
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main);
FileOutputStream output = null ; // 接收文件输出对象
try {
output = super.openFileOutput(FILENAME, Activity.MODE_PRIVATE) ;
} catch (FileNotFoundException e) {
e.printStackTrace();
}
PrintStream out = new PrintStream(output) ; // 输出方便
out.println("姓名:李兴华;") ;
out.println("年龄:30;") ;
out.close() ; // 资源一定要关闭
}
}
下面利用openFileInput()方法实现一个文件读取操作(布局文件仅一个TextView,此处不加赘述)
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Scanner;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class FileOperate extends Activity {
private static final String FILENAME = "mldn.txt" ; // 设置文件名称
private TextView msg = null ; // 文本组件
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main);
this.msg = (TextView) super.findViewById(R.id.msg) ;
FileInputStream input = null ;
try {
input = super.openFileInput(FILENAME) ; // 取得输入流
} catch (FileNotFoundException e) {
e.printStackTrace();
}
Scanner scan = new Scanner(input) ;
while(scan.hasNext()) {
this.msg.append(scan.next() + "\n") ;
}
scan.close() ;//关闭输入流
}
}
二、利用IO流操作文件
向sdcard上保存文件
import java.io.File;
import java.io.FileOutputStream;
import java.io.PrintStream;
import android.app.Activity;
import android.os.Bundle;
public class FileOperate extends Activity {
private static final String FILENAME = "/mnt/sdcard/mldndata/mymldn.txt" ; // 设置文件名称
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main);
File file = new File(FILENAME) ; // 定义要操作的文件
if(!file.getParentFile().exists()) {
file.getParentFile().mkdirs() ; // 创建父文件夹路径
}
PrintStream out = null;
try {
out = new PrintStream(new FileOutputStream(file));
out.println("北京魔乐科技软件学院(MLDN,www.MLDNJAVA.cn),讲师:李兴华");
} catch (Exception e) {
e.printStackTrace() ;
} finally { // 一定要关闭流
if(out != null) {
out.close() ;
}
}
}
}
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
读取文件内容:
import java.io.File;
import java.io.FileInputStream;
import java.util.Scanner;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.widget.TextView;
import android.widget.Toast;
public class FileOperate extends Activity {
private static final String FILENAME = "mymldn.txt" ; // 设置文件名称
private static final String DIR = "mldndata" ; // 操作文件夹的名称
private TextView msg = null ;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main);
this.msg = (TextView) super.findViewById(R.id.msg) ;
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
File file = new File(Environment.getExternalStorageDirectory()
+ File.separator + DIR + File.separator + FILENAME); // 定义要操作的文件
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs(); // 创建父文件夹路径
}
Scanner scan = null ;
try {
scan = new Scanner(new FileInputStream(file)) ;
while(scan.hasNext()) {
this.msg.append(scan.next() + "\n") ;
}
} catch (Exception e) {
e.printStackTrace();
} finally { // 一定要关闭流
if (scan != null) {
scan.close();
}
}
} else {
Toast.makeText(this, "保存失败,SD卡不存在!", Toast.LENGTH_LONG).show() ;
}
}
}