【Java】I/O 流篇 —— 打印流与压缩流
目录
- 打印流
- 概述
- 字节打印流
- 构造方法
- 成员方法
- 代码示例
- 字符打印流
- 构造方法
- 成员方法
- 代码示例
- 打印流的应用场景
- 解压缩/压缩流
- 解压缩流
- 压缩流
- Commons-io 工具包
- 概述
- Commons-io 使用步骤
- Commons-io 常见方法
- 代码示例
- Hutool 工具包
打印流
概述
分类:打印流一般是指字节打印流 PrintStream、字符打印流 PrintWriter 两个类,打印流只有输出流没有输入流
特点:
- 打印流只操作文件的目的地,不操作数据源
- 特有的写出方法可以实现数据原样写出
- 文件中是 97,打印 97
- 文件中是 true,打印 true
- 特有的写出方法,可以实现自动刷新,自动换行
- 打印一次数据 = 写出 + 换行 + 刷新
字节打印流
构造方法
public PrintStream(OutputStream/File/String)关联字节输出流/文件/文件路径public PrintStream(String fileName,Charset charset)指定字符集public PrintStream(OutputStream out,boolean autoFlush)可设置是否自动刷新public PrintStream(OutputStream out,boolean autoFlush,String encoding)指定字符集且可设置是否自动刷新
注意事项:字节流底层没有缓冲区,开不开自动刷新都一样
成员方法
public void write(int b)常规方法,跟之前一样,将指定的字节写出public void println(Xxx xx)特有方法,打印任意数据,自动刷新,自动换行public void print(Xxx xx)特有方法,打印任意数据,不换行public void printf(String format,Object...args)特有方法,带有占位符的打印语句,不换行
代码示例
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;public class printStream {public static void main(String[] args) throws IOException, FileNotFoundException {// 创建对象PrintStream ps = new PrintStream(new FileOutputStream("bbb.txt"),true,"UTF-8");// 写出数据ps.println(97);ps.print(true);ps.println();ps.printf("%s爱上了%s", "阿珍", "阿强");// 释放资源ps.close();}
}
字符打印流
构造方法
public PrintWriter(Write/File/String)关联字节输出流、文件或文件路径public PrintWriter(String fileName, Charset charset)指定字符集public PrintWriter(Write w, boolean autoflush)可设置是否自动刷新public PrintWriter(OutputStream out, boolean autoFlush, Charset charset)指定字符集且可设置是否自动刷新
注意事项:字符流底层有缓冲区,想要自动刷新需要开启
成员方法
public void write(...):常规方法,用于写出字节或字符串。public void println(Xxx xx):特有方法,可打印任意类型数据并换行。public void print(Xxx xx):特有方法,能打印任意类型数据,不换行。public void printf(String format, Object... args):特有方法,是带有占位符的打印语句 。
代码示例
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;public class printStream {public static void main(String[] args) throws IOException {// 创建对象PrintWriter pw = new PrintWriter(new FileWriter("bbb.txt"),true);// 写出数据pw.println("阿珍爱上了阿强!");pw.print("阿强爱上了阿珍");pw.printf("%s爱上了%s", "阿珍", "阿强");// 释放资源pw.close();}
}
打印流的应用场景
System.out.println("123");
平时用的这个输出语句的完整形式其实是以下样子:
PrintStream ps = System.out;
ps.println("123");
获取打印流的对象,此打印流在虚拟机启动的时候,由虚拟机创建,默认指向控制台
这是特殊的打印流,也叫系统中的标准输出流,是不能关闭的,因为在系统中是唯一的
解压缩/压缩流
解压缩流
ZipInputStream 是 Java 中用于读取 ZIP 文件的输入流,它继承自 InflaterInputStream。
解压本质:把压缩包里面的每一个文件或者文件夹读取出来,按照层级拷贝到目的地当中,压缩包里面的每一个文件是一个 ZipEntry 对象,所以也可以说是把每一个 ZipEntry 对象按照层级拷贝到本地另一个文件夹中
构造方法:ZipInputStream(InputStream in):创建一个新的 ZipInputStream,用于从指定的输入流中读取数据。
代码示例:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;public class ZipStreamDemo {public static void main(String[] args) throws IOException {// 创建一个 File 表示要解压的压缩包File src = new File("C:\\aaa.zip");// 创建一个 File 表示解压的目的地File dest = new File("C:\\");unzip(src,dest);}//定义一个方法来解压文件public static void unzip(File src,File dest) throws IOException {// 解压本质:把压缩包里面的每一个文件或者文件夹读取出来,按照层级拷贝到目的地当中// 创建一个解压缩流用来读取压缩包中的数据ZipInputStream zip = new ZipInputStream(new FileInputStream(src));// 先获取到压缩包里面的每一个 zipentry 对象ZipEntry entry;while((entry = zip.getNextEntry()) != null) {System.out.println(entry);if(entry.isDirectory()) {// 文件夹:需要在目的地 dest 处创建一个同样的文件夹File file = new File(dest,entry.toString());file.mkdirs();}else {// 文件:需要读取到压缩包中的文件,并把它存放到目的地 dest 文件夹中(按照层级目录进行存放)FileOutputStream fos = new FileOutputStream(new File(dest,entry.toString()));int b;while((b = zip.read()) != -1) {fos.write(b);}fos.close();// 表示在压缩包中的一个文件处理完毕zip.closeEntry();}}zip.close();}
}
压缩流
ZipOutputStream 用于将数据压缩成 ZIP 格式,它继承自 DeflaterOutputStream。
压缩本质:把每一个文件或者文件夹看成一个 ZipEntry 对象放到压缩包中
构造方法:ZipOutputStream(OutputStream out):创建一个新的 ZipOutputStream,将压缩数据写入指定的输出流。
代码示例:
- 压缩一个文件
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;public class ZipStreamDemo {public static void main(String[] args) throws IOException {// 创建 File 对象表示要压缩的文件File src = new File("C:\\aaa.txt");// 创建 File 对象表示压缩包的位置File dest = new File("C:\\");toZip(src,dest);}/** 作用:压缩 * 参数一:表示要压缩的文件* 参数二:表示压缩包的位置* */public static void toZip(File src,File dest) throws IOException {// 创建压缩流关联压缩包ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(new File(dest,"aaa.zip")));// 创建 ZipEntry 对象,表示压缩包里的每一个文件和文件夹ZipEntry entry = new ZipEntry("aaa.txt");//把 ZipEntry 对象放到压缩包里zos.putNextEntry(entry);// 把 src 中的数据写到压缩包中FileInputStream fis = new FileInputStream(src);int b;while((b = fis.read()) != -1) {zos.write(b);}zos.closeEntry();zos.close();}
}
- 压缩一个文件夹
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;public class ZipStreamDemo {public static void main(String[] args) throws IOException {// 创建 File 对象表示要压缩的文件File src = new File("C:\\aaa");// 创建 File 对象表示压缩包放在哪里(压缩包的父路径)File destParent = src.getParentFile();// 创建 File 对象表示压缩包的位置File dest = new File(destParent,src.getName() + ".zip");// 创建压缩流关联压缩包ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(dest));toZip(src,zos,src.getName());zos.close();}/** 作用:获取 src 里面的每一个文件,变成 ZipEntry 对象,放入压缩包中* 参数一:数据源* 参数二:压缩流* 参数三:压缩包内部的路径* */public static void toZip(File src,ZipOutputStream zos,String name) throws IOException {//1.进入src文件夹File[] files = src.listFiles();//2.遍历数组for (File file : files) {if(file.isFile()){//3.判断-文件,变成ZipEntry对象,放入到压缩包当中ZipEntry entry = new ZipEntry(name + "\\" + file.getName());zos.putNextEntry(entry);//读取文件中的数据,写到压缩包FileInputStream fis = new FileInputStream(file);int b;while((b = fis.read()) != -1){zos.write(b);}fis.close();zos.closeEntry();}else{//4.判断-文件夹,递归toZip(file,zos, name + "\\" + file.getName());}}}
}
Commons-io 工具包
概述
Commons-io 是 apache 开源基金组织提供的一组有关 IO 操作的开源工具包
作用:提高 IO 流的开发效率
Commons-io 的工具包是以 “.jar” 为后缀,所以也叫 jar 包
Commons-io 使用步骤
- 在项目中创建名为 “lib” 的文件夹。
- 把 jar 包复制粘贴到 “lib” 文件夹。
- 右键点击 jar 包,选择 “Add as Library”,然后点击 “OK” 。
- 在类中导包使用。
Commons-io 常见方法
| FileUtils 类 (文件/文件夹相关) | 说明 |
|---|---|
static void copyFile(File srcFile, File destFile) | 复制文件 |
static void copyDirectory(File srcDir, File destDir) | 复制文件夹 |
static void copyDirectoryToDirectory(File srcDir, File destDir) | 复制文件夹 |
static void deleteDirectory(File directory) | 删除文件夹 |
static void cleanDirectory(File directory) | 清空文件夹 |
static String readFileToString(File file, Charset encoding) | 读取文件中的数据变成字符串 |
static void write(File file, CharSequence data, String encoding) | 写出数据 |
| IOUtils 类(流相关) | 说明 |
|---|---|
public static int copy(InputStream input, OutputStream output) | 复制文件 |
public static int copyLarge(Reader input, Writer output) | 复制大文件 |
public static String readLines(Reader input) | 读取数据 |
public static void write(String data, OutputStream output) | 写出数据 |
代码示例
import java.io.File;
import java.io.IOException;import org.apache.commons.io.FileUtils;public class commonsio {public static void main(String[] args) throws IOException {File src = new File("C:\\aaa.txt");File dest = new File("C:\\copy.txt");FileUtils.copyFile(src, dest);// 将原文件夹内的内容全部复制到新文件夹内File src = new File("C:\\aaa"); File dest = new File("C:\\bbb");FileUtils.copyDirectory(src, dest);// 将原文件夹直接复制到新文件夹内File src = new File("C:\\aaa"); File dest = new File("C:\\bbb");FileUtils.copyDirectoryToDirectory(src, dest);}
}
关于 Commons-io 工具包的更多使用方法,可以前往 【Apache Commons IO 工具包常用方法】
Hutool 工具包
Hutool 是一个开源的全能型 Java 工具类库,旨在简化 Java 开发中的常见操作,被称为 Java 开发的 “瑞士军刀”。以下是关于它的详细介绍:
- 特点:
- 模块化设计:被拆分成多个模块(如 core、crypto、http 等),开发者可按需引入,避免项目依赖臃肿。
- 简单易用:相比于 Java 原生工具类,其 API 更加简洁,能大幅减少开发者编写的代码量,降低开发成本。
- 功能全面:涵盖字符串、日期、文件操作、加密、HTTP 请求等开发中几乎所有常见的工具类操作,减少开发者重复造轮子。
- 常见工具类及功能:
- 文件操作:FileUtil 类可简化文件的读写、压缩解压、目录管理等操作,如一行代码读取文件内容或递归遍历目录。
- 日期处理:DateUtil 模块提供丰富的日期工具方法,可进行日期格式化、时间差计算、获取当前时间等操作 。
- 字符串处理:StrUtil 类让字符串判断、拼接、分割、过滤等操作变得简洁高效。
- 网络请求:HttpUtil 类支持快速发起 HTTP 请求,支持 GET、POST 等常见操作。
- 加密解密:SecureUtil 模块提供常见的加密解密算法(如 MD5、AES、RSA 等),满足处理用户密码或敏感数据时的安全需求。
- 应用场景:适用于企业级项目、微服务开发、第三方接口调用等多种场景,无论是数据处理、文件管理还是网络交互等方面都能发挥作用。
- 与其他工具库对比:和主要竞争对手 Apache Commons、Guava 相比,Hutool 功能覆盖范围最广;API 设计简洁,使用体验佳;社区较为活跃,更新频繁。不过,Apache Commons 模块化明确,Guava 在集合处理和函数式编程上表现出色,且这两者更新速度虽慢但稳定性更好。
- 使用注意事项:使用时需按需引入模块;由于版本更新较快,升级时要注意 API 的兼容性;部分复杂操作可能会带来一定性能开销,要根据实际场景权衡;在关键逻辑中,建议掌握 Java 原生工具类,避免过度依赖。
关于 Hutool 工具包的更多使用方法,可以前往 Hutool 官方 进行学习。
相关文章:
【Java】I/O 流篇 —— 打印流与压缩流
目录 打印流概述字节打印流构造方法成员方法代码示例 字符打印流构造方法成员方法代码示例 打印流的应用场景 解压缩/压缩流解压缩流压缩流 Commons-io 工具包概述Commons-io 使用步骤Commons-io 常见方法代码示例 Hutool 工具包 打印流 概述 分类:打印流一般是指…...
更换k8s容器运行时环境为docker
更换k8s容器运行时环境为docker k8s-V1.24之后容器运行时默认是containerd,若想改为熟悉的docker作为运行时,需要做以下操作 在每个节点安装containerd、docker; 每个节点安装cri-docker; 调整kubelet配置并重启验证。 1.安装docker、con…...
【数字信号处理:从原理到应用的深度剖析】
一、数字信号处理的原理 数字信号处理(DSP)是一种通过数学算法对信号进行分析、处理和转换的技术。其核心在于对离散时间信号的操作,目的是提取有用信息或将信号转换为更易于解释的形式。 (一)信号的数字化过程 1. …...
Pytest之fixture的常见用法
文章目录 1.前言2.使用fixture执行前置操作3.使用conftest共享fixture4.使用yield执行后置操作 1.前言 在pytest中,fixture是一个非常强大和灵活的功能,用于为测试函数提供固定的测试数据、测试环境或执行一些前置和后置操作等, 与setup和te…...
FFmpeg入门:最简单的视频播放器
FFmpeg入门:最简单的视频播放器 FFmpeg入门第一篇,制作一个简单的MP4视频播放器。 整体流程 话不多说,直接上流程图 视频播放速率控制 这里可以直接看图中的帧率同步模块,可以分为如下几步 获取到当前帧的预期播放时间&…...
GitHub 语析 - 基于大模型的知识库与知识图谱问答平台
语析 - 基于大模型的知识库与知识图谱问答平台 GitHub 地址:https://github.com/xerrors/Yuxi-Know 📝 项目概述 语析是一个强大的问答平台,结合了大模型 RAG 知识库与知识图谱技术,基于 Llamaindex VueJS FastAPI Neo4j 构…...
Linux《基础开发工具(上)》
在之前的篇章当中我们已经了解了Linux当中基本的指令以及相关的知识,那么接下来在本篇当中就开始学基本的开发工具,在此我们一共要了解6大开发工具,在此将这些工具的学习分为上中下篇,在本篇当中我们首先要来学习的是yun以及vim,一…...
【考试大纲】初级信息系统运行管理员考试大纲
目录 引言一、考试要求1、 考试说明2、 考试要求3、 本考试设置的科目包括:二、考试范围考试科目1:信息系统基础知识(初级)考试科目2:信息系统运行管理(应用技术)引言 最新的信息系统运行管理员考试大纲出版于 2018 年 9 月,本考试大纲基于此版本整理。 一、考试要求…...
《每天搞懂一道Hard》之数独终结者(LeetCode 37)
📌《每天搞懂一道Hard》之数独终结者(LeetCode 37) 🔗原题链接:https://leetcode.com/problems/sudoku-solver/ 今天我们来解剖一个经典回溯算法问题——数独求解器!这道题在算法面试中出现频率高达35%&a…...
LangChain原理解析及开发实战指南(2025年最新版)
一、LangChain核心架构解析 1.1 框架设计理念 LangChain是基于提示工程(Prompt Engineering)构建的LLM应用开发框架,其核心思想是通过模块化组件实现大语言模型与业务系统的无缝对接。该框架采用分层设计: 接口层:统一对接OpenAI、DeepSee…...
YoloV8改进策略:Block改进|CBlock,Transformer式的卷积结构|即插即用
摘要 论文标题: SparseViT: Nonsemantics-Centered, Parameter-Efficient Image Manipulation Localization through Spare-Coding Transformer 论文链接: https://arxiv.org/pdf/2412.14598 官方GitHub: https://github.com/scu-zjz/SparseViT 这段代码出自SparseViT ,代码如…...
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_open_file
ngx_open_file 定义在src/os/unix/ngx_files.h #define ngx_open_file(name, mode, create, access) \open((const char *) name, mode|create, access)#define NGX_FILE_RDONLY O_RDONLY #define NGX_FILE_WRONLY O_WRONLY #de…...
测试金蝶云的OpenAPI
如何使用Postman测试K3Cloud的OpenAPI 1. 引言 在本篇博客中,我将带你逐步了解如何使用Postman测试和使用K3Cloud的OpenAPI。内容包括下载所需的SDK文件、配置文件、API调用及测试等步骤。让我们开始吧! 2. 下载所需的SDK文件 2.1 获取SDK 首先&…...
C语言408考研先行课第一课:数据类型
由于408要考数据结构……会有算法题…… 所以,需要C语言来进行一个预备…… 因为大一贪玩,C语言根本没学进去……谁能想到考研还用得到呢?【手动doge(bushi) 软件用的是Clion,可以自行搜索教程下载使用。…...
11天 -- Redis 中跳表的实现原理是什么?Redis 的 hash 是什么?Redis Zset 的实现原理是什么?
Redis 中跳表的实现原理是什么? Redis 中的跳表(Skip List)是一种基于有序链表的高效数据结构,通过在链表上增加多级索引来提高数据的查找效率。以下是 Redis 中跳表的实现原理: 1. 基本概念 节点结构:跳…...
单细胞分析(19)—— 单细胞转录组基因集评分方法
下面是每种基因集评分方法的原理介绍代码示例,适用于R语言和Python两种主流生信分析环境。可以直接应用于单细胞转录组(scRNA-seq)数据分析中。 🔬 单细胞转录组基因集评分方法(附代码示例) 在单细胞RNA测…...
010 rocketmq批量消息
文章目录 批量消息BatchProducer.javaBatchConsumer.java 批量消息 批量发送可以提⾼发送性能,但有⼀定的限制: topic 相同 waitStoreMsgOK 相同 (⾸先我们建设消息的iswaitstoremsgoktrue(默认为true), 如果没有异常,我们将始终收到"O…...
JavaWeb后端基础(3)
原打算把Mysql操作数据库的一些知识写进去,但是感觉没必要,要是现在会的都是简单的增删改查,所以,这一篇,我直接从java操作数据库开始写,所以这一篇大致就是记一下JDBC、MyBatis、以及SpringBoot的配置文件…...
Oracle数据库基础入门(三): DQL 深入解析与实践
在 Oracle 数据库的知识体系中,数据查询语言(DQL)无疑是最为常用且关键的部分之一。对于 Java 全栈开发者而言,熟练掌握 DQL 不仅能高效地从数据库中获取所需数据,更是构建强大后端应用的基石。通过 DQL,我…...
P9231 [蓝桥杯 2023 省 A] 平方差
P9231 [蓝桥杯 2023 省 A] 平方差 - 洛谷 题目描述 给定 L,R,问 L≤x≤R 中有多少个数 x 满足存在整数 y,z 使得 xy2−z2。 输入格式 输入一行包含两个整数 L,R,用一个空格分隔。 输出格式 输出一行包含一个整数满足题目给定条件的 x 的数量。 输…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...
在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例
目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码:冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...
