文件存储

1.SharedPreference只能保存一些简单的数据,要想存储更多类型的数据,需要使用文件的存储操作。有两种形式:

形式一:直接利用Activity提供的文件操作方法。此类操作的所有文件路径只能是“data\data\<packagename>\files\文件名称”。

形式二:利用Java IO流执行操作。此类操作的文件可以保存在任意路径下,但需要为其操作授权。

利用Activity类操作数据文件

1.文件操作的方法只有两个:一个是进行文件的输出(openFileOutputStream(),返回OutputStream),另一个是进行文件的输入(openFileInputStream(),返回InputStream),这两个方法返回的类型都是Java IO流中的字节操作流对象。

使用openFileInput()和openFileOutput()方法进行写入/读取写入操作时,接收的文件中不能包含任何的分隔符(\),只能写文件名称,而文件名称会默认保存在“data\data\<package name>\files\”目录中。

2.保存文件

publicclass FileOperate extends Activity {
    private static final String FILENAME ="mldn.txt" ; // 设置文件名称
    @Override
    public void onCreate(BundlesavedInstanceState) {
        super.onCreate(savedInstanceState);
        super.setContentView(R.layout.main);
        FileOutputStream output = null ;    //  接收文件输出对象
        try {//设置输出文件的名称,及文件创建模式
            output =super.openFileOutput(FILENAME, Activity.MODE_PRIVATE) ;
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        PrintStream out = newPrintStream(output) ; // 输出方便
        out.println("姓名:李华;") ;
        out.println("年龄:20;") ;
        out.println("地址:天方夜谈学院。") ; 
        out.close() ;   // 资源一定要关闭,关闭流
    }
 
} 


3.读取文件:
publicclass FileOperate extends Activity {
    private static final String FILENAME ="mldn.txt" ; // 设置文件名称
    private TextView msg = null ;       // 文本组件
    @Override
    public void onCreate(BundlesavedInstanceState) {
        super.onCreate(savedInstanceState);
        super.setContentView(R.layout.main);
        this.msg = (TextView)super.findViewById(R.id.msg) ; 
        FileInputStream input = null ;
        try {
        input = super.openFileInput(FILENAME) ; //  取得输入流
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        Scanner scan = new Scanner(input) ;
        while(scan.hasNext()) {
            this.msg.append(scan.next() +"\n") ;
        }
        scan.close() ;
    }
 
} 

利用IO流操作文件
1.以上程序直接将文件保存在手机的默认存储空间,要想把文件保存在自定义目录及sdcard上,可以使用传统的IO流完成。
2.向sdcard上保存文件
publicclass FileOperate extends Activity {
    private static final String FILENAME ="/mnt/sdcard/mldndata/mymldn.txt" ;  //设置文件名称
    @Override
    public void onCreate(BundlesavedInstanceState) {
        super.onCreate(savedInstanceState);
        super.setContentView(R.layout.main);
        File file = new File(FILENAME) ;    //  定义要操作的文件
        if(!file.getParentFile().exists()) {
            file.getParentFile().mkdirs() ; //  创建父文件夹路径
        }
        PrintStream out = null;//打印流对象,用于输出
        try {
            out = new PrintStream(newFileOutputStream(file));
            out.println("天方夜谭学院(MLDN,www.baidu.cn),作者:李华");
        } catch (Exception e) {
            e.printStackTrace() ;
        } finally { // 一定要关闭流
            if(out != null) {
                out.close() ;
            }
        }
    }
}
 
由于用到外部设备(sdcard),所以要为程序配置相应的权限。
 
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

3.判断sdcard是否存在,如果存在则保存;否则提示不存在,无法保存。要实现该功能,要使用android.os.Environment类取得目录的信息。
publicclass FileOperate extends Activity {
    private static final String FILENAME ="mymldn.txt" ;   // 设置文件名称
    private static final String DIR ="mldndata" ;  // 操作文件夹的名称
    @Override
    public void onCreate(BundlesavedInstanceState) {
        super.onCreate(savedInstanceState);
        super.setContentView(R.layout.main);
        
    //如果sdcard存在则创建文件便于接下来的操作    if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
            File file = new File(Environment.getExternalStorageDirectory()
                    + File.separator + DIR +File.separator + FILENAME); // 定义要操作的文件
            if (!file.getParentFile().exists()){
                file.getParentFile().mkdirs();//  创建父文件夹路径
            }
            PrintStream out = null;//打印流对象用于输出
            try {
                out = new PrintStream(newFileOutputStream(file));
                out.println("天方夜谭学院(MLDN,www.MLDNJAVA.cn),作者:李华");
            } catch (Exception e) {
                e.printStackTrace();
            } finally { // 一定要关闭流
                if (out != null) {
                    out.close();
                }
            }
        } else {
            Toast.makeText(this, "保存失败,SD卡不存在!", Toast.LENGTH_LONG).show() ;
        }
    }
 
}

参考文章:Android开发实战经典