我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android学习之文件存储读取

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android学习之文件存储读取

前言

相信大家都知道知道,在AndroidOS中,提供了五中数据存储方式,分别是:ContentProvider存储、文件存储、SharedPreference存储、SQLite数据库存储、网络存储。那么这一篇,我们介绍文件存储。

1.Android文件的操作模式

学过Java的同学都知道,我们新建文件,然后就可以写入数据了,但是Android却不一样,因为Android是 基于Linux的,我们在读写文件的时候,还需加上文件的操作模式,Android中的操作模式如下:

2、文件的操作模式

我们在学Java的时候都知道,Java中的IO操作来进行文件的保存和读取,Android是基于Linux的,与Java不同的是Android在Context类中封装好了输入流和输出流的获取方法,分别是: FileInputStream openFileInput(String name); FileOutputStream(String name , int mode),这两个方法第一个参数 用于指定文件名,第二个参数指定打开文件的模式。Android提供的文件模式有:

1.MODE_PRIVATE:Android提供的默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容。

2.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。

3.MODE_WORLD_READABLE:表示当前文件可以被其他应用读取;

4.MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。

此外,Android还提供了其它几个重要的文件操作的方法:

1.getDir(String name , int mode):在应用程序的数据文件夹下获取或者创建name对应的子目录

2.File getFilesDir():获取app的data目录下的绝对路径

3.String[] fileList():返回app的data目录下数的全部文件

4.deleteFile(String fileName):删除app的data目录下的指定文件

3、读写文件

Android的读写文件和Java一样,也是一样通过IO操作实现,下面我们通过一个简单的例子走一下这个流程:

布局文件代码:


<?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"
android:padding="16dp">
<EditText
  android:id="@+id/ed_file_save"
  android:layout_width="match_parent"
  android:layout_height="wrap_content" />
<Button
  android:id="@+id/btn_file_save"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:layout_marginTop="10dp"
  android:text="保存内容" />
<Button
  android:id="@+id/btn_file_read"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:layout_marginTop="10dp"
  android:text="读取内容" />
<TextView
  android:id="@+id/tv_read_file"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:layout_marginTop="10dp"
  android:textColor="#000"
  android:textSize="14sp" />
</LinearLayout>

Activity代码:


package com.example.datasave;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileDataActivity extends AppCompatActivity {
private EditText ed_file_save;
private Button btn_file_save;
private Button btn_file_read;
private TextView tv_read_file;
private String fileName = " hello.txt";
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_file);
  ed_file_save = (EditText) findViewById(R.id.ed_file_save);
  btn_file_save = (Button) findViewById(R.id.btn_file_save);
  btn_file_read = (Button) findViewById(R.id.btn_file_read);
  tv_read_file = (TextView) findViewById(R.id.tv_read_file);
  btn_file_save.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
      String fileContent = ed_file_save.getText().toString();
      try {
        save(fileContent);
        ToastUtils.showToast(FileDataActivity.this, "文件写入成功");
      } catch (Exception e) {
        e.printStackTrace();
        ToastUtils.showToast(FileDataActivity.this, "文件写入失败");
      }
    }
  });
  btn_file_read.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
      try {
        String content = read();
        tv_read_file.setText("文件的内容是:" + content);
      } catch (IOException e) {
        e.printStackTrace();
        ToastUtils.showToast(FileDataActivity.this, "读取文件失败!");
      }
    }
  });
}
public void save(String fileContent) throws Exception {
  FileOutputStream output = this.openFileOutput(fileName, Context.MODE_PRIVATE);
  output.write(fileContent.getBytes());
  output.close();
}
public String read() throws IOException {
  //打开文件输入流
  FileInputStream input = this.openFileInput(fileName);
  byte[] temp = new byte[1024];
  StringBuffer stringBuffer = new StringBuffer("");
  int len = 0;
  while ((len = input.read(temp)) > 0) {
    stringBuffer.append(new String(temp, 0, len));
  }
  //关闭输入流
  input.close();
  return stringBuffer.toString();
}
}

最后是实现效果图:

这里文件使用的模式是私有模式,只能本应用读取还会覆盖原文件,这样就可以实现简单的文件读写。

4、读写SDcard的文件

读写SDCard需要权限:


<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

对设备读写SDCard的时候需要判断SDCard是否存在,很多手机是不存在SDcard的,下面我们对SDCard的读写中会有体现,下面我们一起通过例子实现SDCard的读写操作

首先是布局文件代码:


<EditText
  android:id="@+id/ed_file_save_sd"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:layout_marginTop="20dp" />
<Button
  android:id="@+id/btn_file_save_sd"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:layout_marginTop="10dp"
  android:text="写入到SDcard" />
<Button
  android:id="@+id/btn_file_read_sd"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:layout_marginTop="10dp"
  android:text="从SDcard读取" />
<TextView
  android:id="@+id/tv_read_file_sd"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:layout_marginTop="10dp"
  android:textColor="#000"
  android:textSize="14sp" />

