386

JAVA中IO分割流

2015.04.25 没有评论 157次

想写点技术类的文章,但是有没想到要写什么,那就写个之前遇到的问题把。

最近在做项目的时候,遇到一个问题,对某个文件进行读写操作时,需要将一个文件写入另一个文件的某一个位置,然后合成一个文件,然后在网上进行传输。流程如下图,f1和是原始的文件,然后现在需要将f2文件插入f1文件中。

20150425164437

大家可能看了觉得太简单了,直接拿到f1的OutputStream,然后直接写入f2就行了吧。如下代码:

先封装了一个工具类


调用时代码实例:


就是如此简单啊!!!SO Easy~

但是,为了保证文件的完整性,需要下面的功能:

写:现备份原有文件,如果文件写入成功,删除备份文件;如果写入失败,恢复备份文件。

读:查看要读的文件是否存在,如果不存在,则读取备份文件。

这样的话,就需要在文件读写之前都进行特殊处理才行,如何实现呢?

我采取了一个办法,写的时候不直接写入目标文件,而是写入一个临时文件,当写完之后,再把临时文件替换到目标文件上。

读取的时候先判断目标文件是否存在,如果存在直接读取,如果不存在,判断备份文件是否存在,如果存在,还原备份文件并读取。

20150425175300

写文件

20150425173952

读文件


先定义一个文件备份和还原工具类。


然后分别定义输入输出流如下,我是直接实现了InputStream和OutStream接口

输出流


然后在定义一个工具类,对上面的方法包装一下,易于调用


然后每次就可以至调用DataStoreUtils类来完成文件的读写操作,可以在制定位置插入内容,并且能保证文件的正确性。

其中需要注意的是,在重写输出流和输入流的时候,如果流的来源是文件,必须把流用BufferedXXStream封装起来,不然在调用下面方法时,会从文件里一个字节一个字节的读写,导致性能下降。



完:本文共1086字
标签: , ,
相关文章:
发表评论
icon_wink.gif icon_neutral.gif icon_mad.gif icon_twisted.gif icon_smile.gif icon_eek.gif icon_sad.gif icon_rolleyes.gif icon_razz.gif icon_redface.gif icon_surprised.gif icon_mrgreen.gif icon_lol.gif icon_idea.gif icon_biggrin.gif icon_evil.gif icon_cry.gif icon_cool.gif icon_arrow.gif icon_confused.gif icon_question.gif icon_exclaim.gif