热门标签 | 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" ;


推荐阅读
  • 动态壁纸 LiveWallPaper:让您的桌面栩栩如生(第二篇)
    在本文中,我们将继续探讨如何开发动态壁纸 LiveWallPaper,使您的桌面更加生动有趣。作为 2010 年 Google 暑期大学生博客分享大赛 Android 篇的一部分,我们将详细介绍 Ed Burnette 的《Hello, Android》第三版中的相关内容,并分享一些实用的开发技巧和经验。通过本篇文章,您将了解到如何利用 Android SDK 创建引人入胜的动态壁纸,提升用户体验。 ... [详细]
  • 推荐:利用Dapper.SimpleCRUD扩展Dapper功能以简化CRUD操作
    Dapper作为广受欢迎的ORM框架之一,虽然灵活性极高,但在处理基本的CRUD操作时仍需手动编写SQL语句,这无疑增加了开发工作量。为了解决这一问题,Dapper.SimpleCRUD扩展库应运而生。该扩展库通过提供简洁的方法,显著简化了数据访问层的开发流程,使开发者能够更加高效地进行读取、插入、更新和删除操作。此外,Dapper.SimpleCRUD还支持事务管理和批量操作,进一步提升了开发效率和代码可维护性。 ... [详细]
  • Syncnavigator激活工具及破解方法详解
    本文详细介绍了Syncnavigator激活工具的使用方法及其破解技巧。用户可以通过访问官方网站www.SyncNavigator.CN获取相关资源,并通过客服QQ 1793040获得技术支持和帮助。此外,文章还提供了详细的步骤说明和常见问题解答,以确保用户能够顺利激活并使用Syncnavigator软件。 ... [详细]
  • 在Eclipse中批量转换Java源代码文件的编码格式从GBK到UTF-8是一项常见的需求。通过编写简单的Java代码,可以高效地实现这一任务。该方法不仅适用于Java文件,还可以用于其他类型的文本文件编码转换。具体实现可以通过导入`java.io.File`类来操作文件系统,从而完成批量转换。此外,建议在转换过程中添加异常处理机制,以确保代码的健壮性和可靠性。 ... [详细]
  • SQLite数据库CRUD操作实例分析与应用
    本文通过分析和实例演示了SQLite数据库中的CRUD(创建、读取、更新和删除)操作,详细介绍了如何在Java环境中使用Person实体类进行数据库操作。文章首先阐述了SQLite数据库的基本概念及其在移动应用开发中的重要性,然后通过具体的代码示例,逐步展示了如何实现对Person实体类的增删改查功能。此外,还讨论了常见错误及其解决方法,为开发者提供了实用的参考和指导。 ... [详细]
  • 在使用Block时,正确的声明方法和确保线程安全是至关重要的。为了保证Block在堆中分配,应使用`copy`修饰符进行声明,因为栈中的Block与栈的生命周期绑定,容易导致内存问题。此外,还需注意Block捕获外部变量的行为,以避免潜在的循环引用和数据不一致问题。建议深入研究相关文档,以掌握更多高级技巧和最佳实践。 ... [详细]
  • 在尝试为 Unity 编译一个简单的 Java 库时,运行 `ant jar` 命令后遇到了 Java I/O 异常。具体错误信息为“无法启动程序 ${aAPT},错误代码 2”,这通常表示指定的文件或目录不存在。此问题可能是由于环境配置不正确或路径设置有误导致的。建议检查相关路径和环境变量,确保所有依赖项都已正确安装和配置。 ... [详细]
  • 基址获取与驱动开发:内核中提取ntoskrnl模块的基地址方法解析
    基址获取与驱动开发:内核中提取ntoskrnl模块的基地址方法解析 ... [详细]
  • 在近期的项目开发过程中,ORM层采用了MyBatis,并且需要连接多个数据库,这带来了多数据源配置的挑战。为了解决这一问题,我们可以通过巧妙运用注解来实现优雅的数据源切换,确保系统的灵活性和可维护性。这种方法不仅简化了配置,还提高了代码的可读性和扩展性。 ... [详细]
  • 如何在Android设备上通过应用程序创建浏览器书签 ... [详细]
  • InnoDB当前仅支持一次创建一个FULLTEXT索引 ... [详细]
  • Eclipse 编译错误:无法解析为类型,详细解决方法与常见原因分析
    在Eclipse开发环境中,编译错误“无法解析为类型”通常出现在以下情况:1. 之前运行正常的Eclipse项目,原始JDK版本为1.6;2. 系统中安装了新的JDK版本。本文将详细分析该错误的常见原因,并提供有效的解决方法,帮助开发者快速定位和解决问题。 ... [详细]
  • 本文详细介绍了在DS-5开发工作室中集成最新编译器工具链的方法与步骤。通过逐步指导,帮助用户高效地配置和使用最新的编译器,以提升开发效率和代码质量。此外,还提供了常见问题的解决方案和最佳实践建议,确保用户能够顺利进行开发环境的升级。 ... [详细]
  • Spring Security 认证模块的项目构建与初始化
    本文详细介绍了如何构建和初始化Spring Security认证模块的项目。首先,通过创建一个分布式Maven聚合工程,该工程包含四个模块,分别为core、browser(用于演示)、app等,以构成完整的SeehopeSecurity项目。在项目构建过程中,还涉及日志生成机制,确保能够输出关键信息,便于调试和监控。 ... [详细]
  • 基于Java和JSP的电子医疗记录管理平台
    随着信息技术的快速发展,各类管理系统已在各行各业得到广泛应用。传统的人工管理模式已逐渐无法满足现代需求。本文介绍了一种基于Java和JSP技术开发的电子医疗记录管理平台,旨在提高医疗行业的信息化水平和管理效率。该平台通过整合先进的数据库技术和Web开发框架,实现了医疗记录的高效存储、查询和管理,为医护人员提供了便捷的操作界面和强大的数据支持。 ... [详细]
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社区 版权所有