您的位置:首页 > 移动开发 > Android开发

Android学习第三课:I/O文件读写操作(一)

2015-06-20 13:26 369 查看
Android I/O文件读写操作基本类似Java的I/O文件读写操作,这里介绍Java的I/O文件读写操作。

File类

File类主要帮助我们处理文件目录问题,FIle类这个名字有一定的误导性,可能会被认为指代的是文件,实际上,它既能代表一个特定的文件,又能代表一个目录下的一组文件的名称,如果它指的是一个文件集,就可以调用list()方法,这个方法会返回一个字符串数组。

 



Java中“流”让人迷惑的主要原因就在于,创建单一的结果流,但却需要创建多个对象,Java I/O类库操作不便的原因在于,必须创建许多类,“核心”I/O类加上所有的装饰器,才能得到所希望的单个I/Od对象。

 

在Java1.0中,类库的设计者首先限定与输入有关的所有类都应该从InputStream继承,而与输出有关的所有类都应该从OutputStream继承。FilterInputStream和FilterOutputStream是用来提供装饰器类接口以控制特定输入流和输出牛的两个类。

  

Reader类和Writer类

InputStream和OutputStream在以面向字节形式的I/O中提供极有价值的功能,Reader和Writer类则提供兼容Unicode和面向字符的I/O功能。

设计Reader和Writer继承层次结构主要是为了国际化,老的I/O流层次结构仅支持8位字节流,并且不能很好地处理16位的Unicode字符,由于Unicode用于支付国际化(Java本身的char也是16位的Unicode),所以设计Reader和Writer。

 

对比:数据的来源和去处

几乎所有原始的Java I/O流类都有相应的Reader和Writer类提供天然的Unicode操作,然而在某些场合,面向字节的InputStream和OutputStream才是正确的解决方案,特别是某些类库就是面向字节而不是面向字符的,比如java.util.zip,因此最明智的做法是尽量尝试使用Reader和Writer,一旦程序代码无法编译,再不得不使用面向字节流的类库。

 

来源与去处:Java1.0类

相应的Java1.1类

InputStream

Reader

OutputStream

Writer

FileInputStream

FileReader

FileOutputStream

FileWriter

StringBuffeInputStreamr(弃用)

StringReader

无相应的类

StringWriter

ByteArrayInputtStream

CharArrayReader

ByteArrayOutputStream

CharArrayWriter

PipedInputStream

PipeReader

PipedOutputStream

PipedWriter

 

对比:更改流的行为

对于InputStream和OutputStream来说,我们会使用FilterInputStream和FilterOutputStream的装饰器子类来修改流以满足特殊需要。Reader和Writer的类继承层次结构继续沿用相同的思想但并不完全相同
4000


在下表中,相对于上一个表格来说,左右之间的对应关系的近视程度更加粗略一些,造成这种差别的原因是因为类的组织形式不同,尽管BufferedOutputStream是FilterOutputStream,但是BufferedWriter并不是FilterWriter的子类(尽管FilterWriter是抽象类,没有任何子类,把它放在那里也只是把它作为一个占位符,或仅仅让我们不会对它所在的地方产生疑惑)。然而,这些类的接口却十分相似。

 

过滤器:Java1.0类

相应的Java1.1类

FilterInputStream

FilterReader

FilterOutputStream

FilterWriter(抽象类,没有子类)

BufferedInputStream

BufferedReader

BufferedOutputStream

BufferedWriter

 

文件I/O操作中各类的关系(以字节操作类为例,字符操作类同)

InputStream和OutputStream是处理字节流的,以InputStream为例,它是抽象类,不能创建实例,InputStreamin=File.open("xxx.txt"),实际上是通过向上转型方式对in进行赋值;获取输入流,一般都是通过InputStream的子类进行赋值,比如new FileInputStream(File | path)。但这些操作虽然拿到输入流,但都不是通过缓冲输入进行I/O操作,而是直接和存储介质进行读写操作,效率极其低下,因此需要对输入流进行包装操作,即FilterInputStream,主要是通过其子类,如bufferedInputStream。各类的继承关系如下:



文件I/O操作中“字节”、“字符”协同配合

有时候在处理I/O操作中,必须把“字节”层次结构的类和“字符”层次结构中的类结合起来,为了实现这个目的,要用到适配器(adapter)类:InputStreamReader可以把InputStream转换为Reader,而OutputStreamWriter则可以把OutputStream转换为Writer。



参考:


FileInputStream 与 BufferedInputStream
效率对比


 http://www.cnblogs.com/hamhog/p/3550158.html

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android io 结构 java