1. IO流的四大抽象类(只能继承不能实例化)
作为装饰器模式中的抽象构建角色。
字节流一般用于处理二进制文件,而字符流一般用于处理文本文件。
2. IO流的关系,命名规律与功能
-
字节流
通过BufferedInputStream缓冲后,可以利用read()方法读取字节信息,直到读到块字节数组byte[] buf没有内容为止。此时read(buf)返回的读取字节数len为-1——读取结束标记。
通过BufferedOutputStream缓冲后,可以使用write(buf,0,len)方法按字节输出。 -
字符流
通过BufferedReader()缓冲后可以利用readLine()读到字符串String,以null作为结束标记。
通过BufferedWriter()缓冲后可以利用write()直接输出字符串,或者使用append()的链式方法调用来输出字符串,以及使用newLine()输出一个/r/n。 -
关闭流
先读后写——>先关写再关读。 -
为什么要引入DataInputStream/DataOutputStream类?
用于处理java的基本数据类型:
readInt(),readDouble(),readUTF() 处理字符串;
writeInt(),writeDouble(),writeUTF() 处理字符串。 -
为什么要引入ByteArrayInputStream和ByteArrayOutputStream类?
需要将java的各种基本数据类型及类类型的数据转换为byte[],便于在网络上传输。相应的对象提供了读写基本数据类型和Object类型数据的方法。 -
为什么要引入ObjectInputStream/ObjectOutputStream类?
主要用于对象的序列化readObject()和反序列化writeObject()。 -
转换流InputStreamReader和OutputStreamWriter可以提供字符编码的转换。
在构造器中提供编码选项参数:
InputStreamReader(,“UTF-8”)
OutputStreamWriter(,“UTF-8”)
注意:没有从字符到字节的转换流,因为这种转换是不必要的。 -
FileInputStream/FileOutputStream,ObjectInputStream/ObjectOutputStream,ByteArrayInputStream/ByteArrayOutputStream作为装饰器模式的具体构建角色。
-
FilterInputStream和FilterOutputStream主要以装饰器模式的装饰器角色引入。它持有对装饰器模式中的抽象构建角色(InputStream/OutputStream和Reader/Writer)的引用。
-
DataInputStream/DataOutputStream,BufferedInputStream/BufferedOutputStream作为装饰器模式的具体装饰角色。
3. 关于字节/字符流的缓冲机制
- 字节流
- 字符流
4. Apache FileUtils和Apache IOUtils
-
jar包
commons-io-ver.jar -
FileUtils
封装了文件的相关操作。
常用方法:
FileUtils.openInputStream(File):FileInputStream
FileUtils.toFile(URL):File
FileUtils.copyFileToDirectory(File, File, boolean):void
FileUtils.copyFile(File, File):void
FileUtils.copyURLToFile(URL, File):void
FileUtils.readFileToString(File, Charset):String //UTF8
FileUtils.writeStringToFile(File, String, String):void
- IOUtils
封装了文件读写的相关操作。
常用方法:
IOUtils.toString(InputStream, String):String
IOUtils.write(byte[], OutputStream):void
IOUtils.write(String, Writer):void
IOUtils.copy(InputStream, Writer):void
IOUtils.copyLarge(Reader, Writer, char[]):long