Android 数据存储之 FileInputStream 工具类及FileInputStream类的使用
安卓的三种本地的典型数据存储方式
SharedPreferences
以文件格式保存在本地存储中
SQL数据库
这篇文章就是讲解一下如何使用SharedPreferences保存文件。主要解释什么都写在注释里面的。
IDE:AndroidStudio
参考文章:https://www.nhooo.com/article/74215.htm
絮叨一下:本来文件操作这一块上周就想把其弄懂,然后继续进一步的学习。但是因为官方的AndroidTraining之中的概念太过于繁杂。导致我认为存储到内部之中要查询空间,得到返回之类。结果是因为我把保存在内部空间(data目录下的包名下的file文件夹)与外部空间(存储空间)的概念混淆。所以耽误了大量时间并且不得法。最后还是看到参考文章才知道应该怎么去写。然后自己跟着参考文章过了一遍。
同样的,我采用了分离写法,也就是创建一个工具类,模块化方便使用。希望能帮助到别人,也是给自己建立一种概念。
话不多说,上代码:
importandroid.content.Context; importandroid.util.Log; importjava.io.FileInputStream; importjava.io.FileOutputStream; /** *Createdbyzhizhaoon2015/11/10001in16:00. */ publicclassUsingFileInputStream{ privateContextfileContext; privateStringfileName; privateStringfileUserName; privateStringfilePassword; publicUsingFileInputStream(Stringname,Contextcontext,StringuserName,Stringpassword){ this.fileName=name; this.fileContext=context; this.fileUserName=userName; this.filePassword=password; } //保存的时候是在文件内容中连续写入,也就是在之前保存的数据基础上再次写入。 publicvoidwriteFileInputStream(){ try{ FileOutputStreamfileOutputStream=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(Exceptione){ e.printStackTrace(); } } //读取文件是把整个文件的内容进行读取。如果要加入解析,则保存的时候保存为特殊格式。 publicvoidreadFileInputStream(){ try{ FileInputStreamfileInputStream=fileContext.openFileInput(fileName); intlen=fileInputStream.available(); byte[]buffer=newbyte[len]; fileInputStream.read(buffer); Log.v("读取到的文件为:",""+newString(buffer)); fileInputStream.close(); }catch(Exceptione){ e.printStackTrace(); } } }
下面是使用:
privatevoidwriteFile(){ UsingFileInputStreamfileInputStream=newUsingFileInputStream("account", MySaveDataActivity.this,userName,userPass); fileInputStream.writeFileInputStream(); tvReadInformation.setText("保存成功!"+"\nUserName="+userName+"\nUserPass="+userPass); } privatevoidreadFile(){ UsingFileInputStreamfileInputStream=newUsingFileInputStream("account", MySaveDataActivity.this,userName,userPass); fileInputStream.readFileInputStream(); tvReadInformation.setText("读取成功!"+"\nUserName="+userName+"\nUserPass="+userPass); }
总结一下:
我觉得自己目前写的也不是很对,很完美。因为在调用过程中要反复去填写文件名,传入值。并且在返回值之中很难知道成功失败。
况且我并没有把文件异常捕获并进行操作,因为如果是没有文件的情况下去操作的话,必然会报错:空指针异常。
不过既然是练习也就没考虑那么多,因为这种时候只要在try{}catch(){}代码块里面加入自己的操作手段就可以了。
下面还有点时间接着给大家介绍AndroidFileInputStream类的使用
1.FileInputStream类概述
继承关系:
java.io.FileInputStream->java.io.InputStream->java.lang.Object
实现接口:
Closeable
类的功能:
FileInputStream从文件系统中的某个文件中获取输入字节。哪些文件可用取决于主机环境。
FileInputStream用于读取诸如图像数据之类的原始字节流。要读取字符流,请考虑使用FileReader。
2.类的属性和行为
(1)publicvoidclose()throwsIOException
功能: 关闭此文件输入流并释放与此流有关的所有系统资源。
如果此流有一个与之关联的通道,则关闭该通道。
指定者:接口Closeable中的close
覆盖: 类InputStream中的close
抛出: IOException-如果发生I/O错误。
(2)publicintread()throwsIOException
功能: 从此输入流中读取一个数据字节。如果没有输入可用,则此方法将阻塞。
指定者:类InputStream中的read
返回: 下一个数据字节;如果已到达文件末尾,则返回-1。
抛出: IOException-如果发生I/O错误。
(3)publicintread(byte[]b)throwsIOException
功能:从此输入流中将最多b.length个字节的数据读入一个字节数组中。在某些输入可用前,此方法将阻塞
覆盖:类InputStream中的read
参数:b-存储读取数据的缓冲区
返回:读入缓冲区的字节总数,如果因为已经到达文件末尾而没有更多的数据,则返回-1。
抛出:IOException-如果发生I/O错误。
(4)publicintread(byte[]b,intoff,intlen)throwsIOException
功能:从此输入流中将最多len个字节的数据读入一个字节数组中。在某些输入可用之前,此方法将阻塞。
覆盖:类InputStream中的read
参数:b-存储读取数据的缓冲区。
off-数据的起始偏移量。
len-读取的最大字节数。
返回:读入缓冲区的字节总数,如果因为已经到达文件末尾而没有更多的数据,则返回-1。
抛出:IOException-如果发生I/O错误。
3.常见错误
在eclipse下使用FileInputStream,提示找不到指定文件
代码:
filename="abc.txt"; FileInputStreamfis=newFileInputStream(filename);
错误显示:
java.io.FileNotFoundException:dbconfig.properties(系统找不到指定的文件。) atjava.io.FileInputStream.open(NativeMethod) atjava.io.FileInputStream.<init>(FileInputStream.java:106) atjava.io.FileInputStream.<init>(FileInputStream.java:66)
解决方法:
因为eclipse下运行main程序时,eclipse会自动将发布目录作为其根目录,所以会提示找不到文件,将filename改为绝对目录即可
filename="\sdcard\...\abc.txt";