android I/0流操作文件(文件存储)

作者:你要永远相信光z 时间:2021-11-13 19:42:37 

文件存储

文件存储方式不受类型限制,可以将一些数据直接以文件的形式保存在设备中,例如文本文件、PDF ,音频,图片等。存储类型复杂的数据时,通常采用文件存储。Java提供一套完整的I/О流体系,通过I/О流可以非常方便地访问磁盘中的文件,同样Android 也支持I/O流方式来访问手机等移动设备中的存储文件。

I/0流操作文件

进行I/О流操作文件时,需要先获得文件的输人流和输出流。在Android应用程序中,可以通过上下文环境Context对象提供的openFileInput()和 openFileOuput()两个方法分别来获得文件的输入流和输出流,这两个方法的具体介绍如下。

  • FilelnputStream openFileInput(String name): 用于获取应用程序的数据文件夹下指定name文件名的标准文件输入流,以便读取设备中的文件。

  • FileOutputStream openFileOuput(String name, int mode): 用于获取应用程序的数据文件夹下指定name文件名的标准文件输出流,以便将数据写入设备的文件中。

其中 openFileOutput()方法的第二个参数mode用于指定输出流的模式,即打开文件进行操作的模式。Context类中提供了4个静态常量用于表示不同的输出模式,如下表所示。

4种文件读写模式

模式功能描述
Context.MODE_PRIVATE私有模式,该模式所创建的文件都是私有文件,只能被应用本身所访问。因此,该模式下所写入的内容会覆盖原来文件的内容
Context. MODE_APPEND附加模式,该模式首先会检查文件是否存在,若文件不存在,则创建新文件;若文件存在,则在原文件的末尾追加内容
Context.MODE_WORLD_READABLE可读模式,该模式的文件可以被其他应用程序读取
Context.MODE_WORLD_WRITABLE可写模式,该模式的文件可以被其他应用程序读写

除此之外,Context上下文对象还提供了一些方法来访问应用程序的数据文件夹,如下表所示。

访问数据文件夹的方法

方法功能描述
File getDir(String name, int mode)在应用程序的数据文件夹下获取或创建name对应的子目录
File getFilesDir()获取应用程序的数据文件夹的绝对路径
String[] fileList()返回应用程序的数据文件夹下的所有文件
boolean deleteFile( String name)删除应用程序的数据文件夹下的指定文件

下面通过代码演示如何使用I/O流对文件进行读写操作

创建xml布局文件

android I/0流操作文件(文件存储)

android I/0流操作文件(文件存储)

xml布局代码如下


<?xml version="1.0" encoding="utf-8"?>
<!-- 线性布局,宽度高度适应屏幕变化,水平方向垂直 -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="vertical">
   <!-- 编辑输入框,宽度适应线性布局变化,高度适应自己,设置显示行数为四行 -->
   <EditText
       android:id="@+id/ediFileOut"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:lines="4"/>
   <!-- 保存文件按钮,宽度,高度适应自己,按钮文本显示-->
   <Button
       android:id="@+id/btnWrite"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="保存文件"/>
   <!-- 编辑显示框,宽度适应线性布局变化,高度适应自己,设置光标不可见,不可编辑,行数为4-->
   <EditText
       android:id="@+id/editFileIn"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:cursorVisible="false"
       android:editable="false"
       android:lines="4"/>
   <!-- 读取文件按钮宽度,高度适应自己,按钮文本显示-->
   <Button
       android:id="@+id/btnRead"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="读取文件"/>
</LinearLayout>

上述界面布局比较简单,只包含两个文本框和两个按钮,分别用于保存文件和读取文件两种操作。

接着创建Activity程序

android I/0流操作文件(文件存储)

android I/0流操作文件(文件存储)

activity代码如下