Activity代码:


  ed_file_save_sd = (EditText) findViewById(R.id.ed_file_save_sd);
  tv_read_file_sd = (TextView) findViewById(R.id.tv_read_file_sd);
  btn_file_read_sd = (Button) findViewById(R.id.btn_file_read_sd);
  btn_file_read_sd.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
      try {
        String content = readFromSD();
        tv_read_file_sd.setText("从SDCard读取到的内容是:" + content);
      } catch (Exception e) {
        e.printStackTrace();
        ToastUtils.showToast(FileDataActivity.this, "读取文件失败!");
      }
    }
  });
  btn_file_save_sd = (Button) findViewById(R.id.btn_file_save_sd);
  btn_file_save_sd.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
      String content = ed_file_save_sd.getText().toString();
      try {
        save2SDCard(content);
        ToastUtils.showToast(FileDataActivity.this, "文件写入SDCard成功");
      } catch (Exception e) {
        e.printStackTrace();
        ToastUtils.showToast(FileDataActivity.this, "文件写入SDCard失败");
      }
    }
  });
public void save2SDCard(String content) throws Exception {
  if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { // 如果sdcard存在
    String fileName3 = Environment.getExternalStorageDirectory().getCanonicalPath() + File.separator + "test" + File.separator + fileName2;
    File file = new File(fileName3);
    if (!file.getParentFile().exists()) {
      file.getParentFile().mkdir();
    }
    FileOutputStream fileOutputStream = new FileOutputStream(file);
    fileOutputStream.write(content.getBytes());
    fileOutputStream.close();
  } else {
    ToastUtils.showToast(this, "SDCard不存在");
  }
}
public String readFromSD() throws Exception {
  StringBuffer stringBuffer = new StringBuffer("");
  if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
    String fileName3 = Environment.getExternalStorageDirectory().getCanonicalPath() + File.separator + "test" + File.separator + fileName2;
    File file = new File(fileName3);
    if (!file.getParentFile().exists()) {
      file.getParentFile().mkdir();
    }
    FileInputStream fileInputStream = new FileInputStream(file);
    byte[] temp = new byte[1024];
    int len = 0;
    while ((len = fileInputStream.read(temp)) > 0) {
      stringBuffer.append(new String(temp, 0, len));
    }
    fileInputStream.close();
  } else {
    ToastUtils.showToast(this, "SDCard不存在");
  }
  return stringBuffer.toString();
}

SDCard的读取和文件操作差不多,需要判断SDCard是否存在,最后是效果图:

5、读取raw和assets文件的数据

  raw/res中的文件会被映射到Android的R文件中,我们直接通过R文件就可以访问,这里就不在过多介绍了。

  assets中的文件不会像raw/res中的文件一样被映射到R文件中,可以有目录结构,Android提供了一个访问assets文件的AssetManager对象,我们访问也很简单:


AssetManager assetsManager = getAssets(); 
InputStream inputStream = assetsManager.open("fileName");

这样就可以直接获取到assets目录下的资源文件。

AndroidOS的文件存储就简单介绍到这里,下面提供一些文件存储的工具方法:


