当前位置: 首页 > news >正文

Java IO 流操作详解

Java IO 流操作详解

  • 一、简介
    • 1. 什么是IO流
    • 2. IO流的分类
    • 3. IO流的作用
  • 二、Java IO流的输入操作
    • 1. 文件输入流
    • 2. 字节输入流
    • 3. 缓冲输入流
    • 4. 对象输入流
  • 三、Java IO流的输出操作
    • 1. 文件输出流
    • 2. 字节输出流
    • 3. 缓冲输出流
    • 4. 对象输出流
  • 四、Java IO流的常用方法解析
    • 1. 字节读写操作
      • 1.1 FileInputStream和FileOutputStream
      • 1.2 DataInputStream和DataOutputStream
    • 2. 按字符读写操作
      • 2.1 FileReader和FileWriter
      • 2.2 BufferedReader和BufferedWriter
    • 3. 随机读写文件操作
      • 3.1 RandomAccessFile
    • 4. 大文件读写操作
      • 4.1 使用MappedByteBuffer
  • 五、Java NIO模块
    • 1. NIO概述
    • 2. NIO与IO的对比
    • 3. NIO模块的核心组件
      • 3.1 Buffer
      • 3.2 Channel
      • 3.3 Selector
    • 4. NIO模块的使用方式
      • 4.1 读取文件数据
      • 4.2 写入文件数据

一、简介

Java IO流提供了一种可以对数据进行输入输出的机制。可以把它比作是一条河流从源头流向目标地,由源文件输入到程序再由程序输出到目标文件。

1. 什么是IO流

IO即Input/Output顾名思义就是数据的输入输出,在Java中指的是java.io包中的类库,提供了一系列操作数据输入与输出的类和接口。

2. IO流的分类

Java IO流按照其功能可以分为4种类型:

  1. 字节流(Byte Streams):从字节流中读入或输出8位字节数据。InputStream 和 OutputStream 都是针对字节的流。
  2. 字符流(Character Streams):从字符流中读入或输出16位Unicode字符。Reader 和 Writer 都是针对字符的流。
  3. 节点流(Node Streams):Advanced 系列流,如 FileInputStream、FileOutputStream。
  4. 处理流(Filter Streams):Decorator 系列流,如 BufferedInputStream、BufferedOutputStream、ObjectInputStream、ObjectOutputStream。

3. IO流的作用

在Java中IO流的主要作用是将数据从一个地方传输到另一个地方。我们可以使用Java的IO流来实现从文件、控制台甚至是网络传输数据等功能。对于不同的需求,可以灵活选择不同的IO流类型。

二、Java IO流的输入操作

Java IO流提供了多种输入操作的类和接口下面将分别介绍其中的四种。

1. 文件输入流

用于从文件中读取数据可以使用 java.io.FileInputStream 类来实现。

try {FileInputStream fis = new FileInputStream("file.txt");   // 指定文件路径int c;while ((c = fis.read()) != -1) {    // 从文件中读取数据System.out.print((char)c);     // 输出数据到控制台}fis.close();                        // 关闭文件流
} catch (IOException e) {e.printStackTrace();
}

2. 字节输入流

用于从数据源中读取字节数据可以使用 java.io.InputStream 类来实现。

try {InputStream is = new FileInputStream("file.txt");    // 指定数据源int c;while ((c = is.read()) != -1) {     // 从数据源读取数据System.out.print((char)c);      // 输出数据到控制台}is.close();                         // 关闭数据流
} catch (IOException e) {e.printStackTrace();
}

3. 缓冲输入流

提供了对 IO 字节输入流的缓存机制可以使用 java.io.BufferedInputStream 类来实现

try {InputStream is = new FileInputStream("file.txt");    // 指定数据源BufferedInputStream bis = new BufferedInputStream(is);    // 使用缓冲输入流读取数据int c;while ((c = bis.read()) != -1) {    // 从缓冲输入流中读取数据System.out.print((char)c);      // 输出数据到控制台}is.close();                         // 关闭数据流
} catch (IOException e) {e.printStackTrace();
}

4. 对象输入流

用于读取对象的相关信息可以使用 java.io.ObjectInputStream 类来实现

