今天学习Android第二种存储方式——文件存储_文本文件
Files
它通过 FileInputStream 和 FileOutputStream 对文件进行操作。接下来几篇将讲述如何使用Files 数据存储。
什么是 Files 数据存储
- File 就是把需要保存的东西通过文件的形式讯录下来,当需要这些数据时,通过读取这个文件来获取这些数据。因为 Android 采用了 Linux 核心,所以在Android 系统中,文件也是Linux 的形式。
- Android 中可以在设备本身的的存储或者外接的存储设备中创建用于保存数据的文件。同时,在默认状态下,文件是不能在不同的程序间共享的。
- /**
* 输出流OutputStream是从程序中向外输出,比如程序生成文件到指定目录。
* 输入流InputStream是从外面向程序输入,比如从指定目录下文件读取内容或者从控制台手动输入内容到程序中显示。
* 输入流和输出流可以一起使用,比如用输入流从目录读取文件内容,在用输出流把读取的内容输出到指定目录
*
* IO流输入/输出文件的流程:
* 1.使用File类定义一个要操作的文件
* 2.使用字节流或字符流的子类为父类进行实例化,因为四个IO流的操作类都是抽象类
* 3.完成输入/输出功能
* 4.关闭流
*/
使用OutputStream完成输出文件到手机内存中的操作
public class MyFileOperateDemo extends Activity {
private static final String FILENAME = "mldn.txt"; //设置文件名称
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main);
/**
* 使用OutputStream完成输出文件到手机内存中的操作
*/
FileOutputStream output = null; //接收文件输出对象
try {
output = super.openFileOutput(FILENAME, Activity.MODE_PRIVATE);//取得输出流
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
PrintStream out = new PrintStream(output); //输出内容使用 PrintStream 打印流很方便
out.println("姓名:李兴华;");
out.println("年龄:30;");
out.println("地址:北京魔乐科技软件学院;");
out.close(); //资源一定要关闭
}
}
查看 Files 产生的文件
上篇preferences 存储数据时,文件保存在shared_prefs文件夹下,如果我们在 Files产生文件的时候没有为其指定绝对路径,那么系统就会在 shared_prefs 相同的目录中产生一个名为files 的文件夹,里面就有我们写入的数据。如图:
使用InputStream完成从手机内存中读取文件的操作
XML布局:
<LinearLayout 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"
android:orientation="vertical"
tools:context=".MyFileOperateDemo" >
<TextView
android:id="@+id/msg"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="22sp" />
</LinearLayout>
Java代码:
public class MyFileOperateDemo extends Activity {
private static final String FILENAME = "mldn.txt"; //设置文件名称
private TextView msg = null;//文本组件
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main);
this.msg=(TextView)super.findViewById(R.id.msg);
/**
*使用InputStream完成从手机内存中读取文件的操作
*/
FileInputStream input = null; //接收文件输入对象
try {
input = super.openFileInput(FILENAME);//取得输入流
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
Scanner scan = new Scanner(input);//输入使用Scanner
while(scan.hasNext()){
this.msg.append(scan.next()+"\n");
}
scan.close();
}
}
读取结果
使用OutputStream完成输出文件到sdcard中的操作(操作SD卡加权限)
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Java代码:
public class MyFileOperateDemo extends Activity {
private static final String FILENAME = "mymldn.txt"; //设置文件名称
private static final String DIR = "mldndata";//操作文件夹的名称
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main);
/**
* 使用OutputStream完成输出文件到sdcard中的操作(操作SD卡加权限)
*/
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){//判断sdcard是否存在
System.out.println("*** "+Environment.getExternalStorageDirectory());//输出为/mnt/sdcard
File file = new File(Environment.getExternalStorageDirectory()+ File.separator+DIR+File.separator+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 (FileNotFoundException e) {
e.printStackTrace();
}
finally{//一定要关闭流
if(out!=null){
out.close();
}
}
}
else{
Toast.makeText(this, "保存失败,SD卡不存在!", Toast.LENGTH_LONG).show();
}
}
}
查看 Files 产生的文件
使用InputStream完成从sdcard中读取文件的操作
XML布局:
<LinearLayout 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"
android:orientation="vertical"
tools:context=".MyFileOperateDemo" >
<TextView
android:id="@+id/msg"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="22sp" />
</LinearLayout>
Java代码:
public class MyFileOperateDemo extends Activity {
private TextView msg = null;//文本组件
private static final String FILENAME = "mymldn.txt"; //设置文件名称
private static final String DIR = "mldndata";//操作文件夹的名称
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main);
this.msg=(TextView)super.findViewById(R.id.msg);
/**
* 使用InputStream完成从sdcard中读取文件的操作
*/
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){//判断sdcard是否存在
System.out.println("*** "+Environment.getExternalStorageDirectory());//输出为/mnt/sdcard
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 (FileNotFoundException e) {
e.printStackTrace();
}
finally{//一定要关闭流
if(scan!=null){
scan.close();
}
}
}
else{
Toast.makeText(this, "读取失败,SD卡不存在!", Toast.LENGTH_LONG).show();
}
}
}
读取结果: