Android笔记(十六)文件存储

本文详细介绍了Android中的文件存储方式,包括内部存储和外部存储的区别、使用方法及注意事项。内部存储适用于仅当前应用可见的数据,而外部存储则适用于全局可读的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文件存储适合按照从开始到结束的顺序不跳过地读取或写入大量数据。 例如,它适合于图像文件或通过网络交换的任何内容。文件存储分为内部存储和外部存储,内部存储将数据存到手机内存中,默认情况下其他应用无法访问此文件,并且卸载应用时会删除应用的所有文件;外部存储将数据存到SD卡中,文件是全局可读的,因此此处保存的文件可能不受您控制地被读取,卸载应用时必须调用getExternalFilesDir()方法才能将此应用的文件保存在目录中删除。

内部存储

  • Context 类中的openFileOutput ()方法得到FileOutputStream 对象
  • 构建出一个OutputStreamWriter 对象
  • 构建出一个 BufferedWriter 对象
  • 通过 BufferedWriter 来将文本内容写入到文件中

布局文件

<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" >

    <EditText
        android:id="@+id/et1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

Activity代码

public class MainActivity extends Activity {

    private EditText mEditText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mEditText = (EditText) findViewById(R.id.et1);
        String data = read();
        if (!TextUtils.isEmpty(data)) {
            mEditText.setText(data);
            mEditText.setSelection(data.length());// 将光标移到文本末尾
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        String data = mEditText.getText().toString();// getText()返回的是Editable对象
        save(data);
    }

    // 文件存储采用流的方式,先得到输出流,参数有指定的输出文件,再用输出流构建一个BufferedWriter,然后写数据
    public void save(String data) {
        FileOutputStream out = null;
        BufferedWriter writer = null;
        try {
            /*
             * openFileOutput()方法得到一个FileOutputStream对象
             * 第一个参数是文件名,文件默认存储到/data/data/<packagename>/files/目录
             * 第二个参数是操作模式,MODE_PRIVATE表示新写入的内容将会覆盖原文件中的内容,MODE_APPEND表示向原文件追加内容
             */
            out = openFileOutput("filesave", Context.MODE_PRIVATE);
            writer = new BufferedWriter(new OutputStreamWriter(out));
            writer.write(data);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (writer != null) {
                    writer.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    // 读取数据
    public String read() {
        FileInputStream in = null;
        BufferedReader reader = null;
        StringBuilder builder = new StringBuilder();
        try {
            in = openFileInput("filesave");
            reader = new BufferedReader(new InputStreamReader(in));
            String line = "";
            while ((line = reader.readLine()) != null) {
                builder.append(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (reader != null) {
                    reader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return builder.toString();// 将StringBuilder转换为String类型
    }
}

外部存储

  1. 判断是否有sd卡
  2. sd卡目录
  3. sd卡剩余存储空间是否足够

Android实现SD卡和实现内部文件存储的做法基本是一样的。只是取得文件路径的方法不一样,并且需要某些权限。

所需权限:

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

判断是否有sd卡:

Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) //已经挂载sd卡,可以进行读写

得到sd卡目录:

File sdFile = Environment.getExternalStorageDirectory();

判断剩余空间:

        // 获得sd卡的内存状态
        File sdcardFileDir = Environment.getExternalStorageDirectory();
        String sdcardMemory = getMemoryInfo(sdcardFileDir);

        // 获得手机内部存储控件的状态
        File dataFileDir = Environment.getDataDirectory();
        String dataMemory = getMemoryInfo(dataFileDir);

    //根据路径获取内存状态:
    private String getMemoryInfo(File path) {
        // 获得一个磁盘状态对象
        StatFs stat = new StatFs(path.getPath());

        long blockSize = stat.getBlockSize();   // 获得一个扇区的大小

        long totalBlocks = stat.getBlockCount();    // 获得扇区的总数

        long availableBlocks = stat.getAvailableBlocks();   // 获得可用的扇区数量

        // 总空间
        String totalMemory =  Formatter.formatFileSize(this, totalBlocks * blockSize);
        // 可用空间
        String availableMemory = Formatter.formatFileSize(this, availableBlocks * blockSize);

        return "总空间: " + totalMemory + "\n可用空间: " + availableMemory;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值