try {InputStream is = new FileInputStream("file.txt");     // 指定数据源ObjectInputStream ois = new ObjectInputStream(is);     // 使用对象输入流读取对象相关信息Object obj = ois.readObject();      // 从对象输入流中读取对象相关信息并实例化为一个对象System.out.println(obj);            // 输出读取到的对象is.close();                         // 关闭数据流
} catch (IOException | ClassNotFoundException e) {e.printStackTrace();
}

三、Java IO流的输出操作

Java IO流提供了多种输出操作的类和接口,下面将分别介绍其中的四种。

1. 文件输出流

用于向文件中写入数据可以使用 java.io.FileOutputStream 类来实现

try {FileOutputStream fos = new FileOutputStream("file.txt");     // 指定输出文件路径String s = "Hello, World!";         // 要写入文件的内容byte[] bytes = s.getBytes();        // 将要写入的字符串转化为字节数组fos.write(bytes);                   // 向文件中写入字节数据fos.close();                        // 关闭文件流
} catch (IOException e) {e.printStackTrace();
}

2. 字节输出流

用于向数据源中输出字节数据可以使用 java.io.OutputStream 类来实现

try {OutputStream os = new FileOutputStream("file.txt");   // 指定数据源String s = "Hello, World!";         // 要写入数据源的内容byte[] bytes = s.getBytes();        // 将要写入的字符串转化为字节数组os.write(bytes);                    // 向数据源中写入字节数据os.close();                         // 关闭数据流
} catch (IOException e) {e.printStackTrace();
}

3. 缓冲输出流

提供了对 IO 字节输出流的缓存机制可以使用 java.io.BufferedOutputStream 类来实现

try {OutputStream os = new FileOutputStream("file.txt");   // 指定数据源BufferedOutputStream bos = new BufferedOutputStream(os);     // 使用缓冲输出流写入数据源String s = "Hello, World!";         // 要写入数据源的内容byte[] bytes = s.getBytes();        // 将要写入的字符串转化为字节数组bos.write(bytes);                   // 向缓冲输出流中写入字节数据bos.flush();                        // 刷新流数据到文件,清空缓存os.close();                         // 关闭数据流
} catch (IOException e) {e.printStackTrace();
}

4. 对象输出流

用于将对象信息写入输出源可以使用 java.io.ObjectOutputStream 类来实现

try {OutputStream os = new FileOutputStream("file.txt");     // 指定数据源ObjectOutputStream oos = new ObjectOutputStream(os);   // 创建对象输出流Object obj = new Object();          // 要写入数据源的对象oos.writeObject(obj);               // 将对象信息写入输出源oos.flush();                        // 刷新流数据到文件,清空缓存os.close();                         // 关闭数据流
} catch (IOException e) {e.printStackTrace();
}

四、Java IO流的常用方法解析

1. 字节读写操作

1.1 FileInputStream和FileOutputStream

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;public class ByteStreamExample {public static void main(String[] args) {File inputFile = new File("input.txt");File outputFile = new File("output.txt");try (FileInputStream inputStream = new FileInputStream(inputFile);FileOutputStream outputStream = new FileOutputStream(outputFile)) {byte[] buffer = new byte[1024];int length;while ((length = inputStream.read(buffer)) != -1) {outputStream.write(buffer, 0, length);}} catch (IOException e) {e.printStackTrace();}}
}

以上代码实现了从input.txt文件读取数据并写入到output.txt文件中。

1.2 DataInputStream和DataOutputStream

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;public class DataStreamExample {public static void main(String[] args) {File inputFile = new File("input.txt");File outputFile = new File("output.txt");try (DataInputStream inputStream = new DataInputStream(new FileInputStream(inputFile));DataOutputStream outputStream = new DataOutputStream(new FileOutputStream(outputFile))) {int intValue = inputStream.readInt();outputStream.writeInt(intValue);boolean boolValue = inputStream.readBoolean();outputStream.writeBoolean(boolValue);String strValue = inputStream.readUTF();outputStream.writeUTF(strValue);} catch (IOException e) {e.printStackTrace();}}
}

以上代码实现了从input.txt文件中读取整型、布尔型和字符串类型数据,然后将这些数据写入到output.txt文件中。

2. 按字符读写操作

2.1 FileReader和FileWriter

import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;public class CharStreamExample {public static void main(String[] args) {File inputFile = new File("input.txt");File outputFile = new File("output.txt");try (FileReader reader = new FileReader(inputFile);FileWriter writer = new FileWriter(outputFile)) {char[] buffer = new char[1024];int length;while ((length = reader.read(buffer)) != -1) {writer.write(buffer, 0, length);}} catch (IOException e) {e.printStackTrace();}}
}

以上代码实现了从input.txt文件读取数据并写入到output.txt文件中。

2.2 BufferedReader和BufferedWriter

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;public class BufferCharStreamExample {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();}} catch (IOException e) {e.printStackTrace();}}
}

以上代码实现了从input.txt文件读取数据并写入到output.txt文件中,同时以行的形式进行读写。

3. 随机读写文件操作

3.1 RandomAccessFile

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;public class RandomAccessFileExample {public static void main(String[] args) {File file = new File("file.txt");try (RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw")) {randomAccessFile.writeBytes("Hello World!");randomAccessFile.seek(6);randomAccessFile.writeBytes("Java");} catch (IOException e) {e.printStackTrace();}}
}

以上代码实现了向file.txt文件中写入"Hello World!",然后从第6个字节开始替换为"Java"。

4. 大文件读写操作

4.1 使用MappedByteBuffer

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;public class LargeFileExample {public static void main(String[] args) {File inputFile = new File("input.txt");File outputFile = new File("output.txt");try (FileInputStream inputStream = new FileInputStream(inputFile);FileOutputStream outputStream = new FileOutputStream(outputFile)) {FileChannel inputChannel = inputStream.getChannel();FileChannel outputChannel = outputStream.getChannel();MappedByteBuffer buffer = inputChannel.map(FileChannel.MapMode.READ_ONLY, 0, inputChannel.size());outputChannel.write(buffer);} catch (IOException e) {e.printStackTrace();}}
}

以上代码实现了将input.txt文件中的数据复制到output.txt文件中,如果读取的文件太大需要使用MappedByteBuffer来减少内存开销。

五、Java NIO模块

1. NIO概述

Java NIO(New IO)是JDK1.4引入的新的IO API,能够以更高效的方式进行文件、网络读写等各种I/O操作。

2. NIO与IO的对比

IONIO
面向流面向缓冲(Buffer)
阻塞IO非阻塞IO
选择器(Selector)

3. NIO模块的核心组件

3.1 Buffer

Buffer是一个对象可以容纳一定数量的数据,并提供了一组方法用于访问这些数据。

3.2 Channel

Channel是用于进行数据读写的对象,它类似于IO流中的“管道”。

3.3 Selector

Selector用于监听多个Channel上的事件(如读、写等),并通过一个线程实现多路复用。

4. NIO模块的使用方式

4.1 读取文件数据

import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.EnumSet;public class NioExample {public static void main(String[] args) {Path path = Paths.get("file.txt");try (FileChannel channel = (FileChannel) Files.newByteChannel(path, EnumSet.of(StandardOpenOption.READ))) {ByteBuffer buffer = ByteBuffer.allocate(1024);while (channel.read(buffer) != -1) {buffer.flip();while (buffer.hasRemaining()) {System.out.print((char) buffer.get());}buffer.clear();}} catch (IOException e) {e.printStackTrace();}}
}

以上代码实现了从file.txt文件中读取数据并输出到控制台。其中FileChannel的read()方法用于读取文件数据,ByteBuffer的flip()方法将缓冲区从写入状态切换到读取状态,clear()方法则用于清空缓冲区。

4.2 写入文件数据

import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.EnumSet;public class NioExample {public static void main(String[] args) {Path path = Paths.get("file.txt");try (FileChannel channel = (FileChannel) Files.newByteChannel(path, EnumSet.of(StandardOpenOption.WRITE))) {ByteBuffer buffer = ByteBuffer.wrap("Hello World!".getBytes());channel.write(buffer);} catch (IOException e) {e.printStackTrace();}}
}

以上代码实现了向file.txt文件中写入数据“Hello World!”。其中FileChannel的write()方法用于写入文件数据,ByteBuffer的wrap()方法用于把字节数组包装成缓冲区。

相关文章:

Java IO 流操作详解

Java IO 流操作详解 一、简介1. 什么是IO流2. IO流的分类3. IO流的作用 二、Java IO流的输入操作1. 文件输入流2. 字节输入流3. 缓冲输入流4. 对象输入流 三、Java IO流的输出操作1. 文件输出流2. 字节输出流3. 缓冲输出流4. 对象输出流 四、Java IO流的常用方法解析1. 字节读写…...

Halcon 形状匹配参数详解

find_shape_model(Image : : ModelID, AngleStart, AngleExtent, MinScore, NumMatches, MaxOverlap, SubPixel, NumLevels, Greediness : Row, Column, Angle, Score) find_shape_model(Image : : //搜索图像 ModelID, //模板句柄 AngleStart, // 搜索时的起始角度 AngleExte…...

C++11强类型枚举

C11引入了强类型枚举(enum class),也称为枚举类。 强类型枚举是一种更加类型安全的枚举类型,相对于传统的枚举类型,强类型枚举可以提供更好的安全性和可读性。 强类型枚举的格式如下: enum class 枚举名 …...

pytorch讲解(部分)

友爱的目录 自动求导机制从后向中排除子图自动求导如何编码历史信息Variable上的In-place操作In-place正确性检查 CUDA语义最佳实践使用固定的内存缓冲区使用 nn.DataParallel 替代 multiprocessing 扩展PyTorch扩展 torch.autograd扩展 torch.nn 多进程最佳实践共享CUDA张量最…...

C++ 基本的7种数据类型和4种类型转换(C++复习向p3)

文章目录 基本内置类型存储范围typedef 声明新名字enum 枚举类型类型转换 基本内置类型 boolcharintfloatdoublevoidwchar_t ⇒ short int 存储范围 可以这样 sizeof(int) 来确认 int 占用字节数 char,1字节,-128~127 或 0~255 wchar_t,2…...

Scrum敏捷迭代规划和执行

Sprint Backlog看板 迭代工作的开展是围绕Sprint Backlog展开的,在Leangoo中,我们需要为每个迭代创建一个Sprint Backlog看板。Sprint Backlog(迭代)看板,用于管理当前Sprint的需求和开发任务,可视化展示每…...

智警杯赛前学习1.1---excel基本操作

修改默认设置 步骤一:打开“Excel选项”窗口,打开“文件”菜单,选择“选项”标签 步骤二:在“Excel选项”窗口中,选择“常规与保存”标签,在“常规与保存”标签中,可以修改录入数据时的默认字体…...

【Android】Handle(一) 主要特点和用途

在Android中,Handler是一种消息处理机制,它允许我们在不同线程之间交换信息并更新UI。具体来说,Handler可以将一个Runnable或Message对象加入到消息队列中,并在合适的时间去执行它们。 以下是Handler的主要特点和用途&#xff1a…...

40亿个QQ号,限制1G内存,如何去重?【已通过代码实现】

前几天发现一个有趣的文章 “40亿个QQ号,限制1G内存,如何去重?”,发现很有意思,就想着用代码实现一下,下面是分析和实现过程 一、审题分析 一个 QQ 号现在最长有 11 位,因为 int 是四字节,数值范围是2的31次方,因此得使用 long 存储,但考虑到实现,使用 int 存储(1…...

Talk预告 | 新加坡国立大学张傲:10%成本定制类 GPT-4 多模态大模型

本期为TechBeat人工智能社区第502期线上Talk! 北京时间06月01日(周四)20:00,新加坡国立大学在读博士生 — 张傲的Talk将准时在TechBeat人工智能社区开播! 他与大家分享的主题是: “10%成本定制类 GPT-4 多模态大模型 ”,届时将介…...

从C语言到C++_13(string的模拟实现)深浅拷贝+传统/现代写法

前面已经对 string 类进行了简单的介绍和应用,大家只要能够正常使用即可。 在面试中,面试官总喜欢让学生自己 来模拟实现string类, 最主要是实现string类的构造、拷贝构造、赋值运算符重载以及析构函数。 为了更深入学习STL,下面我…...

reduce()方法详解

一、 定义和用法 reduce() 方法将数组缩减为单个值。 reduce() 方法为数组的每个值(从左到右)执行提供的函数。 函数的返回值存储在累加器中(结果/总计)。 注释:对没有值的数组元素,不执行 reduce() 方法。…...

C++虚假唤醒

概念: 虚假唤醒是指在使用条件变量时,线程被唤醒但条件并没有满足,导致线程执行错误的情况,这个过程就是虚假唤醒。 虚假唤醒弊端: 虚假唤醒会导致程序的正确性受到影响,因为唤醒的线程并没有满足条件&…...

【AI】dragonGPT - 单机部署、极速便捷

dragonGPT 从数据私有化,到prompt向量库匹配,再到查询,一条龙服务,单机部署,极简操作 pre a.需要下载gpt4all model到本地. ggml Model Download Link 然后将存放model的地址写入.env MODEL_PATH your pathb.…...

Uuiapp使用生命周期,路由跳转传参

Uniapp生命周期: 1. beforeCreate:在实例初始化之后,数据观测和事件配置之前被调用。 2. created:在实例创建完成后被立即调用。 3. beforeMount:在挂载开始之前被调用:相关的 render 函数首次被调用。 …...

定积分的计算(牛顿-莱布尼茨公式)习题

前置知识:定积分的计算(牛顿-莱布尼茨公式) 习题1 计算 ∫ 0 2 ( x 2 − 2 x 3 ) d x \int_0^2(x^2-2x3)dx ∫02​(x2−2x3)dx 解: \qquad 原式 ( 1 3 x 3 − x 2 3 x ) ∣ 0 2 ( 8 3 − 4 6 ) − 0 14 3 (\dfrac 13x^3-…...

leak 记录今天的一个小题

先看题, add没有大小限制,这里edit可以溢出8字节,也就是可以改后边的size,可以调用4次free没有调用函数只是把指针置0,show可以用一次. void __fastcall __noreturn main(__int64 a1, char **a2, char **a3) {init_0(a1, a2, a3);while ( 1 ){menu();switch ( read_n() ){cas…...

软考A计划-试题模拟含答案解析-卷二

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&am…...

【C++】pthread

一、pthread简介 pthread是C98接口且只支持Linux&#xff0c;使用时需要包含头文件#include <pthread.h>&#xff0c;编译时需要链接pthread库&#xff0c;其中p是POSIX的缩写&#xff0c;而POSIX是Portable Operating System Interface的缩写&#xff0c;是IEEE为要在各…...

2023年前端面试题汇总-浏览器原理

1. 浏览器安全 1.1. 什么是 XSS 攻击&#xff1f; 1.1. 1. 概念 XSS 攻击指的是跨站脚本攻击&#xff0c;是一种代码注入攻击。攻击者通过在网站注入恶意脚本&#xff0c;使之在用户的浏览器上运行&#xff0c;从而盗取用户的信息如 cookie 等。 XSS 的本质是因为网站没有对…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态&#xff08;编译时多态&#xff09; 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1&#xff09;.协变 2&#xff09;.析构函数的重写 5.override 和 final关键字 1&#…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...

游戏开发中常见的战斗数值英文缩写对照表

游戏开发中常见的战斗数值英文缩写对照表 基础属性&#xff08;Basic Attributes&#xff09; 缩写英文全称中文释义常见使用场景HPHit Points / Health Points生命值角色生存状态MPMana Points / Magic Points魔法值技能释放资源SPStamina Points体力值动作消耗资源APAction…...

npm安装electron下载太慢,导致报错

npm安装electron下载太慢&#xff0c;导致报错 背景 想学习electron框架做个桌面应用&#xff0c;卡在了安装依赖&#xff08;无语了&#xff09;。。。一开始以为node版本或者npm版本太低问题&#xff0c;调整版本后还是报错。偶尔执行install命令后&#xff0c;可以开始下载…...