Netty学习——Java中的IO

2 篇文章 0 订阅

Java中的IO结构

一:Java IO中常用的类

主要的类如下:

  1. File(文件特征与管理):用于文件或者目录的描述信息,例如生成新目录,修改文件名,删除文件,判断文件所在路径等。
  2. InputStream(二进制格式操作):抽象类,基于字节的输入操作,是所有输入流的父类。定义了所有输入流都具有的共同特征。
  3. OutputStream(二进制格式操作):抽象类。基于字节的输出操作。是所有输出流的父类。定义了所有输出流都具有的共同特征。
  4. Reader(文件格式操作):抽象类,基于字符的输入操作。
  5. Writer(文件格式操作):抽象类,基于字符的输出操作。
  6. RandomAccessFile(随机文件操作):一个独立的类,直接继承至Object.它的功能丰富,可以从文件的任意位置进行存取(输入输出)操作。
    之间的 的关系图如下:
     Java中IO流的体系结构如图
二:Java IO中的流

Java中将输入和输出抽象成流,流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流。

IO流的分类
- 根据处理数据类型的不同分为:字符流和字节流
- 根据数据流向不同分为:输入流和输出流
- 按数据来源(去向)分类:
1. File(文件): FileInputStream, FileOutputStream, FileReader, FileWriter
2. byte[]:ByteArrayInputStream, ByteArrayOutputStream
3. Char[]: CharArrayReader,CharArrayWriter
4. String: StringBufferInputStream, StringReader, StringWriter
5. 网络数据流:InputStream,OutputStream, Reader, Writer

三:字符流和字节流:

流序列中的数据既可以是未经加工的原始二进制数据,也可以是经一定编码处理后符合某种格式规定的特定数据。因此Java中的流分为两种,字节流和字符流。

  1. 字节流
    • 数据流中最小的数据单元是字节
    • 代表的基本类是InputStream和OutputStream
    • 从字节流中读取字节的方法read。默认没有使用内存缓冲区,意味着每调用一次read方法都会请求操作系统来读取一个字节,这往往会伴随着一次磁盘IO,因此效率会比较低。
  2. 字符流
    • Java中的字符流处理的最基本的单元是Unicode编码(大小2字节),它通常用来处理文本数据
    • 代表的基本类是 Reader和Writer
    • 使用内存缓冲区来存放转换后得到的字节序列,等待都转换完毕再一同写入磁盘文件中。
    • 字符流的由来: Java中字符是采用Unicode标准,一个字符是16位,即一个字符使用两个字节来表示。为此,JAVA中引入了处理字符的流。因为数据编码的不同,而有了对字符进行高效操作的流对象。本质其实就是基于字节流读取时,去查了指定的码表。

流的原理梳理
Java io流设计到的类有40多个,实际上这40多个类都是从下面的4个抽象类派生出来的
* 字节流:
- InputStream:所有字节流的输入流基类
- OutputStram:所有字节流的输出流基类
* 字符流:
- Reader:所有字符流的输入流基类
- Writer:所有字符流的输出流基类
按操作方式分类结构图

四:输出流和输入流

根据数据的输入、输出方向的不同对而将流分为输入流和输出流。

  1. 输入流:
    - 程序从输入流读取数据源。数据源包括外界(键盘、文件、网络…),即是将数据源读入到程序的通信通道
    - 例如字节流的InputStream 和 字符流的Reader
  2. 输出流
    - 程序向输出流写入数据。将程序中的数据输出到外界(显示器、打印机、文件、网络…)的通信通道。
    - 例如字节流中的OutputStream 和 字符流中的Writer
    特性:

相对于程序来说,输出流是往存储介质或数据通道写入数据,而输入流是从存储介质或数据通道中读取数据,一般来说关于流的特性有下面几点:

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

参考文档 https://github.com/Snailclimb/JavaGuide/blob/master/docs/java/Java%20IO%E4%B8%8ENIO.md
参考文档 https://www.cnblogs.com/ylspace/p/8128112.html
参考文档 https://www.cnblogs.com/shamo89/p/9860582.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值