1.1. IO流概念
Ÿ IO流用来处理设备之间的数据传输
Ÿ Java对数据的操作是通过流的方式
Ÿ Java用于操作流的对象都在IO包中
Ÿ 流按操作对象分为两种:字节流与字符流。 字节流可以操作任何数据,字符流只能操作纯字符数据比较方便。
Ÿ 流按流向分为:输入流,输出流。
1.2. IO流常用基类
Ø 字节流的抽象基类:
Ÿ InputStream ,OutputStream
Ø 字符流的抽象基类:
Ÿ Reader , Writer
Ø 由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀。
Ÿ 如:InputStream的子类FileInputStream。
Ÿ 如:Reader的子类FileReader。
Ÿ InputStreamReader是Reader的子类
1.3. IO程序书写
Ÿ 使用前,导入IO包中的类
Ÿ 使用时,进行IO异常处理
Ÿ 使用后,释放资源
1.4. 字符流读写文件
Ø 读取文件
Ÿ 定义字符流关联指定文件
FileReader reader = new FileReader("Test.txt");
Ÿ 读取一个字符,返回int,该字符的码表值
int ch = reader.read();
Ÿ 关闭流,释放资源
reader.close();
Ø 写出文件
Ÿ 定义字符输出流关联指定文件
FileWriter writer = new FileWriter("Test.txt");
Ÿ 写出一个字符,接收int码表值
writer.write(97);
Ÿ 关闭流,释放资源
writer.close();
Ø 注意事项
Ÿ 文件路径
定义文件路径时Windows中的目录符号为“\”,但这个符号在Java中是特殊字符,需要转义。
可以用“\\”或“/”表示。
Ÿ 读取文件
读取文件时必须保证文件存在,否则将抛出FileNotFoundException。
Ÿ 写出文件
写出时文件如不存在时程序会创建新文件,如文件已存在则会清空原文件内容重新写入。
如需追加内容可调用FileWriter构造函数FileWriter(String fileName, boolean append)
Ÿ 练习
拷贝一个文件
1.5. 字符流缓冲区读写
Ø 自定义缓冲区读写
Ÿ 为什么定义缓冲区
由于单个字符读写需要频繁操作文件,所以效率非常低。
我们可以定义缓冲区将要读取或写出的数据缓存,减少操作文件次数。
Ÿ 缓冲区读取
先定义一个数组,然后调用FileReader读取一个数组的方法。
int read(char[] cbuf)
Ÿ 缓冲区写出
将要写出的数据存放在数组中,调用FileWriter方法,一次写出一个数组。
void write(char[] cbuf, int off, int len)
Ø 内置缓冲区的BufferedReader和BufferedWriter
Ÿ Java提供了带缓冲功能的Reader和Writer类:BufferedReader,BufferedWriter
Ÿ 这两个类都是提供包装功能,需要提供其他流来使用,给其他流增加缓冲功能
Ÿ 当我们调用BufferedReader读取数据时,程序会从文件中一次读取8192个字符用来缓冲
Ÿ 当我们调用BufferedWriter写出数据时,程序会先将数据写出到缓冲数组,直到写满8192个才一次性刷出到文件
1.6. 装饰设计模式(Decorator)
Ø 什么情况下使用装饰设计模式
当我们需要对一个类的功能进行改进、增强的时候
Ø 装饰模式的基本格式。
含有被装饰类的引用
通过构造函数传入被装饰类对象
和被装饰类含有同样的方法,其中调用被装饰类的方法,对其进行改进、增强
和被装饰类继承同一个类或实现同一个接口,可以当做被装饰类来使用
Ø 了解BufferedReader、BufferedWriter的原理。
BufferedReader、BufferedWriter都是装饰类,他们可以装饰一个Reader或Writer,给被装饰的Reader和Writer提供缓冲的功能。
就像我们用BufferedReader、BufferedWriter装饰FileReader和FileWriter,使用的读写功能还是FileReader和FileWriter的,但给这两个类的读写添加了缓冲功能。
1.7. 字节流
Ÿ 基本操作与字符流相同
Ÿ 字节流可以操作任意类型数据
1.8. 字节流缓冲区读写
Ø 自定义缓冲区读写
Ÿ 原理和字符流相同,都是为了提高效率
Ÿ 定义数组缓冲数据,一次读取一个数组,一次写出一个数组,减少操作文件的次数
Ø BufferedInputStream、BufferedOutputStream
Ÿ 和BufferedReader、BufferedWriter原理相同,都是包装类
Ÿ BufferedInputStream、BufferedOutputStream包装InputStream和OutputStream提供缓冲功能
1.9. 转换流
Ÿ 字符流与字节流之间的桥梁
Ÿ 方便了字符流与字节流之间的操作
Ÿ 字节流中的数据都是字符时,转成字符流操作更高效
1.10. 标准输入输出流
Ÿ System类中的成员变量:in,out。
Ÿ 它们各代表了系统标准的输入和输出设备。
Ÿ 默认输入设备是键盘,输出设备是显示器。
Ÿ System.in的类型是InputStream.
Ÿ System.out的类型是PrintStream是OutputStream的子类FilterOutputStream 的子类.
1.11. 流基本应用小节
Ÿ 流是用来处理数据的。
Ÿ 处理数据时,一定要先明确数据源,或者数据目的地
Ÿ 数据源可以是文件,可以是键盘或者其他设备。
Ÿ 数据目的地可以是文件、显示器或者其他设备。
Ÿ 而流只是在帮助数据进行传输,并对传输的数据进行处理,比如过滤处理、转换处理等。
1.12. File类
Ÿ 用来将文件或者文件夹路径封装成对象
Ÿ 方便对文件与文件夹进行操作。
Ÿ File对象可以作为参数传递给流的构造函数。
Ÿ 了解File类中的常用方法。
1.13. 递归
Ÿ 函数自己调用自己。
Ÿ 注意:递归时一定要明确结束条件。
Ÿ 应用场景:
当某一功能要重复使用时。
1.14. IO包中的其他类
Ÿ 序列流
SequenceInputStream
可以将多个字节输入流整合成一个流,在使用这个流读取的时候,读到第一个流的末尾时继续读第二个,第二个读到末尾则继续读第三个,以此类推,直到读到最后一个流的末尾返回-1
Ÿ 打印流
PrintStream 、PrintWriter
相比普通的OutputStream和Writer增加了print()和println()方法,这两个方法可以输出实参的toString()方法的返回值
这两个类还提供自动flush()的功能
Ÿ 操作对象
ObjectOutputStream
可以将实现了Serializable的接口的对象转成字节写出到流中
ObjectInputStream
可以从流中读取一个ObjectOutputStream流写出的对象
Ÿ 操作内存缓冲数组
ByteArrayOutputStream: 写出到字节数组(内存)中,可以获取写出的内容装入一个字节数组。通常我们用这个流来缓冲数据。
ByteArrayInputStream:可以从一个字节数组中读取字节。
CharArrayWriter:写出字符到字符数组(内存)中,可以获取写出的内容装入一个字符数组。
CharArrayReader:可以从一个字符数组中读取字符。
Ÿ 管道流
PipedInputStream:管道输入流,可以从管道输出流中读取数据
PipedOutputStream:管道输出流,可以向管道输入流中写出数据
Ÿ 操作基本数据类型
DataInputStream、DataOutputStream
可以按照基本数据类型占用空间大小读写数据
Ÿ 随机访问文件
RandomAccessFile