Java基础-IO流-概述

作者: HughJin | 来源:发表于2021-01-09 09:12 被阅读0次

Java工程师知识树 / Java基础


IO与流的概念:

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

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

一般来说关于流的特性有下面几点:

  1. 先进先出:最先写入输出流的数据最先被输入流读取到。
  2. 顺序存取:可以一个接一个地往流中写入一串字节,读出时也将按写入顺序读取一串字节,不能随机访问中间的数据。(RandomAccessFile除外)
  3. 只读或只写:每个流只能是输入流或输出流的一种,不能同时具备两个功能,输入流只能进行读操作,对输出流只能进行写操作。在一个数据传输通道中,如果既要写入数据,又要读取数据,则要分别提供两个流。

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输入输出流体系中常用流分类图:


字节流和字符流的用法几乎完成全一样,区别在于字节流和字符流所操作的数据单元不同,字节流操作的单元是数据单元是8位的字节,字符流操作的是数据单元为16位的字符。

针对对象流的特殊说明:
要想完成对象的输入或者输出,还必须依靠对象输出流(ObjectOutputStream)和对象输入流(ObjectInputStream).
使用对象输出流输出序列化对象的步骤,称为序列化,而使用对象输入流读取对象的过程,也称为反序列化.这也是Java自带的序列化框架的实现原理.

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的编程模型。

相关文章

  • java基础之IO流

    IO流上:概述、字符流、缓冲区(java基础) IO流结构图 FilterInputStream、FilterOu...

  • Java基础-IO流-概述

    Java工程师知识树[https://www.jianshu.com/p/db77d19a25f6] / Ja...

  • Java基础系列-Stream

    原创文章,转载请标注出处:《Java基础系列-Stream》 一、概述 Stream操作简称流操作,这里的流与IO...

  • 【Java】【IO流】概述

    IO流(概述) 概述 IO流用来处理设备之间的数据传输 Java对数据的操作是通过流的方式 Java用于操作流的类...

  • 一文带你精通Java I/O流,分分钟吊打面试官!

    Java IO概述 IO就是输入/输出。Java IO类库基于抽象基础类InputStream和OutputStr...

  • java IO入门笔记

    1.java IO流的概念,分类,类图 1.1. java IO 流的概念 java的io是实现输入和输出的基础,...

  • Java IO详解

    1 Java IO流的概念,分类 1.1 Java IO流的概念 java的IO是实现输入和输出的基础,可以方便的...

  • Java基础语法_Day15

    一、IO流概述及FileWriter类使用 IO流概述及分类 IO流用来处理设备之间的数据传输Java对数据的操作...

  • 【JavaSE(十三)】JavaIO流(中)

    1 IO流 1.1 IO流概述 Java中使用 IO流 来读取和写入,读写设备上的数据、硬盘文件、内存、键盘等等,...

  • 从源码设计角度理解Java IO

    概述 Java的核心库java.io提供了全面的IO接口。包括:文件读写、标准设备输出等。Java中IO是以流为基...

网友评论

    本文标题:Java基础-IO流-概述

    本文链接:https://www.haomeiwen.com/subject/zocinktx.html