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

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);
    }
}

参考博客:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值