第十二章 Java I/O系统
12.1 File类
它既能表示特定文件的名称,又能表示目录下一组文件的名称
目录列表器(FilenameFilter接口):需实现accept()方法,一般使用正则表达式判断文件名是否符合,File实例对象可以调用list(FilenameFilter ff)列举出符合条件的文件。
12.2 输入和输出
任何来自Inputstream或者Reader派生的类均含有read()(读取单一字节或者字节数组,面向字节),任何来自OutputStream或者Writer派生而来的类均含有write()(写入单一字节或则字节数组,面向字节)
12.3 添加属性和有用的接口
修饰器:利用层叠的数个对象为单一对象动态地、透明地添加职责的方式。
12.4 Reader和Writer(面向字符)
最明智的方法时尽量采用面向字符的Reader和Writer,一旦程序无法成功编译,则转向面向字节的类库。
可以采用适配器,对面向字符和面向字节的类转化(InputStreamReader和OutputStreamWriter)
无论何时使用readLine(),都应该使用BufferedReader
12.5 自我独立的类RandomAccessFile
适用于由大小已知的记录组成的文件,seek()从一处移动到另一处,然后读取或者修改记录,getFilePointer()查找当前所处的文件位置
12.6 I/O流的典型使用方式
1.缓冲输入文件
FileInputReader(读文件)->BufferedReader(缓冲增加速度,readLine())
InputStreamReader(System.in)(适配器,得到Reader对象)->BufferedReader(缓冲增加速度,readLine())
2.从内存输入
StringReader(待读字符串),注意调用read()读的字符int需转化为char
3.格式化的内存输入
ByteArrayInputStream(s.getBytes())->DataInputStream(调用readByte()一次一个字节读取)
4.文件输出
FileWriter->BufferedWriter->PrintWriter
5.定位读或者写文件
RandomAccessFile(调用seek()定位,getPointFile()当前位置,可以指定打开文件的方式)
12.7 标准I/O流
Java提供System.in(标准输入,InputStream),System.out(标准输出,PrintStream),System.err(标准错误,PrintStream)
I/O重定向操作的是字节流,System.setOut(out)
12.8 对象序列化
实现Serializable接口的对象转换成字节序列,并能以该序列恢复原来的对象
持久性即对象的生命周期在程序调用之间,序列化对象写入磁盘,重新调用程序时恢复对象
对象流:ObjectOutputStream/ObjectInputStream
若ObjectOutputStream的实例对象是out,则out..writeObject(o)//序列化o,前提O实现Serializable接口
若ObjectInputStream的实例对象是in,则in.readObject()//反序列化恢复
序列化控制接口Externalizable,需实现writeExternal()(序列化控制逻辑)和readExternal()(反序列化控制逻辑)
transient关键字修饰的属性不会序列化
替代Externalizable接口的方法,1)实现Serializable接口
2)定义private writeObject(ObjectOutputStream stream){
stream.defaultWriteObject();//缺省序列化方法
stream.writeObject();//其他序列化逻辑
}
3)定义private readObject(ObjectInputStream stream){
stream.defaultReadObject(); //缺省反序列化方法
。。。//其他反序列化逻辑
}
Preferences API用于存储和读取用户偏好或者系统配置
例:Preferences prefs=Preferences.userNodeForPackage(PublicClass.class); //userNodeForPackage用户偏好,systemNodeForPackage系统配置
可以理解是key-value存储,put/set
12.9 正则表达式
正则表达式语法见http://www.runoob.com/regexp/regexp-syntax.html
基本用法:
Pattern p = Pattern.compile("b*g");
Matcher m = p.matcher("bbbbbbg");
boolean b = m.matches();
System.out.println(b);
12.10 压缩
校验流:CheckedInputStream/CheckedOutputStream Adler32快于CRC32进行校验
压缩流:ZipOutputStream/ZipInputStream(针对Zip文件) GZIPOutputStream//GZIPInputStream(针对GZIP文件,简单压缩)
压缩文件:若out是GZIPOutputStream实例对象,则out.write()写数据至压缩文件
若out是ZipOutputStream实例对象,则需要1)out..putNextEntry(ZipEntity ze);//开始写入新的 ZIP 文件条目并将流定位到条目数据的开始处
2)out.write()写数据至压缩文件
jar [option] destination [mainfest] inputfile(s) //自动压缩文件