Java I/O流总结

概述

IO(输入/输出)
Java IO通过 java.io 包下的类和接口来实现,主要包括输入、输出两种IO流。
Java IO流使用了一种装饰器设计模式,它将IO流分为了底层节点流上层处理流;其中节点流用于和底层的物理存储节点直接关联—不同的物理节点获取节点流的方式可能存在一定的差异,但程序可以把不同的物理节点流包装成统一的处理流,从而允许程序使用统一的输入、输出代码来读取不同的物理存储节点的资源。

Java 7 在 java.nio 及其子包下提供了一系列全新的API,对原有的IO进行升级,也称为 NIO2

流的分类

  1. 输入流和输出流
    输入流:主要由 InputStream 和 Reader 作为基类
    输出流:主要由 OutputStream 和 Writer 作为基类。
  2. 字节流和字符流:用法几乎完全一致,只是处理的数据单位不一样
    字节流:操作的数据单位是8位的字节; 主要是以 InputStream 和 OutputStream 作为基类;
    字符流:操作的数据单位是16位的字符;主要是以 Reader 和 Writer 作为基类;
  3. 节点流 和 处理流: 按照流的角色来划分。
    节点流:可以向一个特定I/O设备(如磁盘、网络)读/写数据的流,也被称为低级流
    处理流:用于对一个已存在的流进行连接或封装,通过封装后的流来实现读/写功能,也被称为高级流
    典型的处理流有:PrintStream,可以用来包装FileOutputStream,通常如果需要输出文本内容,都应该将输出流包装成PrintStream后进行输出。
    好处:只要使用相同的处理流,程序就可以采用完全相同的输入/输出代码来访问不同的数据源,随着处理流所包装节点流的变化,程序实际所访问的数据源也相应地发生变化。

流的概念模型

Java把所有设备里的有序数据抽象成流模型,简化了输入/输出处理。
主要是理解下面的输入输出流体系。

重点注意:Java处理流模型,它体现了Java输入/输出流设计的灵活性。

处理流的功能主要体现在以下2个方面:

  1. 性能的提高:主要以增加缓存的方式来提高输入/输出的效率
  2. 操作的便捷性:处理流可能提供了一系列便捷的方法来一次输入/输出大批量的内容,

输入输出流体系

注意,下表中,只总结了位于 java.io包下的流;

分类字节输入流字节输出流字符输入流字符输出流
抽象基类InputStreamOutputStreamReaderWriter
访问文件FileInputStreamFileOutputStreamFileReaderFileWriter
访问数组ByteArrayInputStreamByteArrayOutputStreamCharArrayReaderCharArrayWriter
访问管道PipedInputStreamPipedOutputStreamPipedReaderPipedWriter
访问字符串StringReaderStringWriter
缓冲流BufferedInputStreamBufferedOutputStreamBufferedReaderBufferedWriter
转换流InputStreamReaderOutputStreamWriter
对象流ObjectInputStreamObjectOutputStream
抽象基类FilterInputStreamFilterOutputStreamFilterReaderFilterWriter
打印流PrintStreamPrintWriter
推回输入流PushbackInputStreamPushbackReader
特殊流DataInputStreamDataOutputStream

说明:
粗体字标出的类代表节点流,必须直接与指定的物理节点关联。
斜体字标出的类代表抽象基类,无法直接创建实例。

通常来说,字节流的功能比字符流的功能大,因为计算机里所有的数据都是二进制的。

如果输入/输出的是内容是文本文件,则考虑使用字符流;
如果输入/输出的是内容是二进制文件,则考虑使用字节流。

上表中的管道流,它们都是用于实现线程之间通信功能的;

上表中的缓冲流,增加了缓冲功能,可以提高输入、输出的效率,但是需要使用flush()才可以将缓冲区的内容写入实际的物理节点。

转换流

InputStreamReader:将字节输入流转为字符输入流。
OutputStreamWriter:将字节输出流转为字符输出流。

文件类

File

File类是java.io包下代表与平台无关的文件和目录
如果希望在程序中操作文件和目录,都可以通过File类来完成。但是不能访问文件内容本身。

删除文件

File类的delete():
删除File对象表示的文件或目录,如果表示的是目录,需要保证目录是空的,否则无法删除。若成功删除返回true,否则返回false

File类的deleteOnExit():
当虚拟机终止时,删除File对象表示的文件或目录,如果表示的是目录,需要保证目录是空的,否则无法删除,无返回值。

delete是立即执行删除,而deleteOnExit是程序退出虚拟机时才会删除。

访问文件和目录

可以查看源码;
里面提供了很多方法;

文件过滤器

FilenamFilter接口。支持Lambda表达式。

RandomAccessFile

BIO、NIO、AIO 有什么区别?

  1. BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。
  2. NIO:New IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。
  3. AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值