Java提供了一套完整的IO流体系,包括FileInputStream、FileOutputStream等,通过这些IO流可以非常方便的访问磁盘上的内容。Android同样支持以这种方式来访问手机存储器上的文件。

Context提供了如下两种方法来打开应用程序的数据文件夹里的文件IO流。

  • FileInputStream openFileInput(String name):打开应用程序的数据文件夹下的name文件对应的输入流。
  • FileOutputStream openFileOutput(String name,int mode):打开应用程序的数据文件夹下的name文件对应的输入流。

以上两个方法默认打开的文件路径为:/data/data/< package name>/files目录下的name文件。即应用程序的数据文件夹是/data/data/< package name>/files,故此时File存储的数据位于内部存储器上。

上面两种方法分别用于打开文件输入流、输出流,其中第二个参数mode指定打开文件的模,该模式支持如下值:

  • MODE_PRIVATE参数:指示要创建这个文件(或者,如果有同名文件存在,则会替换旧文件),并且让这个文件是应用程序的私有文件。
  • MODE_APPEND:如果文件已经存在,则在后面追加数据
  • MODE_WORLD_READABLE:让其他应用有读的权限
  • MODE_WORLD_WRITEABLE:让其他应用有写的权限

注:MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE已经在Android 4.2(API level 17)废弃了,因为这样危险,安全性不高。

1.往内部存储内写文件(写入到/data/data/com.xxx.xxx/files目录下,com.xxx.xxx为应用程序包名):

        String FILE_NAME = "hello_file";        String FILE_TEXT = "hello world!!!";        FileOutputStream fos = openFileOutput(FILE_NAME, Context.MODE_PRIVATE);        fos.write(FILE_TEXT.getBytes());        fos.close();

运行上面代码,发现/data/data/com.xxx.xxx/files目录下多了个hello_file文件。

2.读取内部存储内的文件(也就是从/data/data/com.xxx.xxx/files目录下读取文件):

        String FILE_NAME = "hello_file";        byte[] b = new byte[1024];        StringBuffer sb = new StringBuffer();        FileInputStream fis = openFileInput(FILE_NAME);        int num;        while ((num = fis.read(b)) != -1) {            sb.append(new String(b, 0, num));        }        fis.close();        Log.d("xxx", sb.toString());

运行一下,成功打印hello world!!!

除此之外,Context还提供了如下几个方法来访问应用程序的数据文件夹。

  • getDir(String name,int mode):在应用程序数据文件夹下获取或创建name对应的子目录。
  • File getFileDir():获取应用程序的数据文件夹的绝对路径。
  • String[] fileList():返回应用程序数据文件夹下的全部文件。
  • deleteFile(String name):删除应用程序数据文件夹下的制定文件。

下面示范如何读取应用程序数据文件夹得内容。给程序界面布局只有两个文本框和两个按钮,其中第一组文本框和按钮用于处理写入,文本框用于接收用户输入,当用户单击”写入”按钮时,程序会把文本框中的数据写入文件;第二组文本框和按钮用于处理读取,当用户点击“读取”按钮时,该文本框显示文件中的数据,效果如下:

代码如下:

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:orientation="vertical" android:layout_height="match_parent" tools:context=".MainActivity">    <EditText  android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/writeEditText"/>    <Button  android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/writeButton" android:text="Write File" android:textAllCaps="false"/>    <Button  android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/readButton" android:text="Read File" android:textAllCaps="false"/>    <EditText  android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/readEditText"/></LinearLayout>

MainActivity.java

