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

news2025/1/15 12:51:23

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

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的使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/679092.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue中响应式的数组方法

vue响应式的数组方法 1、push 在数组中追加元素 <div id"app"><ul><li v-for"item in arr">{{item}}</li></ul><button click "change">按钮</button> </div> <script src"js/vue.js&…

普通单目相机标定——准备工作

前言 这里我们还是以普通相机为例(非鱼眼相机)来进行后续的相关标定操作,再回顾下相机的成像模型如下所示。 已知相机内参(fx,fy,u0,v0),畸变系数[k1,k2,k3,p1,p2],相机外参[R|T]。世界坐标系中点Pw(Xw,Yw,Zw),投影至像素坐标系点p(u,v)的计算过程如下。 1)由世…

Linux基础_1

目录 一、用户登录 1、root用户 2、普通&#xff08;非特权&#xff09;用户 二、终端terminal 1、终端类型 2、查看当前的终端设备 三、交互式接口 1、概念&#xff1a;启动终端后&#xff0c;在终端设备附加一个交互式应用程序 2、类型 3、什么是Shell 4、各种She…

Python源码:用turtle画美国队长盾牌

解析&#xff1a; 美国队长盾牌结构分析&#xff1a; 有4个圆和一个五角星组成。 源码如下&#xff1a; import turtle as t #控制画笔的速度 t.speed(10) #画最外面的大圆 t.penup() t.goto(100,-235) t.pendown() t.color("red","red") t.begin_fill(…

iOS 实现多scheme 切换环境完整流程

文章目录 一、 添加configuration二、 添加scheme三、 设置scheme 和 configuration的对应关系四 、 本地配置文件五、 运行 前言 我们在开发中都要涉及到切换环境&#xff0c;很多小伙伴是通过宏定义的方式实现 切换环境的 &#xff0c; 这种方式不优雅&#xff0c;还可造成每…

MySQL基础篇(day02,复习自用)

MySQL第二天 基本的SELECT语句大小规范注释命名规则数据导入指令select语句练习 运算符代码练习 基本的SELECT语句 SQL 可以写在一行或者多行。为了提高可读性&#xff0c;各子句分行写&#xff0c;必要时使用缩进 每条命令以 ; 或 \g 或 \G 结束 关键字不能被缩写也不能分行 关…

中国开源,迈入“新生代”

提到中国开源&#xff0c;大家会想到什么&#xff1f; “追随者&#xff0c;而不是创造者”“国外一开源&#xff0c;国內就自主”“全球开源社区里的nobody”……如果你带着这些“刻板印象”&#xff0c;参加近两年国內的开源活动&#xff0c;极大可能会受到不小的震撼。 中国…

cglib动态代理 | 如何生成代理类、代理类内容解析

文章目录 简介一、cglib动态代理有什么特点CgLib动态代理&#xff1a;优点&#xff1a;缺点&#xff1a; 二、Cglib如何生成代理类生成代理类的具体代码&#xff1a;生成代理对象的具体代码&#xff1a; 三、代理类内容解析持久化代理类&#xff1a;代理类内容&#xff1a; Cgl…

数据指标体系建设

一、什么是数据指标体系&#xff1f; 指标体系是从不同维度梳理业务&#xff0c;把指标有系统的组织起来。简而言之&#xff0c;指标体系指标体系&#xff0c;所以一个指标不能叫指标体系&#xff0c;几个毫无关系的指标也不叫指标体系。指标体系就像是一个整体、一辆车&#…

MacOS Sonoma 14.0 (23A5276g) Beta2 带 OC 引导双分区黑苹果镜像

苹果今日向 Mac 电脑用户推送了 macOS 14 开发者预览版 Beta2 更新&#xff08;内部版本号&#xff1a;23A5276g&#xff09;&#xff0c;本次更新距离上次发布隔了 15 天。 镜像下载&#xff1a; 微信公众号&#xff1a; macOS Sonoma 14.0 (23A5276g) Beta2 带 OC 引导双分…

