该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架。
在初学Java时,IO流是我遇到的一个很头疼的东西,Java IO 体系看起来类很多,感觉很复杂,但其实是 IO 涉及的因素太多了。在设计 IO 相关的类时,编写者也不是从同一个方面考虑的,所以会给人一种很乱的感觉,并且还有设计模式的使用,更加难以使用这些 IO 类,所以特地对 Java 的 IO 做一个总结。
1|0IO流总览
话不多说,直接上图:
IO流分类:
按照“流”的数据流向,可以将其化分为:输入流和输出流。
按照“流”中处理数据的单位,可以将其区分为:字节流和字符流。在java中,字节是占1个Byte,即8位;而字符是占2个Byte,即16位。而且,需要注意的是,java的字节是有符号类型,而字符是无符号类型!
字节流的抽象基类:
InputStream,OutputStream
字符流的抽象基类:
Reader,Writer
由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀,如InputStream的子类FileInputStream,Reader的子类FileReader。
2|0字符流
2|1Writer:字符输出流
Writer是字符输出流的基类,Writer的主要方法如下:
1 2 3 4 5 6 7 8 9 10 |
|
我们知道IO流主要是用于操作文件的,但是从上图中我们发现Writer的直接子类中好像并没有直接操作文件,但是细心的你注意到,在Writer的子类OutputStreamWriter的子类中有一个类叫做FileWriter,File这个单词我们很熟悉——文件,大家可以推测一下这个类是可以用于操作文件的,下面我们来学习一下FileWriter的用法
2|2FileWriter
1、FileWriter的构造方法:
1 2 3 4 |
|
2、FileWriter的方法列表:
1 2 3 4 5 6 7 8 |
|
3、FileWriter方法的详细讲解:
例1:创建一个文件demo.txt,然后向里面写入字符串abcde
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
例2:上面的代码中我们可以看到有异常产生,但是我们并没有处理,而是抛出去了,那么在日常开发中我们不能直接抛出,所以需要对异常进行处理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
|
例3:细心的同学可以注意到,上面的那种方式写入文件时,会将之前的文件覆盖了,之前文件中写的内容不存在了,那么如何在已有的文件后面添加内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
2|3BufferedWriter
BufferedWriter 是缓冲字符输出流。它继承于Writer。
BufferedWriter 的作用是为其他字符输出流添加一些缓冲功能,使用BufferedWriter可以提高我们写入文件的效率。
1、BufferedWriter的构造方法:
1 2 |
|
2、BufferedWriter的方法列表:
1 2 3 4 5 6 |
|
3、BufferedWriter的方法详解:
例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
2|4CharArrayWriter
CharArrayReader 用于写入字符,它继承于Writer。操作的数据是以字符为单位!
1、CharArrayWriter的构造函数:
1 2 |
|
2、CharArrayWriter的方法列表:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
2|5FilterWriter
FilterWriter是字符类型的过滤输出流。
1、FilterWriter的构造函数:
1 |
|
2、FilterWriter的方法列表:
1 2 3 4 5 |
|
2|6PrintWriter
PrintWriter 是字符类型的打印输出流,它继承于Writer。
1、PrintWriter 的构造方法:
1 2 3 4 5 6 7 8 |
|
2、PrintWriter 的方法列表:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
|
2|7Reader:字符输入流
有输出流那么当然就有输入流,Reader是字符输入流的基类,Reader的方法列表如下:
1 2 3 4 5 6 7 8 9 10 |
|
同Writer一样,我们先来看一下FileReader的基本操作
2|8FileReader
1、FileReader的构造方法:
1 2 3 |
|
2、FileReader的具体使用:
例1:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
例2:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
2|9BufferedReader
1、BufferedReader的构造方法
1 2 |
|
2、BufferedReader的方法列表:
1 2 3 4 5 6 7 8 9 10 |
|
3、BufferedReader的具体使用:
例1:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
|
例2:通过缓冲区复制文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
|
3|0字节流
字节流的基本操作和字符流类相同,但它不仅可以操作字符,还可以操作其他媒体文件
3|1InputStream字节输入流
InputStream类是字节输入流的抽象类,是所有字节输入流的父类,InputStream类具有层次结构如下图所示:
InputStream的常用方法:
1 2 3 4 5 6 7 8 9 10 11 12 |
|
3|2FileInputStream
1、FileInputStream的构造方法:
1 2 3 |
|
2、FileInputStream的方法列表:
1 2 3 4 5 6 7 8 9 10 |
|
3、FileInputStream的具体使用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
|
3|3OutputStream 字节输出流
OutputStream字节输出流的方法:
1 2 3 4 5 |
|
3|4FileOutPutStream
1、FileOutPutStream的构造方法:
1 2 3 4 5 |
|
2、FileOutPutStream的方法列表:
1 2 3 4 5 6 7 8 |
|
3、FileOutPutStream的具体使用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
|
3|5File
JavaIo流中还有一个非常常用的类:File。
File 是“文件”和“目录路径名”的抽象表示形式。
File 直接继承于Object,实现了Serializable接口和Comparable接口。实现Serializable接口,意味着File对象支持序列化操作。而实现Comparable接口,意味着File对象之间可以比较大小;File能直接被存储在有序集合(如TreeSet、TreeMap中)。
1、File的构造方法:
1 2 3 4 |
|
2、File的方法列表:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
|
3、File的具体使用:
例1:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 |
|
例2:递归列出指定目录下的文件或者文件夹
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
|