一文带你了解Java的I O机制

爱被打了一巴掌 2023-10-12 18:55 113阅读 0赞

Java I/O

  • 一:故事背景
  • 二:什么是Java的I\O机制
    • 2.1 流
      • 2.1.2 字节流和字符流的区别
      • 2.1.3 输入流和输出流的区别
    • 2.2 文件 I/O
    • 2.3 缓冲 I/O
    • 2.4 标准 输入/输出
    • 2.5 对象序列化与反序列化
    • 2.6 N I/O
  • 三:画图表示Java I/O机制
    • 3.1 输入输入系统流程示意
    • 3.2 输入流
    • 3.3 输出流
  • 四:Java I/O 常用API
    • 4.1 FileInputStream和FileOutputStream
    • 4.2 BufferedReader和BufferedWriter
    • 4.3 Socket和ServerSocket:
  • 五:总结

一:故事背景

最近在回顾Java的I/O机制,之前通过Java的I/O操作,做过对应的文件上传工作。对接过其它三方的平台,通过流的方式进行过文件上传。但是一直没有系统的总结过,Java的流以及Java的流操作。今天就在这里总结一下Java的 I/O操作,介绍一下流的概念,以及常用的API。

二:什么是Java的I\O机制

在说JavaI/O之前,让我们先来明确几个概念:

2.1 流

  • Java中的 I/O操作主要通过流的方式进行。
  • 流是对字节序列的抽象,用于从输入源读取数据(Input)或者将数据写入输入目标(output)。
  • Java中的流分为两类:字节流(InputStream和OutputStream)、字符流(Reader和Writer),这两类又按照功能可以分为输入流(InputStream、Reader)和输出流(OutputStream、Writer)。

2.1.2 字节流和字符流的区别

字符流和字节流主要有以下几个方面的区别:

  1. 数据单元

    • 字节流以字节(byte)为单位进行读取和写入操作
    • 字符流以字符(char)为单位进行读取和写入操作
  2. 处理内容

    • 字节流适合处理二进制数据。(例如:图像、音频、视频)
    • 字符流适合处理文本数据。(以字符为单位处理)
  3. 底层实现

    • 字节流底层用字节序列进行读写,通常直接操作底层字节流(文件流、网路流)
    • 字符流通弄过字符序列进行读写,通常建立在字节流之上,使用编码(如:utf-8) 将字符转为字节。
  4. 缓冲性能

    • 字节流通过(BufferedInputStream和BufferedOutputStream),提高I/O性能
    • 字符流通过(BufferedReader和BufferedWriter),提高I/O性能

2.1.3 输入流和输出流的区别

  • 输入流(InputStream、Reader):用于从源读取数据、例如从文件、网络连接、标准输入流(键盘输入)中读取数据。
  • 输出流(OutputStream/Writer)用于向目标写入数据,例如写入数据到文件、网络连接或标准输出流(屏幕输出)。

2.2 文件 I/O

  • Java提供了File类和FileInputStream/FileOutputStream类,用于读取和写入文件。
  • 可以使用FileInputStream来打开文件并读取其中的数据,使用FileOutputStream来创建文件并写入数据。

2.3 缓冲 I/O

  • Java提供了缓冲流(BufferedInputStream/BufferedOutputStream和BufferedReader/BufferedWriter)来提高I/O性能。
  • 缓冲流通过在内存中缓冲数据,减少了每次对物理设备的实际读写操作,从而提高效率。

2.4 标准 输入/输出

Java中标准流一共分为三种:

  • System.out 标准输出流
  • System.in 标准输入流
  • System.err 标准错误流

2.5 对象序列化与反序列化

  • Java的对象序列化机制允许将对象转换为字节流,以便在网络上传输或存储到文件中。
  • 可以使用ObjectInputStream和ObjectOutputStream来读取和写入序列化对象。

2.6 N I/O

  • ava NIO是Java 1.4引入的一种更高级的I/O API。
  • NIO提供了非阻塞I/O操作和高性能的I/O处理方式,适用于处理大量并发连接的场景。
  • NIO使用通道(Channel)和缓冲区(Buffer)来进行数据读写操作,通过Selector进行事件驱动的多路复用。

三:画图表示Java I/O机制

3.1 输入输入系统流程示意

此图表示与给输入输出的一个整个的过程:
在这里插入图片描述

3.2 输入流

