一文带你了解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的使用。

目录
相关文章
|
5天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
16 2
|
9天前
|
Java 编译器
探索Java中的异常处理机制
【10月更文挑战第35天】在Java的世界中,异常是程序运行过程中不可避免的一部分。本文将通过通俗易懂的语言和生动的比喻,带你了解Java中的异常处理机制,包括异常的类型、如何捕获和处理异常,以及如何在代码中有效地利用异常处理来提升程序的健壮性。让我们一起走进Java的异常世界,学习如何优雅地面对和解决问题吧!
|
20天前
|
XML 安全 Java
Java反射机制:解锁代码的无限可能
Java 反射(Reflection)是Java 的特征之一,它允许程序在运行时动态地访问和操作类的信息,包括类的属性、方法和构造函数。 反射机制能够使程序具备更大的灵活性和扩展性
33 5
Java反射机制:解锁代码的无限可能
|
8天前
|
Java 数据库连接 开发者
Java中的异常处理机制及其最佳实践####
在本文中,我们将探讨Java编程语言中的异常处理机制。通过深入分析try-catch语句、throws关键字以及自定义异常的创建与使用,我们旨在揭示如何有效地管理和响应程序运行中的错误和异常情况。此外,本文还将讨论一些最佳实践,以帮助开发者编写更加健壮和易于维护的代码。 ####
|
14天前
|
安全 IDE Java
Java反射Reflect机制详解
Java反射(Reflection)机制是Java语言的重要特性之一,允许程序在运行时动态地获取类的信息,并对类进行操作,如创建实例、调用方法、访问字段等。反射机制极大地提高了Java程序的灵活性和动态性,但也带来了性能和安全方面的挑战。本文将详细介绍Java反射机制的基本概念、常用操作、应用场景以及其优缺点。 ## 基本概念 ### 什么是反射 反射是一种在程序运行时动态获取类的信息,并对类进行操作的机制。通过反射,程序可以在运行时获得类的字段、方法、构造函数等信息,并可以动态调用方法、创建实例和访问字段。 ### 反射的核心类 Java反射机制主要由以下几个类和接口组成,这些类
33 2
|
19天前
|
存储 缓存 安全
🌟Java零基础:深入解析Java序列化机制
【10月更文挑战第20天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
22 3
|
19天前
|
安全 Java UED
深入理解Java中的异常处理机制
【10月更文挑战第25天】在编程世界中,错误和意外是不可避免的。Java作为一种广泛使用的编程语言,其异常处理机制是确保程序健壮性和可靠性的关键。本文通过浅显易懂的语言和实际示例,引导读者了解Java异常处理的基本概念、分类以及如何有效地使用try-catch-finally语句来处理异常情况。我们将从一个简单的例子开始,逐步深入到异常处理的最佳实践,旨在帮助初学者和有经验的开发者更好地掌握这一重要技能。
20 2
|
21天前
|
存储 运维 Java
💻Java零基础:深入了解Java内存机制
【10月更文挑战第18天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
27 1
|
15天前
|
Java 开发者
深入理解Java异常处理机制
【10月更文挑战第29天】在Java的世界中,异常处理如同生活的调味品,不可或缺。它确保了程序在遇到错误时不会崩溃,而是优雅地继续运行或者给出提示。本文将带你领略异常处理的奥秘,从基础的try-catch语句到高级的自定义异常,让你在面对程序中的各种“意外”时,能够从容应对。
|
17天前
|
SQL Java
探索Java中的异常处理机制
【10月更文挑战第26天】 在本文中,我们将深入探讨Java编程语言的异常处理机制。通过分析不同类型的异常、异常的捕获与抛出方式,以及如何自定义异常类,读者将能够更好地理解并应用Java中的异常处理机制来提高代码的健壮性和可读性。
23 0