pdai.tech个人总结整理
2024-09-16 18:21:07 0 举报
AI智能生成
读pdai.tech网站的笔记,自己用
作者其他创作
大纲/内容
全站基础知识问题汇总
上
4、JavaIO
基础IO
1、如何从数据传输理解IO流?
分两类:可将IO流分两类,字节流和字符流
字节字符转换:
这张图展示了 Java 中的字节流和字符流的概念,以及它们如何与输入源和输出接收器进行交互。以下是对图中各部分的详细解释:
### 1. 字符流与字节流
- **字符流(Character Streams)**:
- 使用 `Reader` 和 `Writer` 类处理字符数据。
- 每个字符占用 16 位(`char`),通常用于处理文本数据。
- 适合于读取和写入字符数据,例如文本文件。
- **字节流(Byte Streams)**:
- 使用 `InputStream` 和 `OutputStream` 类处理字节数据。
- 每个字节占用 8 位(`byte`),适合于处理二进制数据(如图片、音频等)。
### 2. 内部数据格式
- **文本格式(char)**:使用 UCS-2 编码。
- **其他数据格式**:包括整数(int)、浮点数(float)、双精度数(double)等。
### 3. 输入源与输出接收器
- **输入源(Input Source)**:
- 可以是键盘、文件、网络或其他程序。
- 数据通过输入流读取。
- **输出接收器(Output Sink)**:
- 可以是控制台、文件、网络或其他程序。
- 数据通过输出流写入。
### 4. 外部数据格式
- **文本的多种编码**:支持多种文本编码格式,如:
- US-ASCII
- ISO-8859-1
- UCS-2
- UTF-8
- UTF-16
- UTF-16BE
- UTF-16LE
- **二进制数据**:原始字节数据。
### 总结
这张图形象地展示了 Java 中如何处理字符和字节流,强调了两者的区别以及它们在输入和输出操作中的作用。字符流主要用于处理文本,而字节流则适合处理任意类型的二进制数据。理解这些概念对于进行文件操作和网络通信等任务非常重要。
### 1. 字符流与字节流
- **字符流(Character Streams)**:
- 使用 `Reader` 和 `Writer` 类处理字符数据。
- 每个字符占用 16 位(`char`),通常用于处理文本数据。
- 适合于读取和写入字符数据,例如文本文件。
- **字节流(Byte Streams)**:
- 使用 `InputStream` 和 `OutputStream` 类处理字节数据。
- 每个字节占用 8 位(`byte`),适合于处理二进制数据(如图片、音频等)。
### 2. 内部数据格式
- **文本格式(char)**:使用 UCS-2 编码。
- **其他数据格式**:包括整数(int)、浮点数(float)、双精度数(double)等。
### 3. 输入源与输出接收器
- **输入源(Input Source)**:
- 可以是键盘、文件、网络或其他程序。
- 数据通过输入流读取。
- **输出接收器(Output Sink)**:
- 可以是控制台、文件、网络或其他程序。
- 数据通过输出流写入。
### 4. 外部数据格式
- **文本的多种编码**:支持多种文本编码格式,如:
- US-ASCII
- ISO-8859-1
- UCS-2
- UTF-8
- UTF-16
- UTF-16BE
- UTF-16LE
- **二进制数据**:原始字节数据。
### 总结
这张图形象地展示了 Java 中如何处理字符和字节流,强调了两者的区别以及它们在输入和输出操作中的作用。字符流主要用于处理文本,而字节流则适合处理任意类型的二进制数据。理解这些概念对于进行文件操作和网络通信等任务非常重要。
字节流byte:就是读取单个字节,用来处理二进制文件(图片、音频、视频文件)
InputStream
ByteArrayInputStream
PipedInputStream
FilterInputStream
BufferedInputStream
DataInputStream
FileInputStream
DataInputStream
OutputStream
ByteArrayOutputStream
PipedOutputStream
FiterOutputStream
BufferedOutputStream
DataOutputStream
PrintStream
FilterOutputStream
ObjectOutputStream
字符流character:读取单个字符,处理文本文件
一个字符根据编码格式的不同,对应的字节数也不同,UTF-8编码中文汉字是3个字节,GBK编码的中文汉字是2个字节
可以将文本文件看做特殊的二进制文件,使用了某种编码,人可以阅读的
一个字符根据编码格式的不同,对应的字节数也不同,UTF-8编码中文汉字是3个字节,GBK编码的中文汉字是2个字节
可以将文本文件看做特殊的二进制文件,使用了某种编码,人可以阅读的
Reader
CharArrayReader
PipedReader
FilterReader
BufferedReader
InputStreamReader
FileReader
Writer
CharArrayWriter
PipedWriter
FilterWriter
BufferedWriter
OutputStreamWriter
FileWriter
PrintWriter
2、如何从数据操作上理解数据流?
从数据来源或者是操作对象的角度来看,IO类可以分为
从数据来源或者是操作对象的角度来看,IO类可以分为
文件(file)
FilterInputStream
FileOutputtream
FileReader
FilrWriter
数组[]
ByteArrayInputStream
ByteArrayOutputStream
CharArrayReader
CharArrayWriter
管道操作
PipedInputStream
PipedOutputStream
PipedReader
PipedWriter
基本数据类型
DataInputerStream
DataOutputStream
缓冲操作
BufferedInputStream
BufferedOutputStream
BufferedReader
BufferedWriter
打印
PrintStream
PirntWrite
对象序列化反序列化
ObjectInputStream
ObjectOutputStream
转换
InputStreamReader
OutputStreamWriter
3、IO设计上使用了什么设计模式?
装饰者设计模式:就是把装饰者套在被装饰者之上
FileInputStream fileInputStream = new FileInputStream(filePath);
BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
4、五种IO模型
什么是阻塞?什么是同步?
阻塞IO和非阻塞IO
这两个是程序级别的问题,当操作系统没有IO资源的时候,非阻塞IO就一直轮训,直到有了IO资源为止
而阻塞IO则是陷入等待
等待的IO何时会被唤醒?
1、别的IO操作完成时当前的会被唤醒2、若设置了超时时间,那么等待时间超时了也会被唤醒3、被其他线程或者尾部事件中断的时候也会被唤醒
等待的IO如何被唤醒?
唤醒机制通常依赖于操作系统和底层IO,1、内核通知:当IO操作完成的时候内核会将相关事件标记为可用2、调度器唤醒:等待超时的IO,会被操作系统的调度器从等待队列转移到就绪队列中,准备再次调度该线程3、上下文切换:当cup空闲时调度器会选择该线程执行,对之前未执行完的线程进行上下文的记录
而阻塞IO则是陷入等待
等待的IO何时会被唤醒?
1、别的IO操作完成时当前的会被唤醒2、若设置了超时时间,那么等待时间超时了也会被唤醒3、被其他线程或者尾部事件中断的时候也会被唤醒
等待的IO如何被唤醒?
唤醒机制通常依赖于操作系统和底层IO,1、内核通知:当IO操作完成的时候内核会将相关事件标记为可用2、调度器唤醒:等待超时的IO,会被操作系统的调度器从等待队列转移到就绪队列中,准备再次调度该线程3、上下文切换:当cup空闲时调度器会选择该线程执行,对之前未执行完的线程进行上下文的记录
同步IO和非同步IO
是操作系统级别的概念
当IO资源不足时,同步IO进行等待,直到IO资源足够后在进行执行;非同步IO的程序则不用等待,返回一个标记(让操作系统直到以后返回的数据该往哪里通知),当IO准备好以后再用事件机制返回给程序
当IO资源不足时,同步IO进行等待,直到IO资源足够后在进行执行;非同步IO的程序则不用等待,返回一个标记(让操作系统直到以后返回的数据该往哪里通知),当IO准备好以后再用事件机制返回给程序
什么是Linux的IO模型?
是指Linux系统中处理IO操作的不同方式方法
网络IO操作的本质是socket的读取,socket在Linux系统中被抽象为流,IO可以理解为对流的操作
网络IO操作的本质是socket的读取,socket在Linux系统中被抽象为流,IO可以理解为对流的操作
1. 阻塞 IO(Blocking IO)
描述:在阻塞 IO 模型中,当应用程序发起一个 IO 操作时,如果数据不可用,调用会被阻塞,直到数据准备好。
特点:
简单易用,编程模型直观。
线程在等待 IO 操作完成时会被挂起,无法执行其他任务。
适用场景:适合简单的应用程序或对性能要求不高的场景。
2. 非阻塞 IO(Non-blocking IO)
描述:在非阻塞 IO 模型中,IO 操作立即返回,如果数据不可用,返回一个错误而不是阻塞。
特点:
应用程序可以在等待 IO 操作的同时执行其他任务。
需要使用循环(polling)来检查数据是否可用。
适用场景:适合需要高并发和响应性的应用程序,如网络服务器。
3. IO 多路复用(IO Multiplexing)
描述:通过使用 select、poll 或 epoll 等系统调用,应用程序可以同时监视多个 IO 描述符。当某个描述符准备好进行 IO 操作时,操作系统会通知应用程序。
特点:
允许单个线程处理多个连接,节省线程资源。
适合高并发场景。
适用场景:通常用于网络服务器和高性能应用程序。
4. 信号驱动 IO(Signal-driven IO)
描述:应用程序可以注册一个信号处理程序,当 IO 操作准备好时,内核会发送一个信号通知应用程序。
特点:
结合了非阻塞 IO 和信号机制。
适合需要异步处理的场景。
适用场景:适合需要异步通知的应用程序。
5. 异步 IO(Asynchronous IO)
描述:在异步 IO 模型中,应用程序发起 IO 操作后,立即返回并继续执行,而不需要等待 IO 操作完成。完成后,应用程序会接收到通知。
特点:
提高了程序的并发处理能力。
复杂性较高,需要管理回调或使用其他机制来处理完成通知。
适用场景:适合高性能和高并发的应用程序,如数据库和大规模网络服务。
描述:在阻塞 IO 模型中,当应用程序发起一个 IO 操作时,如果数据不可用,调用会被阻塞,直到数据准备好。
特点:
简单易用,编程模型直观。
线程在等待 IO 操作完成时会被挂起,无法执行其他任务。
适用场景:适合简单的应用程序或对性能要求不高的场景。
2. 非阻塞 IO(Non-blocking IO)
描述:在非阻塞 IO 模型中,IO 操作立即返回,如果数据不可用,返回一个错误而不是阻塞。
特点:
应用程序可以在等待 IO 操作的同时执行其他任务。
需要使用循环(polling)来检查数据是否可用。
适用场景:适合需要高并发和响应性的应用程序,如网络服务器。
3. IO 多路复用(IO Multiplexing)
描述:通过使用 select、poll 或 epoll 等系统调用,应用程序可以同时监视多个 IO 描述符。当某个描述符准备好进行 IO 操作时,操作系统会通知应用程序。
特点:
允许单个线程处理多个连接,节省线程资源。
适合高并发场景。
适用场景:通常用于网络服务器和高性能应用程序。
4. 信号驱动 IO(Signal-driven IO)
描述:应用程序可以注册一个信号处理程序,当 IO 操作准备好时,内核会发送一个信号通知应用程序。
特点:
结合了非阻塞 IO 和信号机制。
适合需要异步处理的场景。
适用场景:适合需要异步通知的应用程序。
5. 异步 IO(Asynchronous IO)
描述:在异步 IO 模型中,应用程序发起 IO 操作后,立即返回并继续执行,而不需要等待 IO 操作完成。完成后,应用程序会接收到通知。
特点:
提高了程序的并发处理能力。
复杂性较高,需要管理回调或使用其他机制来处理完成通知。
适用场景:适合高性能和高并发的应用程序,如数据库和大规模网络服务。
五种IO模型
什么是异步IO
什么是信号驱动IO?
什么是多路复用IO?
有哪些多路复用IO?
什么是同步非阻塞IO?
什么是同步阻塞IO?
什么是Reactor模型?
什么是JavaNIO?
收藏
收藏
0 条评论
下一页