----------------------- android培训、java培训、java学习型技术博客、期待与您交流! -----------------
IO流体系图
装饰与继承图解:
通过例图,通过装饰设计模式设计的 Reader 体系明朗、结构简单。 而使用继承体系的Reader结构臃肿、扩展性极差。
IO流---分析、使用世界
方法二:
通过刚才的例子,我们简单的了解分析并书写一个简单的IO代码。但是IO到底有什么作用?什么时候使用IO流呢?
我们通过实际需求来分析。
切割:
原理:将一个正常的文件,按照指定的大小存储为一个不被任何软件解析的类型。也就是所谓的一个源对应多个目的。
切割图解:
合并:
原理: 通过容器(Vector)存储需要操作的文件。将其存为一个目的。 通过枚举与 SequenceInputStream 相关联。将其输出。
合并图解:
通过以上图例,得出了一些结论:
无论是切割还是合并。其实都是对数据的操作。切割,其实就是将一个文件的数据,存储到多个文件当中。说白了,也就是一个源对应多个目的。 而合并也是这个原理,不同的只是多个源(文件)数据对应一个目的(文件)。
那么,关于什么时候使用IO流、IO有什么作用这个问题,我们就有很明确的答案了。
当我们需要对数据操作的时候就需要使用IO流,IO是用来处理数据之间的传输。
其实,对合并还有一种实现方法。
定义 BufferedInputStream srcFile = null; 通过循环的方法往 BufferedOutputStream 里添加数据。但是使用这种方法的扩展性比较差。在实际需求中,我们可能会对这些破损文件有其他的操作。使用这种方法,就需要重新定义一个循环来对其操作。在此就不再演示。将分析的图例贴出来。给大家参考:
Properties与IO流的关系:
void | load(InputStream inStream) 从输入流中读取属性列表(键和元素对)。 |
void | load(Reader reader) 按简单的面向行的格式从输入字符流中读取属性列表(键和元素对)。 |
String | getProperty(String key) 用指定的键在此属性列表中搜索属性。 |
Object | setProperty(String key, String value) 调用 Hashtable 的方法 put 。 |
void | store(Writer writer, String comments) comments 不可为中文以适合使用 load(Reader) 方法的格式,将此 Properties 表中的属性列表(键和元素对)写入输出字符。 |
properties----中文乱码
IO之递归分析
概述:递归就是自己调用自己。递归作为一种算法在程序设计语言中被广泛使用。
程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。
递归定义条件:
边界条件
边界执行段
递归执行段
下面,我们通过代码来说明:
图解:
现在,我们根据这个例题来对递归的定义条件进行分析。
边界条件:递归是自己调用自己,也就是说边界条件就是判断这个对象是不是传入本函数的对象。
在本题中,传入的对象是一个目录,而递归的条件也判断是否是目录
边界执行段:其实就是递归执行段,满足递归条件后所执行的代码。一般都是调用递归函数。
递归执行段:在查找资料的时候,看过的几个博客都是叫做递归返回段,但是感觉不怎么恰当。返回段的意思是必须要有返回的代码。但是实际的需求可能是执行某一功能,而不是返回值。这段代码是递归需要执行的代码,还不如叫递归执行段。 意思是说:递归中执行的代码。
关于边界条件的作用:
递归即自己调用自己,如果没有判断条件的话,就是一个死循环。而且可能出现异常。就如我这个例子,边界条件是:判断是否是文件夹。如果不定义边界条件的话,直接调用自己。在再次调用的时候File[] files = file.listFiles()就直接抛出 异常。导致程序中断。
当定义了边界条件,执行到没有文件夹的目录,就会删除所有文件。依次逐渐返回上一层。
就如打开糖盒一样,打开一个糖盒,里面有一个糖盒和几个糖,打开还,还有一个糖盒和几个糖。如果一直存在糖盒的话,就要一直打开,直到没有为止。然后让其中的糖拿出来(有人说,我先拿糖不行啊,非要先打开糖盒。。。我只能说,我举个例子而已,你当写代码啊。。那么较真)。
IO流之ByteArrayInputStream、ByteArrayOutputStream
通过查看API,发现IO中InputStream、OutputStream是抽象类。而其中read()与write(itn b )是唯一的抽象方法。
InputStream read()源码部分
FileInputStream与FileOutputStream中复写的read()与write(int b)是通过native 本地方法实现的。所以在使用完之后需要通过close()关闭资源链接
FileInputStream read()源码部分
而ByteArrayInputStream与ByteOutputStream中并没有 native 本地方法,而是直接对内存进行操作。所以就算close()也是没有实际意义
那么,ByteArrayInputStream与ByteArrayOutputStream到底有什么作用呢?
如果在程序在运行中产生一些临时文件,可以采用虚拟文件方式实现。而ByteArrayInputStream与ByteArrayOutputStream两个类可实现类拟于内存虚拟文件的功能。
以上是我对IO流的理解,如有不当之处,请各方豪杰指点。
本内容有些地方是参考别人,在其基础上加上自己的理解。
尊重版权:参考博客
http://blog.csdn.net/oracle_microsoft/article/details/2634231
----------------------- android培训 、 java培训 、java学习型技术博客、期待与您交流! -----------------