Android中File存储数据
1、File存储
1.1、openFileOutput与openFileInput
1)、新建布局文件outputinput_layout.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <EditText android:id="@+id/et_input" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入内容" android:lines="3" /> <Button android:id="@+id/btn_save" android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="btnOnClick" android:text="保存内容" /> <Button android:id="@+id/btn_get" android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="btnOnClick" android:text="读取内容" /> <TextView android:id="@+id/tv_show" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout>
2)、新建FileOutputInputDemoActivity
package com.example.iodemo; import java.io.FileInputStream; import java.io.FileOutputStream; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; public class FileOutputInputDemoActivity extends Activity { // 声明组件 private EditText et_input = null; private Button btn_save = null; private Button btn_get = null; private TextView tv_show = null; // 声明文件名称及类型 private String FILENAME = "test.txt"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setContentView(R.layout.outputinput_layout); // 取得组件信息 et_input = (EditText) findViewById(R.id.et_input); btn_save = (Button) findViewById(R.id.btn_save); btn_get = (Button) findViewById(R.id.btn_get); tv_show = (TextView) findViewById(R.id.tv_show); } // 设置单击事件 public void btnOnClick(View view) { switch (view.getId()) { case R.id.btn_save: write(); break; case R.id.btn_get: read(); break; default: break; } } // 写入数据到文件中 public void write() { // 取得EditText中的数据 String content = et_input.getText().toString(); try { // 实例化文件输入流,指定写数据路径 FileOutputStream write = openFileOutput(FILENAME, MODE_WORLD_WRITEABLE); // 声明字节数组,用于把字符串转化成字节数据 byte[] b = content.getBytes(); // 写数据 write.write(b); // 关闭流 write.close(); // 提示保存数据成功 Toast.makeText(this, "保存数据成功", Toast.LENGTH_LONG).show(); } catch (Exception e) { e.printStackTrace(); } } // 从文件中读出数据 public void read() { // 用于把byte数组转化成字符串 String str = null; try { // 实例化文件输入流,指定读数据路径 FileInputStream read = openFileInput(FILENAME); // 声明字节型数组,用于缓冲读取的数据 byte[] b = new byte[1024]; // 定义长度,如果文件中还有数据则继续读 int len = 0; while ((len = read.read(b)) > 0) { str = new String(b);// 把字节数组转化成字符串 } // 关闭流 read.close(); // 把转化后的字符串赋值到TextView中 tv_show.setText(str); } catch (Exception e) { e.printStackTrace(); } } }
3)、运行效果:
1.2、SDCard中的数据读写
1)、声明一个布局文件sdcard_layout.xml,文件中有两个按钮,一个用于保存数据,一个用于读取数据。一个EditText用于接收用户输入数据,一个TextView用于显示读取出来的数据。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <EditText android:id="@+id/et_inputsdcard" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="input something" android:lines="3" /> <Button android:id="@+id/btn_savesdcard" android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="btnOnClick" android:text="保存内容到sdcard" /> <Button android:id="@+id/btn_getsdcard" android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="btnOnClick" android:text="读取sdcard内容" /> <TextView android:id="@+id/tv_showsdcard" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout>
2)、新建SDCardDemoActivity,代码如下
package com.example.iodemo; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import android.app.Activity; import android.os.Bundle; import android.os.Environment; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; public class SDCardDemoActivity extends Activity { // 声明组件 private EditText et_inputsdcard = null; private Button btn_savesdcard = null; private Button btn_getsdcard = null; private TextView tv_showsdcard = null; // 声明文件名称及类型 private String FILENAME = File.separator + "test.txt"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setContentView(R.layout.sdcard_layout); // 取得组件信息 et_inputsdcard = (EditText) findViewById(R.id.et_inputsdcard); btn_savesdcard = (Button) findViewById(R.id.btn_savesdcard); btn_getsdcard = (Button) findViewById(R.id.btn_getsdcard); tv_showsdcard = (TextView) findViewById(R.id.tv_showsdcard); } // 设置单击事件 public void btnOnClick(View view) { switch (view.getId()) { case R.id.btn_savesdcard: writeSDCard(); break; case R.id.btn_getsdcard: readSDCard(); break; default: break; } } // 写入数据到SDCard中 public void writeSDCard() { String str = Environment.getExternalStorageState(); String str1 = Environment.MEDIA_MOUNTED; // 取得EditText中的数据 String content = et_inputsdcard.getText().toString(); if (str.equals(str1)) { // 获取SDCard对应的存储目录 File sdcardDir = Environment.getExternalStorageDirectory(); try { // 实例化文件输入流,指定写数据路径 FileOutputStream write = new FileOutputStream( sdcardDir.getCanonicalPath() + FILENAME); // 声明字节数组,用于把字符串转化成字节数据 byte[] b = content.getBytes(); // 写数据 write.write(b); // 关闭流 write.close(); // 提示保存数据成功 Toast.makeText(this, "保存数据成功", Toast.LENGTH_LONG).show(); } catch (Exception e) { e.printStackTrace(); } } } // 从SDCard中读出数据 public void readSDCard() { // SdCard目录存在 if (Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) { // 获取SDCard对应的存储目录 File file = Environment.getExternalStorageDirectory(); // 用于把byte数据数据转化成String String str = null; try { // 实例化文件输入流,指定读数据路径 FileInputStream read = new FileInputStream( file.getCanonicalPath() + FILENAME); // 声明字节型数组,用于缓冲读取的数据 byte[] b = new byte[1024]; // 定义长度,如果文件中还有数据则继续读 int len = 0; while ((len = read.read(b)) > 0) { str = new String(b);// 把字节数组转化成字符串 } // 关闭流 read.close(); // 把转化后的字符串赋值到TextView中 tv_showsdcard.setText(str); } catch (Exception e) { e.printStackTrace(); } } } }
注意:在运行之前还需要在AndroidManifest.xml中配置相应权限:
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
3)、运行效果:
输入一串字符:提示保存成功
点击取得数据: