一.数据存储之File:
android中可以在设备本身的存储设备或者外接的存储设备中创建用于保存数据的文件。在默认的状态下,文件是不能在不同的程序间共享的。
在android中的上下文对象(Context)提供了文件操作的几个方法。
1).openFileOutput(文件名,操作模式)。
2).openFileInput(文件名,操作模式)。
第一个参数用于指定文件名称,不能包含路径分隔符 "/ ",如果文件不存在,android会自动的创建它,创建的文件保存在data/data/<package name>/files/目录下,这里想查看文件路径是需要在File Explorer中查看,这就要在 Window -> Show View -> Other -> Android -> File Explorer.
这里说到的操作模式有四种:
1).Context.MODE_PRIVATE = 0
此种为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的追加到原文件可以使用Context.MODE_APPEND。
2).Context.MODE_WORLD_READABLE = 1
此种模式表示当前文件可被其他应用读取。
3).Context.MODE_WORLD_WRITEABLE = 2
此种模式表示当前文件可被其他应用写入。
4).Context.MODE_APPEND = 32768
此种模式会检查文件是否存在,存在就往文件中追加内容,如果不存在则创建文件,添加内容。
注意:如果想被其他应用可读可写需要openFileOutput(文件名,Context.MODE_WORLD_READABLE+Context.MODE_WORLD_WRITEABLE )。
实例演示:
布局文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="文件名称" /> <EditText android:id="@+id/editText1" android:layout_width="match_parent" android:layout_height="wrap_content" android:ems="10" > </EditText> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="文件内容" /> <EditText android:id="@+id/editText2" android:layout_width="match_parent" android:layout_height="wrap_content" android:minLines="3" android:ems="10" /> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="保存" /> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="读取" android:onClick="onClick" /> <TextView android:id="@+id/textView3" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <Button android:id="@+id/button3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="保存sd" /> </LinearLayout>
服务类(FileService.java):
public class FileService { private Context context; public FileService(Context context) { this.context = context; } public void fileOutput(String fileName,String fileContext) throws Exception{ FileOutputStream fos = context.openFileOutput(fileName, Context.MODE_PRIVATE); fos.write(fileContext.getBytes()); fos.close(); } public String fileIntput(String fileName) throws Exception{ byte[] data = null; System.out.println(fileName); FileInputStream fis = context.openFileInput(fileName); //读取缓冲区数据 ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] b = new byte[1024]; int len = 0; while(-1 != (len = fis.read(b))){ baos.write(b,0,len); } data = baos.toByteArray(); return new String(data); } public void saveToSDCard(String fileName,String fileContext) throws Exception{ File file = new File(Environment.getExternalStorageDirectory(),fileName); //不能在使用api提供的openFileInput()方法,因为此方法是将文件存放在手机自带的存储位置。 FileOutputStream out = new FileOutputStream(file); out.write(fileContext.getBytes()); out.close(); } }
主界面(FlieMain.java):
public class FlieMain extends Activity { private Button b1; private Button b2; private EditText e1 ; private EditText e2; private TextView t1; private Button b3; private FileService files; @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_flie_main); b1 = (Button)findViewById(R.id.button1); b2 = (Button)findViewById(R.id.button2); b3 = (Button)findViewById(R.id.button3); files = new FileService(this); b1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { e1 = (EditText)findViewById(R.id.editText1); e2 = (EditText)findViewById(R.id.editText2); String fileName = e1.getText().toString(); String fileCon = e2.getText().toString(); try { files.fileOutput(fileName, fileCon); toastPrint("保存成功"); } catch (Exception e) { toastPrint("保存失败"); e.printStackTrace(); } } }); b3.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub e1 = (EditText)findViewById(R.id.editText1); e2 = (EditText)findViewById(R.id.editText2); String fileName = e1.getText().toString(); String fileCon = e2.getText().toString(); try { //判断sd卡是否可以读写,是否存在sd卡。 if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ files.saveToSDCard(fileName, fileCon); toastPrint("保存成功"); }else{ toastPrint("保存失败"); } } catch (Exception e) { toastPrint("保存失败"); e.printStackTrace(); } } }); } public void toastPrint(String str){ Toast.makeText(this, str, Toast.LENGTH_SHORT).show(); } public void onClick(View v) { try { String str = files.fileIntput(e1.getText().toString()); toastPrint("读取成功"+str); } catch (Exception e) { // TODO Auto-generated catch block toastPrint("读取失败"); e.printStackTrace(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.flie_main, menu); return true; } }
当我们想手机SD卡存入数据时,必须在AndroidManifest.xml中添加权限:
在SD卡中创建与删除文件操作
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
往SD卡中写入数据权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
运行效果:
在第一个输入框中输入文件名,然后在下面的输入框输入文件内容。点击保存。
查看文件位置:
点击读取按钮时:
当我们点击存入SD卡时: