java IO操作 你快速认识IO的相关基本知识

I/O输入/输出(Input/Output),不同的I/O方式有不同的实现方式和性能,在不同的应用中可以按情况选择不同的I/O方式。输入输出I/O流可以看成对字节或者包装后的字节的读取就是拿出来放进去双路切换。在当下的各种存储产品中,按照速度从快到慢应该就是内存>闪存>磁盘>磁带。Java 中通过 java.io.File 类来对一个文件(包括目录)进行抽象的描述.(io即input和output)。通过File对象来描述一个具体的文件,可以对应到一个真实存在的文件,也可以对应到一个不存在的文件.文件的分类:文件可以分为文本文件和二进制文件。平时我们在记事本中编辑的内容就属于文本文件;平时看到的图片文件如果不借助其他专业的软件是不能对图片进行编辑查看的,用记事本打开后看到一堆乱码,此时它里面存储的就是二进制内容。

Java中的IO模型主要有三种

1、BIO(Blocking IO):

同步阻塞式IO,是比较常用的IO模型,特点是编写相对简单,应用程序发起 read 调用后,会一直阻塞,直到内核把数据拷贝到用户空间。这种模型在客户端链接数量比较少的情况是可以的,如果一旦数量上来达到万级别时,就会出现问题。

2、NIO(Nonblocking IO):

Java 中的 NIO 于 Java 1.4 中引入,对应 java.nio 包,提供了 Channel , Selector,Buffer 等抽象。NIO 中的 N 可以理解为 Non-blocking,不单纯是 New。它是支持面向缓冲的,基于通道的 I/O 操作方法。 对于高负载、高并发的(网络)应用,应使用 NIO 。Java 中的 NIO 可以看作是 I/O 多路复用模型。也有很多人认为,Java 中的 NIO 属于同步非阻塞 IO 模型。

3、AIO(Asynchronous IO):

AIO 也就是 NIO 2。Java 7 中引入了 NIO 的改进版 NIO 2,它是异步 IO 模型。异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。目前来说 AIO 的应用还不是很广泛。Netty 之前也尝试使用过 AIO,不过又放弃了。这是因为,Netty 使用了 AIO 之后,在 Linux 系统上的性能并没有多少提升。

IO模型 https://www.processon.com/view/6675082c5cb8e56220a4eb57?utm_source=yingying

java中IO流的分类

按照数据单位:

字节流(Byte Streams)和字符流(Character Streams)

  • 字节流(Byte Stream):用于处理二进制数据,适合处理图像、音频和其他非文本数据。例如,FileInputStream和FileOutputStream是字节流的典型代表。

  • 字符流(Character Stream):用于处理文本数据,适合处理字符集编码的文本文件。例如,FileReader和FileWriter是字符流的典型代表。

按照传输的方向:

输入流(input Stream)和输出流(output Stream)

  • 输入流(Input Stream):用于从外部源读取数据。常见的输入流类包括InputStream和Reader的子类。

  • 输出流(Output Stream):用于将数据写入外部目标。常见的输出流类包括OutputStream和Writer的子类。

Java IO结构https://www.processon.com/view/58579498e4b0f767284d1e98?utm_source=yingying

java中文件的具体操作

在整个Java.io包中最重要的有5个类和一个接口。5个类指的是File、OutputStream、InputStream、Writer、Reader;一个接口指的是Serializable. 主要的类如下:

  1. File(文件):File类是对文件系统中文件以及文件夹进行封装的对象,可以通过对象的思想来操作文件和文件夹。 File类保存文件或目录的各种元数据信息,包括文件名、文件长度、最后修改时间、是否可读、获取当前文件的路径名,判断指定文件是否存在、获得当前目录中的文件列表,创建、删除文件和目录等方法。
  2. InputStream(二进制操作):抽象类,基于字节的输入操作,是所有输入流的父类。定义了所有输入流都具有的共同特征。

3、OutputStream(二进制操作):抽象类。基于字节的输出操作。是所有输出流的父类。定义了所有输出流都具有的共同特征。

常用的方法:

1. public void write(byte b ):将参数b中的字节写到输出流。

2. public void write(byte b , int off, int len) :将参数b的从偏移量off开始的len个字节写到输出流。 3. public abstract void write(int b) :先将int转换为byte类型,把低字节写入到输出流中。

4. public void flush( ) : 将数据缓冲区中数据全部输出,并清空缓冲区。

5. public void close( ) : 关闭输出流并释放与流相关的系统资源。

主要的子类:

1. ByteArrayOutputStream:把信息存入内存中的一个缓冲区中

2. FileOutputStream:把信息存入文件中

3. PipedOutputStream:实现了pipe的概念,主要在线程中使用 4. SequenceOutputStream:把多个OutStream合并为一个OutStream

4、Reader(文件操作):抽象类,用于读取字符流。它是所有字符输入流的父类,可以读取字符数组、字符串等。

5、Writer(文件操作):抽象类,用来将字符或字符串写入到输出流中。

6、RandomAccessFile(随机文件操作):既可以读取文件内容,也可以向文件输出数据。同时RandomAccessFile 支持"随机访问"的方式,程序快可以直接跳转到文件的任意地方来读写数据。

字符流Reader的结构 https://www.processon.com/view/53f03b9a0cf2dddac7f2c0f0?utm_source=yingying

Java IO流 https://www.processon.com/view/6087c0ae63768966e83aee2f?utm_source=yingying

相关推荐
计算机毕设定制辅导-无忧学长1 小时前
《基于Spring Boot的减脂轻食购物网站》
java·vue.js·spring boot·后端·减脂轻食购物网站
青山木1 小时前
Hot 100 --- 下一个排列
java·数据结构·算法·leetcode
Thinker QAQ1 小时前
并发编程(六):Atomic 的实现——从 Runtime 到 CPU
java·go·cas·并发编程·atomic·cpython
神仙别闹1 小时前
基于C++实现的(控制台)学校开课查询系统
开发语言·c++
沐欣工作室_lvyiyi1 小时前
基于SpringBoot的博物馆预约系统设计与实现(论文+源码)
java·spring boot·后端·计算机毕业设计
只睡四小时2 小时前
JS 手写 D-pad 空间导航:电视端焦点引擎实战
android·开发语言·前端·javascript·ecmascript·hls·空间导航
2601_962218612 小时前
C++的几种编译器的实现
开发语言·c++
多弗朗皮卡丘2 小时前
C++ stack和queue
开发语言·c++·deque·queue·stack·容器适配器