public class MainActivity extends Activity {    final String FILE_NAME = "file.test";    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        System.out.println(new StringBuffer("a").append("b").append("c"));        Button writeButton = (Button) findViewById(R.id.writeButton);        Button readButton = (Button) findViewById(R.id.readButton);        final EditText writeEditText = (EditText) findViewById(R.id.writeEditText);        final EditText readEditText = (EditText) findViewById(R.id.readEditText);        Log.i("FILE",getFilesDir().toString());        writeButton.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                write(writeEditText.getText().toString());                writeEditText.setText("");            }        });        readButton.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                readEditText.setText(read());            }        });    }    private String read() {        try {            //从文件读取数据            FileInputStream fileInputStream = openFileInput(FILE_NAME);            byte[] buffer = new byte[1024];            int hasRead = 0;            StringBuilder stringBuilder = new StringBuilder("");            while ((hasRead = fileInputStream.read(buffer)) > 0 )            {                stringBuilder.append(new String(buffer,0,hasRead));            }            fileInputStream.close();            return stringBuilder.toString();        } catch (FileNotFoundException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }        return null;    }    private void write(String s) {        try {            //向文件写入数据            FileOutputStream fileOutputStream = openFileOutput(FILE_NAME,MODE_APPEND);            PrintStream printStream = new PrintStream(fileOutputStream);            printStream.println(s);            printStream.close();        } catch (FileNotFoundException e) {            e.printStackTrace();        }    }}

3.在内存存储内保存缓存文件(也就是将数据保存在/data/data/< package name>/cache目录下的文件中)

如果只是要缓存一些数据,而不是要持久的保存它,那么应该使用getCacheDir()方法来打开一个File对象,它代表了应用程序要保存临时缓存文件的内部目录。

当设备的内部存储空间不足的时候,Android可能会删除这些缓存文件来回收存储空间。但是,不应该依赖系统来给你清理这些文件,应该始终自己来维护缓存文件,并且要把存储空间的耗费限定在合理的范围内,如1MB。当用户卸载应用程序时,这些文件会被删除。

getCacheDir():获取应用程序的缓存目录文件夹,即/data/data/< package name>/cache目录。

将上面的Demo改为向应用程序的缓存目录下下程序只需:

//向文件写入数据:
FileOutputStream fileOutputStream = openFileOutput(FILE_NAME,MODE_APPEND);
改为:
FileOutputStream fileOutputStream =
new FileOutputStream(getCacheDir()+ File.separator+FILE_NAME);

//从文件读取数据:
FileInputStream fileInputStream = openFileInput(FILE_NAME);
改为:
FileInputStream fileInputStream =
new FileInputStream(getCacheDir()+ File.separator+FILE_NAME);

注:

  • openFileOutput()和openFileInput()函数属于Android中定义的函数,文件默认保存的路径为/data/data/< package name>/files目录下。
  • new FileOutputStream()和new FileInputStream()函数属于Java中定义的函数,没有默认的文件保存路径,故需要制定文件路径。

转载自:http://blog.csdn.net/tianjf0514/article/details/8271114#
参考自:《疯狂Java讲义》

更多相关文章

  1. 在Android(安卓)Studio 2.2上集成OpenCV For Android(安卓)SDK
  2. Android(安卓)Retrofit 2.0(一)初次见面请多多关照
  3. 全志A10平板上的ubuntu终极安装版,支持HDMI和平板本机LCD,全新内核
  4. Android(安卓)模仿360二维码扫描功能
  5. Android-安全退出
  6. Android(安卓)查看SharedPreferences中的数据
  7. Android下创建一个sqlite数据库
  8. 【Android(安卓)学习笔记】save data(1)—— SharedPreferences简
  9. Your content must have a ListView whose id attribute is 'and

随机推荐

  1. AndroidAndroid程序提示和消息button响应
  2. 380个Android实例
  3. Android(安卓)AndroidStudio开发全部套件
  4. [转]近百android程序源码贡献
  5. Android(安卓)Studio出现Gradle DSL meth
  6. Android对应版本号
  7. Android开发笔记(二)——布局管理器
  8. android 开发不容错过的网站
  9. Android调用系统设置,Android调用系统设置
  10. Android(安卓)USB tethering相关代码