Android学习(十一) File文件操作

File类

  1、获取当前应用程序的目录:  

  this.getFilesDir();                                             //获取当前应用程序的数据目录

  this.getCacheDir();                                          //获取当前应用程序的缓存目录,资源不够用时,可能会被清除。

  this.getDir("userdata", MODE_PRIVATE);    //获取当前用户程序下自定义目录。

  2、应用程序在运行的过程中如果需要向手机上保存数据,一般是把数据保存在SDcard中的。大部分应用是直接在SDCard的根目录下创建一个文件夹,然后把数据保存在该文件夹中。这样当该应用被卸载后,这些数据还保留在SDCard中,留下了垃圾数据。
  如果你想让你的应用被卸载后,与该应用相关的数据也清除掉,该怎么办呢?

  获取SDCard目录

  Environment.getExternalStorageDirectory();            //获取内存卡的目录,需要权限,如果放在此文件夹中,卸载时不会被清除。

  在AndroidManifest.xml中添加如下代码

<!-- 在SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

  this.getExternalFilesDir("test_dir");                  //将数据保存到外部内存卡的应用程序数据目录。参数为files下的文件名称。

  通过Context.getExternalFilesDir()方法可以获取到 SDCard/Android/data/你的应用的包名/files/ 目录,一般放一些长时间保存的数据

      this.getExternalCacheDir();                             //将数据保存到外部存储卡的应用程序缓存目录中。可以被清除。 

  通过Context.getExternalCacheDir()方法可以获取到 SDCard/Android/data/你的应用包名/cache/目录,一般存放临时缓存数据

  

  如果使用上面的方法,当你的应用在被用户卸载后,SDCard/Android/data/你的应用的包名/ 这个目录下的所有文件都会被删除,不会留下垃圾信息。

  而且上面二个目录分别对应 设置->应用->应用详情里面的”清除数据“与”清除缓存“选项 

  如果要保存下载的内容,就不要放在以上目录下

测试代码:

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:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <Button android:id="@+id/btn1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="保存文件"/>
    
    <Button android:id="@+id/btn2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="读取文件"/>

</LinearLayout>

main.java

package com.example.filedemo1;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {

    Button btn1;
    Button btn2;
    File dir;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn1 = (Button) findViewById(R.id.btn1);
        btn2 = (Button) findViewById(R.id.btn2);

        // 获取当前应用程序的数据目录
        // dir = this.getFilesDir();

        // 获取当前应用程序的缓存目录,资源不够用时,可能会被清除。
        // dir = this.getCacheDir();

        // 获取当前用户程序下自定义目录。
        // dir = this.getDir("userdata", MODE_PRIVATE);

        // 获取当前SDCard目录
        dir = Environment.getExternalStorageDirectory();

        //Log.i("dir", dir.toString());
        
        //保存文件
        btn1.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                File newfile = new File(dir, "test.txt");
                try {
                    FileOutputStream fos = new FileOutputStream(newfile);
                    String content = "Java中的文件写入,测试数据!";
                    fos.write(content.getBytes());
                    fos.close();

                    Toast.makeText(MainActivity.this, "写入成功", 1).show();
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
        
        //读取文件
        btn2.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                File newfile = new File(dir, "test.txt");
                try {
                    FileInputStream fis = new FileInputStream(newfile);
                    byte[] data = new byte[fis.available()];
                    fis.read(data);
                    String content = new String(data);

                    Toast.makeText(MainActivity.this, content, 1).show();
                    fis.close();
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
    }

}