文章目录

  • IO与流的概念:
  • java.io包
  • java.io包下流的分类
  • 按流向分:
  • 按数据传输单位分:
  • 按功能分:
  • java.io常用类
  • Java中IO与NIO
  • Java IO与NIO之间的主要差别
  • JavaIO流的用处



IO与流的概念:

IO:I/O是Input/Output的缩写, I/O技术是非常实用的技术, 用于处理设备之间的数据传输。

流:流是用来读写数据的。当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。这时候你就可以想象数据好像在这其中“流”动一样。从流中取得数据的操作称为提取操作(输出),而向流中添加数据的操作称为插入操作(输入)。

java.io包

Java把不同来源和目标的数据都统一抽象为数据流。

io流比较好的书 讲解java java io流是什么_java

JavaIO原理:Java中IO是以数据流为基础进行输入输出的,所有数据被串行化写入输出流,或者从输入流读入。

在Java类库中,IO操作包括:输入输出流,文件的操作,网络传输数据流,字符串流,对象流,zip文件流。

Java的IO包作用的描述: 通过数据流,序列号和文件系统提供系统输入和输出。

从功能上区分在Java类库中包含三个部分:

  1. 流式部分――IO的主体部分,如:InputStream、OutputStream、Writer、Reader等;
  2. 非流式部分――主要包含一些辅助流式部分的类,如:File类、RandomAccessFile类和FileDescriptor等类;
    java.io.File类是文件和目录路径名的抽象表示,并且java.io.File类的实例可以表示文件系统的对象,例如文件或目录。所以JDK将java.io.File类放到了java.io包下。
  3. 其他类――文件读取部分的与安全相关的类,如:SerializablePermission类,以及与本地操作系统相关的文件系统的类,如:FileSystem类和Win32FileSystem类和WinNTFileSystem类。

java.io包下流的分类

按流向分:

输入流: 程序可以从中读取数据的流。特点:能够向输入流中添加数据

输出流: 程序能向其中写入数据的流。特点:能够从输出流中取得数据

InputStream、OutputStream作为抽象基类。输入流和输出流都是站在程序的角度上来说。

描述

字节流(抽象基类)

字符流(抽象基类)

输入流

InputStream

Reader

输出流

OutputStream

Writer

按数据传输单位分:

字节流: 以字节为单位传输数据的流

字符流: 以字符为单位传输数据的流

Writer、Reader作为抽象基类。

字节流和字符流选择

  • 字节流: 字节流读取的时候,读到一个字节就返回一个字节; 主要用于读取图片,MP3,AVI视频文件。
  • 字符流: 字符流使用了字节流读到一个或多个字节,如读取中文时,就会一次读取2个字节。只要是处理纯文本数据,就要优先考虑使用字符流。

描述

字节流(抽象基类)

字符流(抽象基类)

输入流

InputStream

Reader

输出流

OutputStream

Writer

按功能分:

字节流: 用于直接操作目标设备的流

过滤流: 是对一个已存在的流的链接和封装,通过对数据进行处理为程序提供功能强大、灵活的读写功能。

抽象基类

节点流(文件流)

缓冲流(处理流的一种)

InputStream

FileInputStream

BufferedInputStream

OutputStream

FileOutputStream

BufferedOutputStream

Reader

FileReader

BufferedReader

Writer

FileWriter

BufferedWriter

java.io常用类

JDK所提供的所有流类位于java.io包中,都分别继承自以下四种抽象流类。

InputStream: 继承自InputStream的流都是用于向程序中输入数据的,且数据单位都是字节(8位)。

OutputStream: 继承自OutputStream的流都是程序用于向外输出数据的,且数据单位都是字节(8位)。

Reader: 继承自Reader的流都是用于向程序中输入数据的,且数据单位都是字符(16位)。

Writer: 继承自Writer的流都是程序用于向外输出数据的,且数据单位都是字符(16位)。

File: 是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作。专门对文件进行操作的类,只能对文件本身进行操作,不能对文件内容进行操作。

Java输入输出流体系中常用流分类图:

io流比较好的书 讲解java java io流是什么_Java_02

Java中IO与NIO

Java.io是大多数面向数据流的输入/输出类的主要软件包。

此外,Java也对块传输提供支持,在核心库 java.nio中采用的便是块IO。

Java IO与NIO之间的主要差别
  1. 面向流与面向缓冲:Java IO面向流,Java NIO面向缓冲。

分析:

Java IO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方。此外,它不能前后移动流中的数据。如果需要前后移动从流中读取的数据,需要先将它缓存到一个缓冲区

Java NIO将数据先读取到一个它稍后处理的缓冲区,需要时可在缓冲区中前后移动。这就增加了处理过程中的灵活性。但是,还需要检查是否该缓冲区中包含所有需要处理的数据。而且,需确保当更多的数据读入缓冲区时,不要覆盖缓冲区里尚未处理的数据

  1. 阻塞与非阻塞IO:Java IO的各种流是阻塞的,Java NIO的非阻塞模式。

分析:

Java IO的各种流是阻塞的。这意味着,当一个线程调用read() 或 write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。该线程在此期间不能再干任何事情了。

Java NIO的非阻塞模式,如果通道没有东西可读,或不可写,读写函数马上返回,而不会阻塞,这个线程可以去做别的事情。线程通常将非阻塞IO的空闲时间用于在其它通道上执行IO操作,所以一个单独的线程可以管理多个输入和输出通道(channel),即IO多路复用的原理

  1. 选择器(Selectors)

分析:

Java NIO的选择器允许一个单独的线程来监视多个输入通道,你可以注册多个通道使用一个选择器,然后使用一个单独的线程来“选择”通道:这些通道里已经有可以处理的输入,或者选择已准备写入的通道。这种选择机制,使得一个单独的线程很容易来管理多个通道。

JavaIO流的用处

1. 磁盘IO

磁盘IO主要是指对文件的操作以及文件内容的操作。

2. 网络IO

网络编程的基本模型是C/S模型,即两个进程间的通信
服务端提供IP和监听端口客户端通过连接操作向服务端监听的地址发起连接请求,通过三次握手连接,如果连接成功建立,双方就可以通过套接字进行通信。 通信的方式就是指网络IO

JDK1.7之后有网络编程模型:

  1. BIO
  2. NIO
  3. AIO

BIO(传统的同步阻塞模型)开发中,ServerSocket负责绑定IP地址,启动监听端口;Socket负责发起连接操作。连接成功后,双方通过输入和输出流(网络IO)进行同步阻塞式通信。

NIO提供了与传统BIO模型中的Socket和ServerSocket相对应的SocketChannel和ServerSocketChannel两种不同的套接字通道实现。

AIO(NIO 2.0)引入了新的异步通道的概念,并提供了异步文件通道和异步套接字通道的实现。异步的套接字通道时真正的异步非阻塞I/O,对应于UNIX网络编程中的事件驱动I/O(AIO)。AIO不需要过多的Selector对注册的通道进行轮询即可实现异步读写,从而简化了NIO的编程模型。