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布局文件
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程序
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应用程序的数据文件默认保存在/data/data/包名/files目录下。在 AndroidDevice Monitor的 File Explorer选项卡中,展开/data/data/com. 包名/files目录,在该目录下可以看到保存的qstIO.txt 数据文件,如下图所示。
来源:https://blog.csdn.net/weixin_42768634/article/details/117286723
猜你喜欢
- 开门见山在IT圈里,每当我们谈论并发时,必定会说起在一台计算机上同时运行的一系列线程。如果这台电脑上有多个处理器或者是一个多核处理器,那么这
- Spring Security提供如下几种认证机制Username & PasswordOAuth2.0 LoginSAML 2.0
- 1. 最小生成树连通图中的每一棵生成树 , 都是原图的极大无环子图 , 即: 从中删去任何一条边 , 生成树就不再连通;反之 , 在其中引入
- 最近 IDEA 2020最后一个版本发布了 ,已经内置了Lombok插件,SpringBoot 2.1.x之后的版本也在Starter中内置
- 本文实例主要进行java Timer(定时调用、固定时间执行)测试,具体实现代码如下。测试1当任务执行时间小于重复执行的间隔时间代码:pub
- Java8已经发布很多年了,但是很多人在开发时仍然坚持使用着Date和SimpleDateFormat进行时间操作。SimpleDateFo
- 前后端分离开发中,一般都会遇到请求跨域问题。而且一般也会遇到登陆失效问题。今天就以springboot和vue为例来看如何解决上述问题增加过
- 输入方法第一种输入方法:scannerimport java.util.Scanner; // 导入java.util.Scannerpub
- SpringBoot集成Mybatis时mybatis.mapper-locations和@MapperScan的作用1、mybatis.m
- java * 类可以分为两种。 静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存
- 集成配置步骤步骤1:加入 Maven 相关依赖<!-- 指定 Springboot 版本 --><parent> &
- 前言建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一
- 建立工程前需要导入POI包。POI相关jar包下载地址:http://poi.apache.org/download.html1.解析.xl
- 一般我们在controller层调用service时,只需要使用@Autowired注解即可,例如如下代码我们经常看到:@RestContr
- 问题(1)自己动手写一个锁需要哪些知识?(2)自己动手写一个锁到底有多简单?(3)自己能不能写出来一个完美的锁?简介本篇文章的目标一是自己动
- Spring AOP后置通知修改响应httpstatus1.定义Aspect/** * 响应体切面 * 后置通知修改httpstatus *
- 1.1、获取http请求参数是一种刚需我想有的小伙伴肯定有过获取http请求的需要,比如想前置获取参数,统计请求数据做服务的接口签名校验敏感
- 为什么要使用路由在之前我们的代码中,页面跳转使用的代码如下所示:Navigator.of(context).push( Mate
- 本文介绍了Spring Boot 开发REST接口最佳实践,分享给大家,具体如下:HTTP动词与SQL命令对应GET从服务器获取资源,可一个
- 约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;