0.
I/O有大量不同方案:
各种I/O源端和想要与之通信的接收端: 文件,控制台,网络链接
以多种不同的方式他们进行通信: 顺序,随机存取,缓冲,二进制,按字符,按行,按字
nio类:
目的是为了改进性能及功能
1.File类:
目录列表器:
全部列表:String[] list = f.list();
受限列表:String[] list = f.list(new DirFilter(str)); 传入的文件过滤器类需实现文件过滤器接口FilenameFilter(通过重写其accept()以及构造器传参值来实现过滤)
全部列表:File[] list = f.listFiles();
受限列表:File[] list = f.listFiles(new DirFilter(str)); 传入的文件过滤器类需实现文件过滤器接口FilenameFilter(通过重写其accept()以及构造器传参值来实现过滤)
FilenameFilter文件过滤器接口:
声明一个类比如DirFilter实现该接口,通过accept方法来过滤f中的文件,判断f的各文件是否要包含在生成的新文件列表中
例:
class DirFilter implement FilenameFilter{} //实现文件过滤器接口,用以文件目录过滤
String[] list = f.list(new DirFilter(str)); //文件的list()方法 传入指定字符串的DirFilter对象,最终返回file过滤后的字符串数组。
目录实用工具:
F f = new File(path);
String[] filenameList = f.list(); //list()返回字符串数组
File[] fileList = f.listFiles(); //listFiles()返回file数组
for(File item:fileList){
if(item.isDirectory()){ //file.isDirectory()判断是文件夹还是文件
//文件夹
result.dirs.add(item);
}ele{
//文件
result.files.add(item);
}
}
目录的检查及创建:
f.exists():是否存在
f.mkdirs():创建
f.isFile():是否为文件
f.isDirectory():是否为目录
2.输入和输出:InputStream
流代表任何有能力产出数据的数据源对象或者是有能力接收数据的接收端对象。流屏蔽了实际的I/O设备中处理数据的细节。
I/O类分为输入和输出俩部分,通过继承任何自InputStream或Reader派生出来的类都含有名为read()的基本方法,用于读取单个字节或字节数组。同样的,输出相关的也类似。
但是,我们一般不会用到这些方法,他们之所以存在是因为别的类可以使用它们,以便提供更有用的接口。
因此,我们很少使用单一的类来创建流对象,而是通过叠合多个对象来提供所期望的功能(这是装饰器设计模式)
实际上,java中流类库让人迷惑的主要原因就在于:创建单一的结果流,却需要创建多个对象。
在Java1.0中,类库的设计者限定与输入有关的类都应该从InputStream继承,而与输出有关的所有类都应该从OutputStream继承。
InputStream:
用来表示那些从不同数据源产生输入的类。
这些数据源包括:
字节数组:
ByteArrayInputStream:允许将内存的缓存区当做InputStream使用
String对象:
StringBufferInoutStream:将String转换成InputStream
文件:
FileInputStream:用于从文件中读取信息
管道:
PipedInputStream:实现“管道化”概念
其他种类的流组成的序列:
SequenceInputStream:将俩个或多个InputStream对象转换成单一InputStream
其他数据源:如Internet连接
FilterInputStream:抽象类,作为“装饰器”的接口。其中,“装饰器”为其他的InputStream类提供有用功能。
OutputStream同上。
3.添加属性和有用的接口:FilterInputStream(Filter-)
FilterInputStream:用来提供装饰器类接口以控制特定输入流(InputStream)。由InputStream派生而来。
允许我们读取不同的基本类型以及String对象:
DataInputStream:所有方法都以read开头,例如readByte(),readFloat()等等。
其他FilterInputStream类则在内部修改InputStream的行为方式:
BufferedInputStream:代表使用缓冲区。
FilterOutputStream:与FilterInputStream相比,多了PrintStream
DataOutputStream: 处理数据的存储(不同的基本类型以及String对象)
PrintStream: 处理数据的显示
BufferedOutputStream: 代表使用缓冲区
4.Reader和Writer:兼容Unicode与面向字符的I/O功能
设计Reader和Writer是为了在所有的I/O操作中都支持Unicode。另外,新类库的设计使得它的操作比旧类库更快。
数据的来源和去处:
几乎所有原始的Java I/O流类都有相应的Reader和Writer类来提供天然的Unicode操作。
然而在某些场合,面向字节的InputStream和OutputStream才是正确的解决方案。特别是,java.util.zip类库就是面向字节而不是面向字符的。
因此,最明智的做法是尽量尝试使用Reader和Writer,一旦程序代码无法成功编译,我们就会发现自己不得不使用面向对象的类库。
InputStream Reader
FileInputStream FileReader
ByteArrayInputStream CharArrayReader
PipedInputStream PipedReader
更改流的行为:
未发生变化的类:DataOutputStream,File,RandomAccessFile,SequenceInputStream
5.自我独立的类:RandomAccessFile
6.I/O流的典型使用方式: