流的分类:
1.按照方向分:输入流InputStream和输出流OutputStream
2.按照读写单位分:字节流InputStream/OutputStream和字符流 Reader/Writer
3.按照功能分为:节点流和处理流
其中有四大抽象类:
1.InputStream 2.OutputStream
3.Reader 4.Writer
输入/输出流:
1) 文件字节流:FileInputStream
java.io.InputStream抽象类
--java.io.FileInputStream:继承了InputStream类从文件系统中的文件获取输入文字
构造方法:
FileInputStream(File file);创建一个读取对象
FileInputStream(String name);创建一个读取对象并输入指定的文件路径
常用的方法:
int read();从该输入流读取一个字节的数据,如果达到文件的末尾返回-1
int read(byte[ ] b);读取该数组中最多b.length长度的字节
void close();关闭流
Code examples:

Operation results:

2)文件字节流:FileOutputStream
java.io.OutputStream:抽象类
--java.io.FileOutputStream:继承了OutoputStream,文件输出流是用于将文件写入到输出流File
构造方法:
FileOutputStream(File file);创建文件输出流以写入由指定的 File对象表示的文件。
FileOutputStream(String name);创建文件输出流以指定的名称写入文件。
FileOutputStream(File file, boolean append);创建文件输出流以写入由指定的 File对象表示的文件。
FileOutputStream(String name, boolean append);创建文件输出流以指定的名称写入文件。
常用的方法:
将指定的文件写入到目的地:wtite(int b);
将字符串转为byte类型的数组:str.getBytes( );
关闭流:close( );
Code examples:

Operation results:

3)文件字符流:FileReader/FileWriter
用法与文件字节流非常相似,也是用于读取硬盘并写入数据,直接写例子来看
用文件字符流实现复制文件:
方法1:Code examples:

Operation results :

方法2:Code examples:

Operation results :

4)缓冲流
缓冲字节流:BufferedInputStream/BufferedOutputStream
缓冲流:可以提高我们的工作效率
BufferedInputStream的构造方法:
BufferedInputStream(InputStream in);创建一个 BufferedInputStream并保存其参数,输入流 in ,供以后使用。
BufferedInputStream的常用方法:
int read(byte[ ] b, int off, int len);从给定的偏移开始,将字节输入流中的字节读入指定的字节数组。
read(byte[ ] bs);
close:关闭流
缓冲字符流:BufferedReader/BufferedWriter
Code examples:

Operation results:

缓冲字符流:
缓冲字符流:BufferedReader/BufferedWriter
缓冲流要配合字节流使用!
BufferedReader常用的方法:
String readline();读取一行数据,如果读到结尾返回null
void close();关闭流
BufferWriter的常用方法:
write(String str);将字符串写入目的地
newLine();换行
flush();刷新流
void close();关闭流
Code examples:

Operation results:

5)转换流
将字节流转换为字符流,属于处理流(必须与节点流结合使用)
InputStreamReader:将InputStream转换为Reader
OutputStreamWriter:将OutputStream转换为Writer
InputStreamReader的构造方法:
InputStreamReader(InputStream in);给定一个字节流路径使用默认的编码字符集
InputStreamReader(InputStream in, Charset cs);给一个字节流路径并给定编码字符集
InputStreamReader的常用方法:
int read();读一个字符
int read(char[ ] cbuf, int offset, int length);将字符读入数组的一部分。
void close();关闭流并释放与之相关联的任何系统资源。
OutputStreamWriter构造方法:
OutputStreamWriter(OutputStream out);创建一个使用默认字符编码的OutputStreamWriter。
OutputStreamWriter(OutputStream out, Charset cs);创建一个使用给定字符集的OutputStreamWriter。
OutputStreamWriter常用方法:
void write(int c);写一个字符
void write(char[] cbuf, int off, int len);写入字符数组的一部分。
void close();关闭流,先刷新。
Code examples:

Operation results :

Operation results :

6)序列化与反序列化
对象流:以"对象"为数据源,可以对"对象"进行读取操作,属于处理流
使用对象读写数据是要求该对象所对应的类型必须实现序列化接口,否则将抛出java.io.InvalidClassException异常
ObjectInputStream:readObject()
ObjectOutputStream:writeObject(Object obj)
序列化:Java对象--->字节序列 对象转换为字节序列的过程
反序列化:字节序列--->Java对象 字节序列转化为对象的过程
序列化注意的事项:
1.static属性不参与序列化
2.对象中的某些属性如果不想被序列化,不能使用static,而是使用transient修饰
3.为了防止读和写的序列化ID不一致,一般指定一个固定的序列化ID
Code examples:

