温故知新----5种数据存储方式之File

来源:互联网 发布:保利水管 知乎 编辑:程序博客网 时间:2024/05/16 14:56

File储存有两种,一种是处理应用程序的数据文件夹的文件,另一种是处理SD卡上的文件。


一、处理应用程序的数据文件夹文件

 FileOutputStream openFileOutput(String name):打开应用程序的数据文件夹下的name文件对应的输出流

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

注意:

1.方法的第一参数用于指定文件名称,不能包含路径分隔符“/” 

2.如果文件不存在,Android 会自动创建它。创建的文件保存在/data/data/<package name>/files目录

public static final int MODE_APPEND = 32768;                 以追加方式打开该文件,应用程序可以向该文件中追加内容

public static final int MODE_PRIVATE = 0;                         该文件只能被当前程序读写

public static final int MODE_WORLD_READABLE = 1;   给文件内容可以被其他程序读取

public static final int MODE_WORLD_WRITEABLE = 2;  给文件内容可以被其他程序读写

3.context下的几个访问应用程序的数据文件夹方法


处理应用程序的数据文件夹的文件:

写入文件方法

/**     * 写入文件     * 文件存储在应用程序的数据文件夹下     * @param content     */    private void write(String content) {        FileOutputStream fos = null;        try {            //以context的openFileOutput和追加的模式打开文件输出流            fos = openFileOutput("haha.txt", MODE_APPEND);            //输出流,写入文件            fos.write(content.getBytes());        } catch (Exception e) {            e.printStackTrace();        } finally {            try {                if (fos != null) {                    fos.close();                    fos=null;                }            } catch (IOException e) {                e.printStackTrace();            }        }    }
读取文件方法
/**     * 读取文件     * 文件存储在应用程序的数据文件夹下     */    private String read() {        FileInputStream fis = null;        try {            //使用context的openFileInput方法打开输入流            fis = openFileInput("haha.txt");            byte b[] = new byte[1024];            int hasRead = 0;            //记录读出内容            StringBuilder sb = new StringBuilder("");            //读取文件内容,hasRead表示已经读取的            while ((hasRead = fis.read(b)) > 0) {                sb.append(new String(b, 0, hasRead));            }            return sb.toString();        } catch (Exception e) {            e.printStackTrace();        } finally {            try {                if (fis != null) {                    fis.close();                    fis=null;                }            } catch (IOException e) {                e.printStackTrace();            }        }        return null;    }

结果:

处理SD卡上的文件:
读写前准备:
1.判断是否有sd卡
/**     * 检查SD卡是否存在且能否读写     * @return True if external storage is writable. False otherwise.     */    public static boolean isExternalStorageMounted() {        return Environment.MEDIA_MOUNTED.equals(                Environment.getExternalStorageState());    }
2.检测用户是否有读写sd卡权限
/**     * 检查用户是否有读/写SD卡权限     * @param context The Context to check the permissions for.     * @return True if granted the permissions. False otherwise.     */    public static boolean hasWritePermissionToExternalStorage(Context context) {        return ContextCompat.checkSelfPermission(context,                Manifest.permission.WRITE_EXTERNAL_STORAGE) ==                PackageManager.PERMISSION_GRANTED;    }
3.如果没有则为用户申请权限
/**     * 请求读写权限     * @param activity     */    public static void requestPermission(Activity activity){        ActivityCompat.requestPermissions(activity,                new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);    }
4.获取sd卡目录
File sdCardDir = Environment.getExternalStorageDirectory();
5.Androidmanifest加入读写sd卡的
 <!-- 在SDCard中创建与删除文件权限 -->    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />    <!-- 往SDCard写入数据权限 -->    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
写入文件方法:
/**     * 写入SD卡下的文件     * @param content     */    private void writeSD(String content) {        //如果sd卡存在        if (Util.isExternalStorageMounted()){            //如果没有权限读写操作,则申请            if (!Util.hasWritePermissionToExternalStorage(this)){                Util.requestPermission(this);            }else{                FileOutputStream fos=null;                try {                    //获取SDCard目录                    File sdCardDir = Environment.getExternalStorageDirectory();                    //生成一个文件                    File textFile = new File(sdCardDir,"HEIHEI.txt");                    fos = new FileOutputStream(textFile);                    fos.write(content.getBytes());                } catch (IOException e) {                    e.printStackTrace();                }finally {                    try {                        if (fos!=null){                            fos.close();                            fos = null;                        }                    } catch (IOException e) {                        e.printStackTrace();                    }                }            }        }    }
读取文件方法:
/**     * 读取sd卡下的文件     * @return     */    private String readSD() {        FileInputStream fis = null;        try {            //输入流,名字由路径+文件名组成            fis = new FileInputStream(Environment.getExternalStorageDirectory()+"/HEIHEI.txt");            byte b[] = new byte[1024];            int hasRead = 0;            //记录读出内容            StringBuilder sb = new StringBuilder("");            //读取文件内容,hasRead表示已经读取的            while ((hasRead = fis.read(b)) > 0) {                sb.append(new String(b, 0, hasRead));            }            return sb.toString();        } catch (FileNotFoundException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }finally {            try {                if (fis!=null){                    fis.close();                    fis = null;                }            } catch (IOException e) {                e.printStackTrace();            }        }        return null;    }
结果:

完整代码:
FileActivity.Java
package tplusr.storagetest.file;import android.os.Environment;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.TextView;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import tplusr.storagetest.R;import tplusr.storagetest.Util;public class FileActivity extends AppCompatActivity implements View.OnClickListener{    private TextView t;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_file);        setContentView(R.layout.activity_main);        Button b1 = (Button) findViewById(R.id.b1);        Button b2 = (Button) findViewById(R.id.b2);        Button b3 = (Button) findViewById(R.id.b3);        Button b4 = (Button) findViewById(R.id.b4);        t = (TextView) findViewById(R.id.result);        b1.setOnClickListener(this);        b2.setOnClickListener(this);        b3.setOnClickListener(this);        b4.setOnClickListener(this);        //获取应用程序的数据文件夹的绝对路径        Log.d("File", "绝对路径"+getFilesDir().toString());    }    @Override    public void onClick(View view) {        switch (view.getId()) {            case R.id.b1:                write("YSJHDASKDHAKSHDAKSDHKHWUIFGEWK我我我我我我我我我我放假放到沙发上看3847829#$%……(*&%");                Log.d("File", "----------------创建文件---------------");                //获取应用程序的数据文件夹下的所有文件                Log.d("File", "文件数量"+fileList().length + "");                for (int i=0;i<fileList().length;i++){                    Log.d("File", "文件:"+fileList()[i]+"");                }                break;            case R.id.b2:                Log.d("File", "----------------读取文件---------------");                t.setText(read());                Log.d("File", "文件内容:" + read());                Log.d("File", "----------------删除文件---------------");                //删除应用程序的数据文件夹下的绝对路径                deleteFile("haha.txt");                Log.d("File", fileList().length + "");                break;            case R.id.b3:                writeSD("DHADHIUFHEUWI右边还是福 is 返回非大煞风景#$……*(*)&");                break;            case R.id.b4:                Log.d("File", "----------------SD卡读取文件结果---------------");                t.setText(readSD());                Log.d("File", readSD());                break;        }    }    /**     * 写入文件     * 文件存储在应用程序的数据文件夹下     * @param content     */    private void write(String content) {        FileOutputStream fos = null;        try {            //以context的openFileOutput和追加的模式打开文件输出流            fos = openFileOutput("haha.txt", MODE_APPEND);            //输出流,写入文件            fos.write(content.getBytes());        } catch (Exception e) {            e.printStackTrace();        } finally {            try {                if (fos != null) {                    fos.close();                    fos=null;                }            } catch (IOException e) {                e.printStackTrace();            }        }    }    /**     * 读取文件     * 文件存储在应用程序的数据文件夹下     */    private String read() {        FileInputStream fis = null;        try {            //使用context的openFileInput方法打开输入流            fis = openFileInput("haha.txt");            byte b[] = new byte[1024];            int hasRead = 0;            //记录读出内容            StringBuilder sb = new StringBuilder("");            //读取文件内容,hasRead表示已经读取的            while ((hasRead = fis.read(b)) > 0) {                sb.append(new String(b, 0, hasRead));            }            return sb.toString();        } catch (Exception e) {            e.printStackTrace();        } finally {            try {                if (fis != null) {                    fis.close();                    fis=null;                }            } catch (IOException e) {                e.printStackTrace();            }        }        return null;    }    /**     * 写入SD卡下的文件     * @param content     */    private void writeSD(String content) {        //如果sd卡存在        if (Util.isExternalStorageMounted()){            //如果没有权限读写操作,则申请            if (!Util.hasWritePermissionToExternalStorage(this)){                Util.requestPermission(this);            }else{                FileOutputStream fos=null;                try {                    //获取SDCard目录                    File sdCardDir = Environment.getExternalStorageDirectory();                    //生成一个文件                    File textFile = new File(sdCardDir,"HEIHEI.txt");                    fos = new FileOutputStream(textFile);                    fos.write(content.getBytes());                } catch (IOException e) {                    e.printStackTrace();                }finally {                    try {                        if (fos!=null){                            fos.close();                            fos = null;                        }                    } catch (IOException e) {                        e.printStackTrace();                    }                }            }        }    }    /**     * 读取sd卡下的文件     * @return     */    private String readSD() {        FileInputStream fis = null;        try {            //输入流,名字由路径+文件名组成            fis = new FileInputStream(Environment.getExternalStorageDirectory()+"/HEIHEI.txt");            byte b[] = new byte[1024];            int hasRead = 0;            //记录读出内容            StringBuilder sb = new StringBuilder("");            //读取文件内容,hasRead表示已经读取的            while ((hasRead = fis.read(b)) > 0) {                sb.append(new String(b, 0, hasRead));            }            return sb.toString();        } catch (FileNotFoundException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }finally {            try {                if (fis!=null){                    fis.close();                    fis = null;                }            } catch (IOException e) {                e.printStackTrace();            }        }        return null;    }}
Util.Java
package tplusr.storagetest.sharedpreferences;import android.Manifest;import android.app.Activity;import android.content.Context;import android.content.pm.PackageManager;import android.os.Environment;import android.support.v4.app.ActivityCompat;import android.support.v4.content.ContextCompat;/** * Created by tangjiarao on 16/9/6. */public class Util {    /**     * 检查SD卡是否存在且能否读写     * @return True if external storage is writable. False otherwise.     */    public static boolean isExternalStorageMounted() {        return Environment.MEDIA_MOUNTED.equals(                Environment.getExternalStorageState());    }    /**     * 检查用户是否有读/写SD卡权限     * @param context The Context to check the permissions for.     * @return True if granted the permissions. False otherwise.     */    public static boolean hasWritePermissionToExternalStorage(Context context) {        return ContextCompat.checkSelfPermission(context,                Manifest.permission.WRITE_EXTERNAL_STORAGE) ==                PackageManager.PERMISSION_GRANTED;    }    /**     * 请求读写权限     * @param activity     */    public static void requestPermission(Activity activity){        ActivityCompat.requestPermissions(activity,                new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);    }}

参考博客:
http://www.cnblogs.com/elleniou/archive/2012/05/17/2505630.html


0 0