所谓的外部存储External Storage就是将数据文件保存在SD卡上。
1.但是在保存数据时需要先对SD卡的状态进行判断。
使用Environment.getExternalStorageState()可以SD卡的运行状态
分别有一下的状态
MEDIA_UNKNOWN
, MEDIA_REMOVED
, MEDIA_UNMOUNTED
, MEDIA_CHECKING
, MEDIA_NOFS
, MEDIA_MOUNTED
, MEDIA_MOUNTED_READ_ONLY
, MEDIA_SHARED
,MEDIA_BAD_REMOVAL
,
or MEDIA_UNMOUNTABLE
.
我们一般使用的是
MEDIA_MOUNTED可操作
2.获取SD卡的跟目录
这里可以使用Environment.getExternalStorageDirectory()方法来获取
3.判断路径是否存在,并进行相应操作
使用file.getParentFile().exists()来判断文件路径是否存在,如果不存在就创建
file.getParentFile().mkdir();
4.使用outputstream,Writer,printstream等方法进行数据的写入操作
5.文件的读取方法同上
XML文件
<span style="font-size:18px;"><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" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginTop="106dp" android:text="保存SD卡文件" /> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:text="读取SD卡文件" /> </RelativeLayout> </span>
<span style="font-size:18px;">package com.example.externalstorage; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.OutputStream; import java.io.PrintStream; import java.util.Scanner; import android.os.Bundle; import android.os.Environment; import android.app.Activity; import android.view.Menu; import android.view.View; import android.widget.Button; import android.widget.Toast; public class MainActivity extends Activity { private Button saveData, getData; public static final String FILENAME = "flyou.dat";// 文件名 public static final String FILEDIR = "myFile";// SD卡下的文件路径 private PrintStream print;// 初始化打印流 private Scanner input;// 初始化输入流 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 实例化按钮 saveData = (Button) this.findViewById(R.id.button1); getData = (Button) this.findViewById(R.id.button2); // 储存文件到SD卡 saveData.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub // 获取sd卡的状态并判断是否可用 String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state)) { // 获得Sd卡跟目录 String SDpath = Environment.getExternalStorageDirectory() .toString(); // 拼凑完整的文件地址 String path = SDpath + File.separator + FILEDIR + File.separator + FILENAME; // System.out.println(path); // 获得File对象 File file = new File(path); // 判断路径是否存在入不存在则自动创建 if (!file.getParentFile().exists()) { file.getParentFile().mkdir(); } try { // 使用打印流重定向写入位置,向文件内写入数据 print = new PrintStream(file); print.print("这是使用打印流在SDka上存取的数据文件"); print.println("\r\n 第二行数据");// 在文件中默认"\r\n"为换行符 } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { // 关闭打印流 Toast.makeText(MainActivity.this, "文件保存成功,文件位置:"+path, 2).show(); print.close(); } } } }); // 读取文件 getData.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state)) { String SDpath = Environment.getExternalStorageDirectory() .toString(); String path = SDpath + File.separator + FILEDIR + File.separator + FILENAME; File file = new File(path); try { // 创建SCanner重写输出地址为文件 input = new Scanner(file); // 判断是否有下一行数据 while (input.hasNext()) { String info = (String) input.next(); // 根据土司显示读取到的数据 Toast.makeText(MainActivity.this, info, 2).show(); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { input.close(); } } } }); } } </span>
最后还必须给android工程配置权限
android.permission.WRITE_EXTERNAL_STORAGE
将文件导出后用记事本打开
NOTE:
如果只进行文件的读取操作,需要配置android.permission.READ_EXTERNAL_STORAGE
如果同时进行读取操作则只需进行配置android.permission.WRITE_EXTERNAL_STORAGE就可以了
下节预报:Sqlite数据库存储