Operation results :

7)文件夹的复制
文件夹的复制:
1.复制文件夹(在目标位置创建相同的文件夹)需要用到递归
2.文件的复制(使用输入流读取源文件,使用输出流将读取到的文件内容写入目的地)
Code examples:

Operation results :

8) IO流体系中的装饰器模式:
设计模式(GoF):设计模式供23种.是对经典问题的典型解决方案,通过设计模式可以将程序编写的更加优美("高内聚,低耦合")
装饰器模式:它可以实现对原有类的包装和装饰,使新的类具有更强的功能
优点:动态地为对象增加新的功能或者撤销功能(继承就不能做到这一点)
缺点:会产生过多的相似的对象,不容易排错!
Code examples:

Operation results:

9)Apache IOUtils的使用_Apache FileUtils的使用
FieUtils类中常用方法:
1.cleanDirectory:清空目录,但不删除目录。
2.contentEquals:比较两个文件的内容是否相同。
3.copyDirectory:将一个目录内容拷贝到另一个目录。可以通过FileFilter过滤需要拷贝的 文件。
4.copyFile:将一个文件拷贝到一个新的地址。
5.copyFileToDirectory:将一个文件拷贝到某个目录下。
6.copyInputStreamToFile:将一个输入流中的内容拷贝到某个文件
7. deleteDirectory:删除目录。
8. deleteQuietly:删除文件。
9.listFiles:列出指定目录下的所有文件。
10.openInputSteam:打开指定文件的输入流。
11.readFileToString:将文件内容作为字符串返回。
12. readLines:将文件内容按行返回到一个字符串数组中。
13. size:返回文件或目录的大小。
14. write:将字符串内容直接写到文件中。
15. writeByteArrayToFile:将字节数组内容写到文件中。
16. writeLines:将容器中的元素的toString方法返回的内容依次写入文件中。
17. writeStringToFile:将字符串内容写到文件中。
IOUtils中常用的类:
1. buffer方法:将传入的流进行包装,变成缓冲流。并可以通过参数指定缓冲大小。
2. closeQueitly方法:关闭流。
3. contentEquals方法:比较两个流中的内容是否一致。
4. copy方法:将输入流中的内容拷贝到输出流中,并可以指定字符编码。
5. copyLarge方法:将输入流中的内容拷贝到输出流中,适合大于2G内容的拷贝。
6. lineIterator方法:返回可以迭代每一行内容的迭代器。
7. read方法:将输入流中的部分内容读入到字节数组中。
8. readFully方法:将输入流中的所有内容读入到字节数组中。
9. readLine方法:读入输入流内容中的一行。
10. toBufferedInputStream,toBufferedReader:将输入转为带缓存的输入流。
11. toByteArray,toCharArray:将输入流的内容转为字节数组、字符数组。
12. toString:将输入流或数组中的内容转化为字符串。
13. write方法:向流里面写入内容。
14. writeLine方法:向流里面写入一行内容。

流框架梳理:
流:
一.按照流的方向分类:
输入流:程序读取数据(InputStream、Reader)
输出流:程序把数据写入到目的地(OutPutStream、Writer)
IO的四大抽象类:InputStream、OutputStream、Reader、Writer
二.按照流的处理数据单元分类:
1.字节流:按照字节读取(InputStream、OutputStream)
1.1.InputStream的实现类:
FileInputStream:输入字节流
ByteArrayInputStream:数组字节输入流
BufferedInputStream:缓冲字节输入流(需要配合节点流使用)
DataInputStream:数据字节输入流
ObjectInputStream:对象字节输入流(反序列化)
1.2.OutputStream的实现类:
FileOutputStream:输出字节流
ByteArrayOutStream:数组字节输出流
BufferedOutputStream:缓冲字节输出流
DataOutputStream:数据字节输出流
ObjectOutputStream:对象字节输出流(序列化)
PrintStream:打印字节输出流
2.字符流:按照字符读取数据(Reader、Writer)
2.1.Read的实现类:
FileReader:读取字符数据
BufferedReader:缓冲字符读取流(需要配合节点流使用)
InputStreamReader:转换流,配合节点流使用
2.2.Writer的实现类:
FileWriter:写入字符数据
BufferedWriter:通过缓冲区写入字符数据,配合节点流使用
OutputStreamWriter:转换流,一般配合缓冲流使用
三.按照流的功能来分:
节点流:可以直接从数据源或目的地读写数据
处理流:通过对其他流的处理提高程序的性能,配合节点流使用
序列化:Java对象--->字节序列 对象转换为字节序列的过程
反序列化:字节序列--->Java对象 字节序列转化为对象的过程