【人工智能】— 深度神经网络、卷积神经网络(CNN)、多卷积核、全连接、池化

【人工智能】— 深度神经网络、卷积神经网络&#xff08;CNN&#xff09;、多卷积核、全连接、池化 深度神经网络训练训练深度神经网络参数共享 卷积神经网络&#xff08;CNN&#xff09;卷积多卷积核卷积全连接最大池化卷积池化拉平向量激活函数优化小结 深度神经网络训练 Pr…

罗大佑、把午睡打造成领域驱动设计创新-UMLChina建模知识竞赛第4赛季第6轮

DDD领域驱动设计批评文集 欢迎加入“软件方法建模师”群 《软件方法》各章合集 参考潘加宇在《软件方法》和UMLChina公众号文章中发表的内容作答。在本文下留言回答。 只要最先答对前3题&#xff0c;即可获得本轮优胜。第4题为附加题&#xff0c;对错不影响优胜者的判定&am…

最优化系列 之 线性规划问题的灵敏度分析(1/6)

一、实验目的&#xff1a; 1. 掌握用MATLAB、LINGO 、EXCEL优化工具箱解线性规划的方法&#xff1b; 2. 练习建立实际问题的线性规划模型&#xff1b; 3. 掌握线性规划灵敏度分析原理&#xff1b; 4. 预习线性规划的灵敏度分析原理及方法。 二、实验内容 题目1&#xff1a;求解…

【spring cloud学习】2、Eureka服务注册与发现

前言 一套微服务架构的系统由很多单一职责的服务单元组成&#xff0c;而每个服务单元又有众多运行实例。由于各服务单元颗粒度较小、数量众多&#xff0c;相互之间呈现网状依赖关系&#xff0c;因此需要服务注册中心来统一管理微服务实例&#xff0c;维护各服务实例的健康状态…

终端基础知识

CLI、Terminal、Shell、Prompt 一、CLI CLI is the abbreviation of Command Line Interface. It’s a text-based way of interacting with a computer. 相比于图像界面提供的按钮&#xff0c;你可以使用一行命令来实现你想要的功能&#xff0c;比如说打开、关闭文件&…

Linux用户信息关键文件详解

passwd文件说明 /etc/passwd文件记录了Linux所有用户的信息&#xff0c;是系统的关键文件之一。 文件格式内容如上图。 文件中的条目以“:”为分隔符&#xff0c;各个字段记录的信息依次为&#xff1a; 第一个字段&#xff1a;记录用户名 第二个字段&#xff1a;值x表示该用…

如何做一份干净的git提交记录

背景 毕业工作有一些年头了&#xff0c;之前在写工作代码或者给开源项目贡献的时候&#xff0c;提交代码都不是很规范&#xff0c;甚至可以说十分的随意&#xff0c;想到什么就提交什么&#xff0c;根本没有管理提交记录的概念或者想法&#xff08;当你身边的人都不怎么在意的…

基于SpringBoot+SpringCloud+vue的智慧养老平台设计与实现

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

大数据企业开发全套流程

大数据企业开发基础流程 Linux命令 1 Hadoop(HDFSYarn)单机版环境搭建 Hadoop 是一个开源的分布式计算框架&#xff0c;由 HDFS&#xff08;Hadoop Distributed File System&#xff09;和 YARN&#xff08;Yet Another Resource Negotiator&#xff09;两个核心组件组成。HD…

网络安全的含义及特征

网络安全从其本质上讲就是网络上的信息安全&#xff0c;指网络系统的硬件、软件及数据受到保护。不遭受破坏、更改、泄露&#xff0c;系统可靠正常地运行&#xff0c;网络服务不中断。从用户的角度&#xff0c;他们希望涉及到个人和商业的信息在网络上传输时受到机密性、完整性…