package com.example.datasave.io;
import android.content.Context;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class IOUtils {

public static void write(String filePath, String content, boolean append) {
  BufferedWriter bufw = null;
  try {
    bufw = new BufferedWriter(new OutputStreamWriter(
        new FileOutputStream(filePath, append)));
    bufw.write(content);
  } catch (Exception e1) {
    e1.printStackTrace();
  } finally {
    if (bufw != null) {
      try {
        bufw.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }
}

public static String read(String path) {
  BufferedReader bufr = null;
  try {
    bufr = new BufferedReader(new InputStreamReader(
        new FileInputStream(path)));
    StringBuffer sb = new StringBuffer();
    String str = null;
    while ((str = bufr.readLine()) != null) {
      sb.append(str);
    }
    return sb.toString();
  } catch (Exception e) {
    e.printStackTrace();
  } finally {
    if (bufr != null) {
      try {
        bufr.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }
  return null;
}

public static String read(InputStream is) {
  BufferedReader bufr = null;
  try {
    bufr = new BufferedReader(new InputStreamReader(is));
    StringBuffer sb = new StringBuffer();
    String str = null;
    while ((str = bufr.readLine()) != null) {
      sb.append(str);
    }
    return sb.toString();
  } catch (Exception e) {
    e.printStackTrace();
  } finally {
    if (bufr != null) {
      try {
        bufr.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }
  return null;
}

public static byte[] readBytes(Context context, String fileName) {
  FileInputStream fin = null;
  byte[] buffer = null;
  try {
    fin = context.openFileInput(fileName);
    int length = fin.available();
    buffer = new byte[length];
    fin.read(buffer);
  } catch (FileNotFoundException e) {
    e.printStackTrace();
  } catch (IOException e) {
    e.printStackTrace();
  } finally {
    try {
      if (fin != null) {
        fin.close();
        fin = null;
      }
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
  return buffer;
}

public static String read(Context context, String filename)
    throws IOException {
  FileInputStream inStream = context.openFileInput(filename);
  ByteArrayOutputStream outStream = new ByteArrayOutputStream();
  byte[] buffer = new byte[1024];
  int len = 0;
  while ((len = inStream.read(buffer)) != -1) {
    outStream.write(buffer, 0, len);
  }
  byte[] data = outStream.toByteArray();
  return new String(data);
}
}

好的,关于Android的数据存储与访问的文件读写就到这里,如果在学习本文中遇到什么问题,或者觉得有些纰漏的地方,欢迎提出,万分感激,谢谢~

您可能感兴趣的文章:详解Android数据存储之Android 6.0运行时权限下文件存储的思考Android权限管理之Permission权限机制及使用详解Android需要提升权限的操作方法安卓Android6.0权限动态获取操作示例android6.0运行时权限完美封装方法Android内部存储改变读取权限的方法


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android学习之文件存储读取

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android学习之文件存储读取

前言 相信大家都知道知道,在AndroidOS中,提供了五中数据存储方式,分别是:ContentProvider存储、文件存储、SharedPreference存储、SQLite数据库存储、网络存储。那么这一篇,我们介绍文件存储。 1.An
2022-06-06

Android学习之SharedPerference存储详解

SharedPerference不同同于文件存储,它是使用键值的方式来存储数据,对于保存的每一条数据都会给一个键值,这样在读取数据时直接通过键值取出相应数据。amdroid提供了三个方法来获取实例:1.Context类中的getShareP
2023-05-30

android数据存储之文件存储方法

文件存储是 Android 中最基本的一种数据存储方式,它不对存储的内容进行任何的格式化处理,所有数据都是原封不动的保存到文件当中的。概述 文件存取的核心就是输入流和输出流。 Android文件的操作模式 文件的相关操作方法文件读写的实现
2022-06-06

Android中的数据储存之文件存储

当我们在使用各种程序时,其实际上是在和各种数据打交道,当我们聊QQ,刷微博,看新闻,其实都是在和里面的数据交互例如在聊天时发出的消息,以及在登录时输入的账号密码,其实都是瞬时数据,那什么是瞬时数据呢?就是指储存在内存中,有可能因为程序关闭或
2023-06-04

Android实现文件存储并读取的示例代码

要求: 输入文件名,文件内容分别存储在手机内存和外存中,并且都可以读去取出来。 步骤: 1.创建一个名为CDsaveFile的Android项目 2.编写布局文件activity_main.xml:
2022-06-06

Android基础教程数据存储之文件存储

Android基础教程数据存储之文件存储将数据存储到文件中并读取数据1、新建FilePersistenceTest项目,并修改activity_main.xml中的代码,如下:(只加入了EditText,用于输入文本内容,不管输入什么按下b
2023-05-30

java如何读取nas存储上的文件

在Java中,可以使用Java的文件输入流来读取NAS存储上的文件。以下是一个示例代码:import java.io.BufferedReader;import java.io.FileReader;import java.io.IO
java如何读取nas存储上的文件
2024-04-23

Android开发实现读取Assets下文件及文件写入存储卡的方法

本文实例讲述了Android开发实现读取Assets下文件及文件写入存储卡的方法。分享给大家供大家参考,具体如下:调用一个反编译的.so文件,查看起加密和解密情况,需要解析上万的数组,而so文件加密解密都是通过Byte来进行,又需要把Str
2023-05-30

Python教程:学习如何读取.py文件

可以通过以下两种方式读取 .py 文件并导入自定义模块:使用 importlibimportlib 模块提供了 import_module() 函数,可动态导入文件,并返回指向导入模块的引用。 使用 open()open() 函数可打开文件
Python教程:学习如何读取.py文件
2024-04-04

21天学习android开发教程之SQLite分页读取

Android包含了常用于嵌入式系统的SQLite,免去了开发者自己移植安装的功夫。SQLite 支持多数 SQL92 标准,很多常用的SQL命令都能在SQLite上面使用,除此之外Android还提供了一系列自定义的方法去简化对SQLit
2022-06-06

Android学习笔记-保存文件(Saving Files)

Android设备有两种文件存储区域: 内部存储和外部存储 ("internal" and "external" storage)。 这名字来自早期Android,那时大多数Android设备提供两种存储方式:内置的非易失的内存(内部存储)
2022-06-06

Android学习之使用SharedPreferences存储应用程序数据

本文介绍了SharedPreferences保存应用程序数据的具体步骤,供大家参考,具体内容如下 1、SharedPreferences的简单介绍 应用程序在运行的时候,可能会随着用户的使用而保持该用户的配置信息,如上次播放时的eq设置,音
2022-06-06

Android 数据库文件存取至储存卡的方法

废话不多说了,直接给大家贴代码了,具体代码如下 2022-06-06

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录