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,一旦程序代码无法编译,再不得不使用面向字节流的类库。
对比:更改流的行为
对于InputStream和OutputStream来说,我们会使用FilterInputStream和FilterOutputStream的装饰器子类来修改流以满足特殊需要。Reader和Writer的类继承层次结构继续沿用相同的思想但并不完全相同
4000
。
在下表中,相对于上一个表格来说,左右之间的对应关系的近视程度更加粗略一些,造成这种差别的原因是因为类的组织形式不同,尽管BufferedOutputStream是FilterOutputStream,但是BufferedWriter并不是FilterWriter的子类(尽管FilterWriter是抽象类,没有任何子类,把它放在那里也只是把它作为一个占位符,或仅仅让我们不会对它所在的地方产生疑惑)。然而,这些类的接口却十分相似。
文件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。
参考:
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
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法