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

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

Java I/O

五:总结

一:故事背景

最近在回顾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 字节流和字符流的区别

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


数据单元

字节流以字节(byte)为单位进行读取和写入操作

字符流以字符(char)为单位进行读取和写入操作


处理内容

字节流适合处理二进制数据。(例如:图像、音频、视频)

字符流适合处理文本数据。(以字符为单位处理)


底层实现

字节流底层用字节序列进行读写,通常直接操作底层字节流(文件流、网路流)

字符流通弄过字符序列进行读写,通常建立在字节流之上,使用编码(如:utf-8) 将字符转为字节。


缓冲性能

字节流通过(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是文件常用的处理类,可以用来进行文件的输入与输出操作。

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileIOExample {
    public static void main(String[] args) {
        try {
            // 文件输入流
            FileInputStream input = new FileInputStream("input.txt");
            // 文件输出流
            FileOutputStream output = new FileOutputStream("output.txt");
            // 读取文件并写入到另一个文件
            int data;
            while ((data = input.read()) != -1) {
                output.write(data);
            }
            // 关闭流
            input.close();
            output.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

4.2 BufferedReader和BufferedWriter

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

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class BufferedIOExample {
    public static void main(String[] args) {
        try {
            // 读取文件
            BufferedReader reader = new BufferedReader(new FileReader("input.txt"));
            // 写入文件
            BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"));
            // 逐行读取并写入到另一个文件
            String line;
            while ((line = reader.readLine()) != null) {
                writer.write(line);
                writer.newLine(); // 写入换行符
            }
            // 关闭流
            reader.close();
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

4.3 Socket和ServerSocket:

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

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class SocketExample {
    public static void main(String[] args) {
        try {
            // 创建服务器套接字并监听指定端口
            ServerSocket serverSocket = new ServerSocket(8080);
            System.out.println("Server started. Waiting for client connection...");
            // 等待客户端连接
            Socket clientSocket = serverSocket.accept();
            System.out.println("Client connected.");
            // 获取输入流和输出流
            InputStream input = clientSocket.getInputStream();
            OutputStream output = clientSocket.getOutputStream();
            // 读取客户端发送的数据
            byte[] buffer = new byte[1024];
            int bytesRead = input.read(buffer);
            String data = new String(buffer, 0, bytesRead);
            System.out.println("Received data from client: " + data);
            // 向客户端发送响应数据
            String response = "Hello from server!";
            output.write(response.getBytes());
            // 关闭流和套接字
            input.close();
            output.close();
            clientSocket.close();
            serverSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

五:总结

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

目录
相关文章
|
设计模式 人工智能 安全
AQS:Java 中悲观锁的底层实现机制
AQS(AbstractQueuedSynchronizer)是Java并发包中实现同步组件的基础工具,支持锁(如ReentrantLock、ReadWriteLock)和线程同步工具类(如CountDownLatch、Semaphore)等。Doug Lea设计AQS旨在抽象基础同步操作,简化同步组件构建。 使用AQS需实现`tryAcquire(int arg)`和`tryRelease(int arg)`方法以获取和释放资源,共享模式还需实现`tryAcquireShared(int arg)`和`tryReleaseShared(int arg)`。
592 32
AQS:Java 中悲观锁的底层实现机制
|
12月前
|
监控 Java API
现代 Java IO 高性能实践从原理到落地的高效实现路径与实战指南
本文深入解析现代Java高性能IO实践,涵盖异步非阻塞IO、操作系统优化、大文件处理、响应式网络编程与数据库访问,结合Netty、Reactor等技术落地高并发应用,助力构建高效可扩展的IO系统。
350 0
|
人工智能 Java 关系型数据库
Java——SPI机制详解
SPI(Service Provider Interface)是JDK内置的服务提供发现机制,主要用于框架扩展和组件替换。通过在`META-INF/services/`目录下定义接口实现类文件,Java程序可利用`ServiceLoader`动态加载服务实现。SPI核心思想是解耦,允许不同厂商为同一接口提供多种实现,如`java.sql.Driver`的MySQL与PostgreSQL实现。然而,SPI存在缺陷:需遍历所有实现并实例化,可能造成资源浪费;获取实现类方式不够灵活;多线程使用时存在安全问题。尽管如此,SPI仍是Java生态系统中实现插件化和模块化设计的重要工具。
762 0
|
9月前
|
Java Unix Go
【Java】(8)Stream流、文件File相关操作,IO的含义与运用
Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。!但本节讲述最基本的和流与 I/O 相关的功能。我们将通过一个个例子来学习这些功能。
343 1
|
11月前
|
Java 测试技术 API
Java IO流(二):文件操作与NIO入门
本文详解Java NIO与传统IO的区别与优势,涵盖Path、Files类、Channel、Buffer、Selector等核心概念,深入讲解文件操作、目录遍历、NIO实战及性能优化技巧,适合处理大文件与高并发场景,助力高效IO编程与面试准备。
|
12月前
|
存储 Java Linux
操作系统层面视角下 Java IO 的演进路径及核心技术变革解析
本文从操作系统层面深入解析Java IO的演进历程,涵盖BIO、NIO、多路复用器及Netty等核心技术。分析各阶段IO模型的原理、优缺点及系统调用机制,探讨Java如何通过底层优化提升并发性能与数据处理效率,全面呈现IO技术的变革路径与发展趋势。
251 3
|
人工智能 前端开发 安全
Java开发不可不知的秘密:类加载器实现机制
类加载器是Java中负责动态加载类到JVM的组件,理解其工作原理对开发复杂应用至关重要。本文详解类加载过程、双亲委派模型及常见类加载器,并介绍自定义类加载器的实现与应用场景。
408 4
|
11月前
|
SQL Java 数据库连接
Java IO流(一):字节流与字符流基础
本文全面解析Java IO流,涵盖字节流、字符流及其使用场景,帮助开发者理解IO流分类与用途,掌握文件读写、编码转换、异常处理等核心技术,通过实战案例提升IO编程能力。
|
Java 区块链 网络架构
酷阿鲸森林农场:Java 区块链系统中的 P2P 区块同步与节点自动加入机制
本文介绍了基于 Java 的去中心化区块链电商系统设计与实现,重点探讨了 P2P 网络在酷阿鲸森林农场项目中的应用。通过节点自动发现、区块广播同步及链校验功能,系统实现了无需中心服务器的点对点网络架构。文章详细解析了核心代码逻辑,包括 P2P 服务端监听、客户端广播新区块及节点列表自动获取等环节,并提出了消息签名验证、WebSocket 替代 Socket 等优化方向。该系统不仅适用于农业电商,还可扩展至教育、物流等领域,构建可信数据链条。
|
缓存 Dubbo Java
理解的Java中SPI机制
本文深入解析了JDK提供的Java SPI(Service Provider Interface)机制,这是一种基于接口编程、策略模式与配置文件组合实现的动态加载机制,核心在于解耦。文章通过具体示例介绍了SPI的使用方法,包括定义接口、创建配置文件及加载实现类的过程,并分析了其原理与优缺点。SPI适用于框架扩展或替换场景,如JDBC驱动加载、SLF4J日志实现等,但存在加载效率低和线程安全问题。
822 7
理解的Java中SPI机制