上文我们提到了Java中的流主要分为 字节流和字符流,这里主要给出字节流和字符流的图的示意

字节输入流:
在这里插入图片描述
字符输入流:
在这里插入图片描述

3.3 输出流

字符输入流:

在这里插入图片描述
字符输出流:
在这里插入图片描述

四:Java I/O 常用API

4.1 FileInputStream和FileOutputStream

FileInputStream和FileOutputStream是文件常用的处理类,可以用来进行文件的输入与输出操作。

  1. import java.io.FileInputStream;
  2. import java.io.FileOutputStream;
  3. import java.io.IOException;
  4. public class FileIOExample {
  5. public static void main(String[] args) {
  6. try {
  7. // 文件输入流
  8. FileInputStream input = new FileInputStream("input.txt");
  9. // 文件输出流
  10. FileOutputStream output = new FileOutputStream("output.txt");
  11. // 读取文件并写入到另一个文件
  12. int data;
  13. while ((data = input.read()) != -1) {
  14. output.write(data);
  15. }
  16. // 关闭流
  17. input.close();
  18. output.close();
  19. } catch (IOException e) {
  20. e.printStackTrace();
  21. }
  22. }
  23. }

4.2 BufferedReader和BufferedWriter

BufferedReader和BufferedWriter(用于带缓冲的文本输入和输出):

  1. import java.io.BufferedReader;
  2. import java.io.BufferedWriter;
  3. import java.io.FileReader;
  4. import java.io.FileWriter;
  5. import java.io.IOException;
  6. public class BufferedIOExample {
  7. public static void main(String[] args) {
  8. try {
  9. // 读取文件
  10. BufferedReader reader = new BufferedReader(new FileReader("input.txt"));
  11. // 写入文件
  12. BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"));
  13. // 逐行读取并写入到另一个文件
  14. String line;
  15. while ((line = reader.readLine()) != null) {
  16. writer.write(line);
  17. writer.newLine(); // 写入换行符
  18. }
  19. // 关闭流
  20. reader.close();
  21. writer.close();
  22. } catch (IOException e) {
  23. e.printStackTrace();
  24. }
  25. }
  26. }

4.3 Socket和ServerSocket:

用于网络编程中的套接字通信:

  1. import java.io.IOException;
  2. import java.io.InputStream;
  3. import java.io.OutputStream;
  4. import java.net.ServerSocket;
  5. import java.net.Socket;
  6. public class SocketExample {
  7. public static void main(String[] args) {
  8. try {
  9. // 创建服务器套接字并监听指定端口
  10. ServerSocket serverSocket = new ServerSocket(8080);
  11. System.out.println("Server started. Waiting for client connection...");
  12. // 等待客户端连接
  13. Socket clientSocket = serverSocket.accept();
  14. System.out.println("Client connected.");
  15. // 获取输入流和输出流
  16. InputStream input = clientSocket.getInputStream();
  17. OutputStream output = clientSocket.getOutputStream();
  18. // 读取客户端发送的数据
  19. byte[] buffer = new byte[1024];
  20. int bytesRead = input.read(buffer);
  21. String data = new String(buffer, 0, bytesRead);
  22. System.out.println("Received data from client: " + data);
  23. // 向客户端发送响应数据
  24. String response = "Hello from server!";
  25. output.write(response.getBytes());
  26. // 关闭流和套接字
  27. input.close();
  28. output.close();
  29. clientSocket.close();
  30. serverSocket.close();
  31. } catch (IOException e) {
  32. e.printStackTrace();
  33. }
  34. }
  35. }

五:总结

本文给出了I/O和N/IO的具体概念和示例。大家感兴趣可以将代码复制到本地,跑一跑,尝试运行。通过调试的方式,理解java的I/O的使用。

发表评论

表情:
评论列表 (有 0 条评论,113人围观)

还没有评论,来说两句吧...

相关阅读

    相关 了解云HIS

    一、简介   基于云计算技术的B/S架构的HIS系统,为基层医院机构提供标准化的、信息化的、可共享的医疗信息管理系统,实现医患事务管理和临床诊疗管理等标准管理信息系统的

    相关 了解云原生

    > 文章转载于百度百家号:AI课工场 自进入云计算时代后,大量的新概念、新技术如雨后春笋般的涌现出来,从早期的openstack、IAAS平台,到中期的容器技术、微服务架构,