package com.example.wenjiancuncu;
import android.content.Context;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.PrintStream;
public class FileIOActivity extends AppCompatActivity {
   private EditText editFileIn, editFileOut; //声明两个文本框
   private Button btnRead, btnWrite; //声明两个按钮
   final String FILE_NAME = "qstIO.txt"; //指定文件名
   @Override //重写父类方法
   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState); //调用父类方法
       setContentView(R.layout.activity_file_io); //设置布局
       //获取两个文本框
       editFileIn = (EditText) findViewById(R.id.editFileIn);
       editFileOut = (EditText) findViewById(R.id.ediFileOut);
       //获取两个按钮
       Button btnRead = (Button) findViewById(R.id.btnRead);
       Button btnWrite = (Button) findViewById(R.id.btnWrite);
       //以匿名类的形式设置btnRead按钮的事件 *
       btnRead.setOnClickListener(new View.OnClickListener() {
           @Override //重写接口方法
           public void onClick(View v) {
               //读取指定文件中的内容,并在editFileIn文本框中显示出来
               editFileIn.setText(read());
           }
       });
       //以匿名类的形式设置btnWrite按钮的事件 *
       btnWrite.setOnClickListener(new View.OnClickListener() {
           @Override //重写接口方法
           public void onClick(View v) {
               write(editFileOut.getText().toString()); //将editFileOut中的内容写入文件中
               editFileOut.setText(""); //清空editFileOut文本框中的内容
           }
       });
   }
   private String read() {
       try {
           FileInputStream fis = openFileInput(FILE_NAME); //打开文件输入流
           byte[] buff = new byte[1024]; //定义一个字节缓存数组
           int hasRead = 0;
           StringBuilder sb = new StringBuilder(""); //创建可变字符串
           //读取文件内容
           while ((hasRead = fis.read(buff)) > 0) {
               //把字节数组转化为字符串并添加到可变字符串中
               sb.append(new String(buff, 0, hasRead));
           }
           fis.close(); //关闭文件输入流
           return sb.toString(); //返回一个字符串
       }catch (Exception e) {
           e.printStackTrace();
       }
       return null;
   }
   private void write(String content) {
       try {
           //以追加模式打开文件输出流
           FileOutputStream fos = openFileOutput(FILE_NAME, Context.MODE_APPEND);
           PrintStream ps = new PrintStream(fos); //将FileOutStream包装成PrintStream
           ps.println(content); //输出文件内容
           ps.close(); //关闭文件输出流
           //使用Toast显示保存成功
           Toast.makeText(FileIOActivity.this,"保存成功", Toast.LENGTH_LONG).show();
       }catch (Exception e) {
           e.printStackTrace();
       }
   }
}

上述代码的核心操作就是文件的保存和读取,其中read()和 write()两个方法分别用于读文件和写文件操作;代码中分别对btnRead 和 btnWrite按钮设置了事件 * ,并在事件处理方法中调用相应的read()或write()方法实现文件的读取或保存。

在AndroidMainfest中声明Activity

android I/0流操作文件(文件存储)

运行结果

android I/0流操作文件(文件存储)

Android应用程序的数据文件默认保存在/data/data/包名/files目录下。在 AndroidDevice Monitor的 File Explorer选项卡中,展开/data/data/com. 包名/files目录,在该目录下可以看到保存的qstIO.txt 数据文件,如下图所示。

android I/0流操作文件(文件存储)

android I/0流操作文件(文件存储)

android I/0流操作文件(文件存储)

来源:https://blog.csdn.net/weixin_42768634/article/details/117286723

标签:文件存储,android,I/0流
0
投稿

猜你喜欢

  • 你所不知道的Spring自动注入详解

    2021-09-04 19:30:08
  • 详解SpringBoot的事务管理

    2022-01-15 13:39:26
  • 详解Java语言中一个字符占几个字节?

    2023-08-26 11:45:40
  • Android使用MulticastSocket实现多点广播图片

    2023-01-16 06:13:57
  • C# FileStream文件读写详解

    2021-10-27 15:44:14
  • spring aop注解配置代码实例

    2022-02-16 21:13:33
  • 简单学习C#中的泛型方法使用

    2022-11-06 19:37:27
  • Java过滤器模式原理及用法实例

    2023-03-07 12:15:07
  • 使用@PathVariable接收两个参数

    2022-12-08 14:21:04
  • Java遍历json字符串取值的实例

    2023-09-02 17:03:17
  • springboot bootcdn使用示例详解

    2022-01-14 21:56:46
  • 详解Java中的泛型

    2021-12-02 14:57:34
  • c#正反序列化XML文件示例(xml序列化)

    2023-01-06 02:49:57
  • C#实现身份证号码验证的方法

    2022-11-08 09:15:34
  • WPF中使用CallerMemberName简化InotifyPropertyChanged的实现

    2023-05-08 16:27:07
  • C#实现文件上传及文件下载功能实例代码

    2022-12-13 23:57:23
  • Android 在 res/layout 文件夹 下创建一个 子文件夹实例

    2021-07-31 22:50:21
  • java 静态代理 动态代理深入学习

    2022-07-24 21:46:25
  • Java Collections集合继承结构图_动力节点Java学院整理

    2022-07-10 03:44:53
  • 详细讲解Java的泛型

    2021-07-06 02:31:24
  • asp之家 软件编程 m.aspxhome.com