热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

Android数据存储之FileInputStream工具类及FileInputStream类的使用

这篇文章主要介绍了Android数据存储之FileInputStream工具类及FileInputStream类的使用的相关资料,需要的朋友可以参考下

安卓的三种本地的典型数据存储方式

SharedPreferences

以文件格式保存在本地存储中

SQL数据库

这篇文章就是讲解一下如何使用 SharedPreferences 保存文件。主要解释什么都写在注释里面的。

IDE : Android Studio

参考文章:https://www.jb51.net/article/74215.htm

絮叨一下:本来文件操作这一块上周就想把其弄懂,然后继续进一步的学习。但是因为官方的 Android Training 之中的概念太过于繁杂。导致我认为存储到内部之中要查询空间,得到返回之类。结果是因为我把保存在内部空间(data目录下的包名下的file文件夹)与外部空间(存储空间)的概念混淆。所以耽误了大量时间并且不得法。最后还是看到参考文章才知道应该怎么去写。然后自己跟着参考文章过了一遍。

同样的,我采用了分离写法,也就是创建一个工具类,模块化方便使用。希望能帮助到别人,也是给自己建立一种概念。

话不多说,上代码:

import android.content.Context;
import android.util.Log;
import java.io.FileInputStream;
import java.io.FileOutputStream;
/**
* Created by zhizhao on 2015/11/1 0001 in 16:00.
*/
public class UsingFileInputStream {
private Context fileContext;
private String fileName;
private String fileUserName;
private String filePassword;
public UsingFileInputStream(String name, Context context, String userName, String password) {
this.fileName = name;
this.fileCOntext= context;
this.fileUserName = userName;
this.filePassword = password;
}
//保存的时候是在文件内容中连续写入,也就是在之前保存的数据基础上再次写入。
public void writeFileInputStream() {
try {
FileOutputStream fileOutputStream = fileContext.openFileOutput(fileName,
fileContext.MODE_PRIVATE);
byte[] byteUserName = fileUserName.getBytes();
byte[] bytePassword = filePassword.getBytes();
fileOutputStream.write(byteUserName);
fileOutputStream.write(bytePassword);
Log.v("FileInputStream保存结果 ", "UserName = " + fileUserName + " Password = " + filePassword);
fileOutputStream.flush();
fileOutputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
//读取文件是把整个文件的内容进行读取。如果要加入解析,则保存的时候保存为特殊格式。
public void readFileInputStream() {
try {
FileInputStream fileInputStream = fileContext.openFileInput(fileName);
int len = fileInputStream.available();
byte[] buffer = new byte[len];
fileInputStream.read(buffer);
Log.v("读取到的文件为:", ""+new String(buffer));
fileInputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}

下面是使用:

private void writeFile(){
UsingFileInputStream fileInputStream = new UsingFileInputStream("account",
MySaveDataActivity.this, userName, userPass);
fileInputStream.writeFileInputStream();
tvReadInformation.setText("保存成功!" + "\n UserName = " + userName + "\n UserPass = " + userPass);
}
private void readFile(){
UsingFileInputStream fileInputStream = new UsingFileInputStream("account",
MySaveDataActivity.this, userName, userPass);
fileInputStream.readFileInputStream();
tvReadInformation.setText("读取成功!"+"\n UserName = "+userName+"\n UserPass = "+userPass);
}

总结一下:

我觉得自己目前写的也不是很对,很完美。因为在调用过程中要反复去填写文件名,传入值。并且在返回值之中很难知道成功失败。

况且我并没有把文件异常捕获并进行操作,因为如果是没有文件的情况下去操作的话,必然会报错:空指针异常。

不过既然是练习也就没考虑那么多,因为这种时候只要在 try{}catch(){} 代码块里面加入自己的操作手段就可以了。

下面还有点时间接着给大家介绍Android FileInputStream类的使用

1.FileInputStream类概述

    继承关系:

       java.io.FileInputStream->java.io.InputStream->java.lang.Object

实现接口:

       Closeable    

 类的功能:

    FileInputStream 从文件系统中的某个文件中获取输入字节。哪些文件可用取决于主机环境。

       FileInputStream 用于读取诸如图像数据之类的原始字节流。要读取字符流,请考虑使用 FileReader。

2.类的属性和行为

   (1) public void close() throws IOException

    功能:  关闭此文件输入流并释放与此流有关的所有系统资源。

            如果此流有一个与之关联的通道,则关闭该通道。

    指定者:接口 Closeable 中的 close

    覆盖:  类 InputStream 中的 close

    抛出:  IOException - 如果发生 I/O 错误。

   (2) public int read() throws IOException

    功能:  从此输入流中读取一个数据字节。如果没有输入可用,则此方法将阻塞。

    指定者:类 InputStream 中的 read

    返回:  下一个数据字节;如果已到达文件末尾,则返回 -1。

    抛出:  IOException - 如果发生 I/O 错误。

   (3) public int read(byte[] b) throws IOException

    功能:从此输入流中将最多b.length个字节的数据读入一个字节数组中。在某些输入可用前,此方法将阻塞

    覆盖:类 InputStream 中的 read

    参数:b - 存储读取数据的缓冲区

    返回:读入缓冲区的字节总数,如果因为已经到达文件末尾而没有更多的数据,则返回 -1。

    抛出:IOException - 如果发生 I/O 错误。

   (4) public int read(byte[] b, int off, int len) throws IOException

    功能:从此输入流中将最多len个字节的数据读入一个字节数组中。在某些输入可用之前,此方法将阻塞。

    覆盖:类 InputStream 中的 read

    参数:b - 存储读取数据的缓冲区。

          off - 数据的起始偏移量。

          len - 读取的最大字节数。

    返回:读入缓冲区的字节总数,如果因为已经到达文件末尾而没有更多的数据,则返回 -1。

    抛出:IOException - 如果发生 I/O 错误。

3.常见错误

   在eclipse下使用FileInputStream,提示找不到指定文件

   代码:

 filename = "abc.txt" ;
  FileInputStream fis = new FileInputStream(filename);

   错误显示:

 java.io.FileNotFoundException: dbconfig.properties (系统找不到指定的文件。)
  at java.io.FileInputStream.open(Native Method)
  at java.io.FileInputStream.(FileInputStream.java:106)
  at java.io.FileInputStream.(FileInputStream.java:66)

   解决方法:

       因为eclipse下运行main程序时,eclipse会自动将发布目录作为其根目录,所以会提示找不到文件,将filename改为绝对目录即可

      filename = "\sdcard\...\abc.txt" ;


推荐阅读
  • 本文详细介绍了IBM DB2数据库在大型应用系统中的应用,强调其卓越的可扩展性和多环境支持能力。文章深入分析了DB2在数据利用性、完整性、安全性和恢复性方面的优势,并提供了优化建议以提升其在不同规模应用程序中的表现。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • 在Linux系统中配置并启动ActiveMQ
    本文详细介绍了如何在Linux环境中安装和配置ActiveMQ,包括端口开放及防火墙设置。通过本文,您可以掌握完整的ActiveMQ部署流程,确保其在网络环境中正常运行。 ... [详细]
  • 本文总结了在使用Ionic 5进行Android平台APK打包时遇到的问题,特别是针对QRScanner插件的改造。通过详细分析和提供具体的解决方法,帮助开发者顺利打包并优化应用性能。 ... [详细]
  • 本文详细介绍了如何在 Linux 平台上安装和配置 PostgreSQL 数据库。通过访问官方资源并遵循特定的操作步骤,用户可以在不同发行版(如 Ubuntu 和 Red Hat)上顺利完成 PostgreSQL 的安装。 ... [详细]
  • 本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ... [详细]
  • SQLite 动态创建多个表的需求在网络上有不少讨论,但很少有详细的解决方案。本文将介绍如何在 Qt 环境中使用 QString 类轻松实现 SQLite 表的动态创建,并提供详细的步骤和示例代码。 ... [详细]
  • 精选30本C# ASP.NET SQL中文PDF电子书合集
    欢迎订阅我们的技术博客,获取更多关于C#、ASP.NET和SQL的最新资讯和资源。 ... [详细]
  • 解决JAX-WS动态客户端工厂弃用问题并迁移到XFire
    在处理Java项目中的JAR包冲突时,我们遇到了JaxWsDynamicClientFactory被弃用的问题,并成功将其迁移到org.codehaus.xfire.client。本文详细介绍了这一过程及解决方案。 ... [详细]
  • 本文详细介绍了如何准备和安装 Eclipse 开发环境及其相关插件,包括 JDK、Tomcat、Struts 等组件的安装步骤及配置方法。 ... [详细]
  • 探索如何使用公共数据集为您的编程项目提供动力。无论您是编程新手还是有经验的开发者,本文将为您提供实用建议和资源,帮助您启动并运行一个创新的数据驱动型项目。 ... [详细]
  • Git管理工具SourceTree安装与使用指南
    本文详细介绍了Git管理工具SourceTree的安装、配置及团队协作方案,旨在帮助开发者更高效地进行版本控制和项目管理。 ... [详细]
  • 在创建新的Android项目时,您可能会遇到aapt错误,提示无法打开libstdc++.so.6共享对象文件。本文将探讨该问题的原因及解决方案。 ... [详细]
  • 深入理解ExtJS:从入门到精通
    本文详细介绍了ExtJS的功能及其在大型企业前端开发中的应用。通过实例和详细的文件结构解析,帮助初学者快速掌握ExtJS的核心概念,并提供实用技巧和最佳实践。 ... [详细]
author-avatar
文艺范老大叔
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有