IO流

1.1. IO流概念

Ÿ IO流用来处理设备之间的数据传输

Ÿ Java对数据的操作是通过流的方式

Ÿ Java用于操作流的对象都在IO包中

Ÿ 流按操作对象分为两种:字节流与字符流。  字节流可以操作任何数据,字符流只能操作纯字符数据比较方便。

Ÿ 流按流向分为:输入流,输出流。

1.2. IO流常用基类

Ø 字节流的抽象基类:

Ÿ InputStream OutputStream

Ø 字符流的抽象基类:

Ÿ Reader , Writer

Ø 由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀。

Ÿ 如:InputStream的子类FileInputStream

Ÿ 如:Reader的子类FileReader

Ÿ InputStreamReaderReader的子类

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)

Ø 内置缓冲区的BufferedReaderBufferedWriter

Ÿ Java提供了带缓冲功能的ReaderWriter类:BufferedReaderBufferedWriter

Ÿ 这两个类都是提供包装功能,需要提供其他流来使用,给其他流增加缓冲功能

Ÿ 当我们调用BufferedReader读取数据时,程序会从文件中一次读取8192个字符用来缓冲

Ÿ 当我们调用BufferedWriter写出数据时,程序会先将数据写出到缓冲数组,直到写满8192个才一次性刷出到文件

1.6. 装饰设计模式(Decorator)

Ø 什么情况下使用装饰设计模式

当我们需要对一个类的功能进行改进、增强的时候

Ø 装饰模式的基本格式。

含有被装饰类的引用

通过构造函数传入被装饰类对象

和被装饰类含有同样的方法,其中调用被装饰类的方法,对其进行改进、增强

和被装饰类继承同一个类或实现同一个接口,可以当做被装饰类来使用

Ø 了解BufferedReaderBufferedWriter的原理。

BufferedReaderBufferedWriter都是装饰类,他们可以装饰一个ReaderWriter,给被装饰的ReaderWriter提供缓冲的功能。

就像我们用BufferedReaderBufferedWriter装饰FileReaderFileWriter,使用的读写功能还是FileReaderFileWriter的,但给这两个类的读写添加了缓冲功能。

 

1.7. 字节流

Ÿ 基本操作与字符流相同

Ÿ 字节流可以操作任意类型数据

 

1.8. 字节流缓冲区读写

Ø 自定义缓冲区读写

Ÿ 原理和字符流相同,都是为了提高效率

Ÿ 定义数组缓冲数据,一次读取一个数组,一次写出一个数组,减少操作文件的次数

Ø BufferedInputStreamBufferedOutputStream

Ÿ 和BufferedReaderBufferedWriter原理相同,都是包装类

Ÿ BufferedInputStreamBufferedOutputStream包装InputStreamOutputStream提供缓冲功能

1.9. 转换流

Ÿ 字符流与字节流之间的桥梁

Ÿ 方便了字符流与字节流之间的操作

Ÿ 字节流中的数据都是字符时,转成字符流操作更高效

 

1.10. 标准输入输出流

Ÿ System类中的成员变量:inout

Ÿ 它们各代表了系统标准的输入和输出设备。

Ÿ 默认输入设备是键盘,输出设备是显示器。

Ÿ System.in的类型是InputStream.

Ÿ System.out的类型是PrintStreamOutputStream的子类FilterOutputStream 的子类.

 

1.11. 流基本应用小节

Ÿ 流是用来处理数据的。

Ÿ 处理数据时,一定要先明确数据源,或者数据目的地

Ÿ 数据源可以是文件,可以是键盘或者其他设备。

Ÿ 数据目的地可以是文件、显示器或者其他设备。

Ÿ 而流只是在帮助数据进行传输,并对传输的数据进行处理,比如过滤处理、转换处理等。

1.12. File

Ÿ 用来将文件或者文件夹路径封装成对象

Ÿ 方便对文件与文件夹进行操作。

Ÿ File对象可以作为参数传递给流的构造函数。

Ÿ 了解File类中的常用方法。

1.13. 递归

Ÿ 函数自己调用自己。

Ÿ 注意:递归时一定要明确结束条件。

Ÿ 应用场景:

当某一功能要重复使用时。

 

1.14. IO包中的其他类

Ÿ 序列流

SequenceInputStream

可以将多个字节输入流整合成一个流,在使用这个流读取的时候,读到第一个流的末尾时继续读第二个,第二个读到末尾则继续读第三个,以此类推,直到读到最后一个流的末尾返回-1

Ÿ 打印流

PrintStream PrintWriter

相比普通的OutputStreamWriter增加了print()println()方法,这两个方法可以输出实参的toString()方法的返回值

这两个类还提供自动flush()的功能

Ÿ 操作对象

ObjectOutputStream

可以将实现了Serializable的接口的对象转成字节写出到流中

ObjectInputStream

可以从流中读取一个ObjectOutputStream流写出的对象

Ÿ 操作内存缓冲数组

ByteArrayOutputStream: 写出到字节数组(内存)中,可以获取写出的内容装入一个字节数组。通常我们用这个流来缓冲数据。

ByteArrayInputStream:可以从一个字节数组中读取字节。

CharArrayWriter:写出字符到字符数组(内存)中,可以获取写出的内容装入一个字符数组。

CharArrayReader:可以从一个字符数组中读取字符。

Ÿ 管道流

PipedInputStream:管道输入流,可以从管道输出流中读取数据

PipedOutputStream:管道输出流,可以向管道输入流中写出数据

Ÿ 操作基本数据类型

DataInputStreamDataOutputStream

可以按照基本数据类型占用空间大小读写数据

Ÿ 随机访问文件

RandomAccessFile

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值