Java 中的 IO 和 NIO
Java 中的 IO 和 NIO
- Java IO 介绍
- Java NIO(New IO)介绍
- windows 安装 ffmpeg
- 完整示例
- 参考文献
Java IO 介绍
Java IO(Input/Output)流是用于处理输入和输出数据的机制。它提供了一种标准化的方式来读取和写入数据,可以与文件、网络、标准输入输出等进行交互。
Java IO流主要分为两个流模型:字节流(Byte Stream)和字符流(Character Stream)。
字节流(Byte Stream)
- InputStream:字节输入流的抽象基类,用于从源中读取字节数据。
- OutputStream:字节输出流的抽象基类,用于向目标中写入字节数据。
常见的字节流实现类包括:
- FileInputStream:从文件中读取字节数据。
- FileOutputStream:将字节数据写入文件。
- BufferedInputStream/BufferedOutputStream:带有缓冲区的字节流,提高读写效率。
字符流(Character Stream)
- Reader:字符输入流的抽象基类,用于从源中读取字符数据。
- Writer:字符输出流的抽象基类,用于向目标中写入字符数据。
常见的字符流实现类包括:
- FileReader:从文件中读取字符数据。
- FileWriter:向文件中写入字符数据。
- BufferedReader/BufferedWriter:带有缓冲区的字符流,提高读写效率。
使用Java IO流的一般步骤如下:
- 打开流:通过实例化相应的流对象,与输入或输出源建立连接。
- 读取或写入数据:通过流对象提供的方法进行数据的读取或写入操作。
- 关闭流:使用完流后,需要显式地关闭流,释放资源。
示例
// 需要注意的是,在使用流操作完成后,我们应该及时关闭流以释放资源,以上述代码为例,使用了try-with-resources语句来实现自动关闭流。
try (FileInputStream fis = new FileInputStream("input.txt");BufferedInputStream bis = new BufferedInputStream(fis);FileOutputStream fos = new FileOutputStream("output.txt");BufferedOutputStream bos = new BufferedOutputStream(fos)) {byte[] buffer = new byte[1024];int bytesRead;while ((bytesRead = bis.read(buffer)) != -1) {bos.write(buffer, 0, bytesRead);}
} catch (IOException e) {e.printStackTrace();
}
Java NIO(New IO)介绍
Java NIO(New IO)是Java 1.4版本引入的一套新的IO API,提供了更高效、更灵活的IO操作方式。
相比于传统的Java IO(InputStream/OutputStream),Java NIO主要有以下几个特点:
- 通道(Channel)和缓冲区(Buffer):Java NIO使用通道来进行数据的读写,而不再依赖于流。通道可以双向传输数据,并且与底层操作系统交互的能力更强。数据通过缓冲区进行传输,可以提高IO操作的效率。
- 非阻塞IO:Java NIO支持非阻塞IO操作,可以实现一个线程处理多个连接(例如网络连接),提高系统的并发性能。
- 选择器(Selector):选择器是Java NIO提供的一种多路复用机制,可以用于监控多个通道的事件(如连接建立、数据到达等),从而实现高效的事件驱动编程模型。
- 字符集编解码器:Java NIO提供了字符集编解码器,可以方便地进行字符集转换,支持Unicode、UTF-8等多种字符集。
使用Java NIO进行IO操作的一般步骤如下:
- 打开通道(Channel):通过调用特定的通道类的open()方法打开一个通道。
- 创建缓冲区(Buffer):创建适当大小的缓冲区,用于在通道和应用程序之间传输数据。
- 读写数据:通过通道和缓冲区进行数据的读取和写入操作。
- 关闭通道:使用完通道后,需要显式关闭通道以释放资源。
示例
try (RandomAccessFile file = new RandomAccessFile("file.txt", "rw");FileChannel channel = file.getChannel()) {ByteBuffer buffer = ByteBuffer.allocate(1024);int bytesRead = channel.read(buffer);while (bytesRead != -1) {buffer.flip();while (buffer.hasRemaining()) {System.out.print((char) buffer.get());}buffer.clear();bytesRead = channel.read(buffer);}
} catch (IOException e) {e.printStackTrace();
}
Java NIO提供了更高效、更灵活的IO处理方式,适用于需要处理大量连接或需要高性能和低延迟的场景。相比于传统的Java IO,它可以更好地满足现代应用对IO操作的需求。但需要注意的是,Java NIO的API较为复杂,使用时需要仔细理解和学习。
windows 安装 ffmpeg
choco install ffmpeg
choco install ffmpeg-full
完整示例
package java_io_nio;import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class FileUtils {/*** 拷贝文件 FileInputStream、FileOutputStream、BufferedInputStream、BufferedOutputStream 应用* @param intputFilePath 输入文件* @param outputFilePath 输出文件*/public static void copyFileByPath(String intputFilePath, String outputFilePath){try(FileInputStream fis = new FileInputStream(intputFilePath);BufferedInputStream bis = new BufferedInputStream(fis);FileOutputStream fos = new FileOutputStream(outputFilePath, false);BufferedOutputStream bos = new BufferedOutputStream(fos)){byte[] buffer = new byte[1024];int bytesRead;while ((bytesRead = bis.read(buffer)) != -1){bos.write(buffer, 0, bytesRead);}}catch (IOException e) {e.printStackTrace();}}/*** 读取文件内容 BufferedReader 应用* @param filePath 文件路径* @return*/public static String readFromFile(String filePath){StringBuffer result = new StringBuffer();try (FileInputStream fr = new FileInputStream(filePath);InputStreamReader isr = new InputStreamReader(fr, StandardCharsets.UTF_8);BufferedReader br = new BufferedReader(isr)) {String line;while((line = br.readLine()) != null){result.append(line);}} catch (IOException e) {e.printStackTrace();}return result.toString();}/*** 写入文件 BufferedWriter 应用* @param filePath 文件路径* @param content 文件内容*/public static void writeToFile(String filePath, String content){try (FileOutputStream fos = new FileOutputStream(filePath);OutputStreamWriter osw = new OutputStreamWriter(fos, StandardCharsets.UTF_8);BufferedWriter bw = new BufferedWriter(osw)) {bw.write(content);bw.newLine();} catch (IOException e) {e.printStackTrace();}}/*** 文件拷贝 NIO 应用* @param sourcePath 源文件* @param targetPath 目标文件*/public static void transferFile(String sourcePath, String targetPath){Path sPath = Paths.get(sourcePath);Path tPath = Paths.get(targetPath);try {Files.copy(sPath, tPath, StandardCopyOption.REPLACE_EXISTING);} catch (Exception e) {e.printStackTrace();}}/*** 视频格式转换 NIO 应用* @param inputPath 源格式* @param outputPath 目标格式*/public static void videoFormatConversion(String inputPath, String outputPath){try {// 输入视频文件路径Path iPath = Paths.get(inputPath);// 输出转换后的视频文件路径Path oPath = Paths.get(outputPath);// 构建 FFmpeg 命令String ffmpegCommand = "ffmpeg -i " + iPath.toString() + " -c:v copy -c:a copy " + oPath.toString();// 执行 FFmpeg 命令Process process = Runtime.getRuntime().exec(ffmpegCommand);process.waitFor();// 检查转换后的文件是否存在if (Files.exists(oPath)) {System.out.println("视频格式转换成功!");} else {System.out.println("视频格式转换失败!");}} catch (InterruptedException e) {e.printStackTrace();} catch (IOException e){e.printStackTrace();}}/*** 读取数据 NIO 应用* @param socketChannel*/private static void handleClientRequest(SocketChannel socketChannel) {try {ByteBuffer buffer = ByteBuffer.allocate(1024);int bytesRead = socketChannel.read(buffer);while (bytesRead != -1) {buffer.flip();while (buffer.hasRemaining()) {System.out.print((char) buffer.get());}buffer.clear();bytesRead = socketChannel.read(buffer);}socketChannel.close();} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) {copyFileByPath("D:\\project\\uploadPath\\file_0.png", "D:\\project\\uploadPath\\file_1.png");String fileContent = readFromFile("D:\\project\\uploadPath\\test.txt");System.out.println("文件内容:" + fileContent);writeToFile("D:\\project\\uploadPath\\test.txt", "测试内容");transferFile("D:\\project\\uploadPath\\file_0.png", "D:\\project\\uploadPath\\file_2.png");videoFormatConversion("D:\\project\\uploadPath\\file_0.mp4", "D:\\project\\uploadPath\\file_0.mov");// NIO 网络编程try {// 创建 ServerSocketChannelServerSocketChannel serverSocketChannel = ServerSocketChannel.open();serverSocketChannel.socket().bind(new InetSocketAddress(8080));serverSocketChannel.configureBlocking(false);System.out.println("服务器已启动,监听端口 8080...");// 创建线程池ExecutorService executorService = Executors.newFixedThreadPool(10);while (true) {// 监听客户端连接SocketChannel socketChannel = serverSocketChannel.accept();if (socketChannel != null) {System.out.println("客户端连接成功!");// 处理客户端请求的任务提交给线程池执行executorService.submit(() -> handleClientRequest(socketChannel));}}} catch (IOException e) {e.printStackTrace();}}
}
参考文献
ffmpeg 下载
相关文章:
Java 中的 IO 和 NIO
Java 中的 IO 和 NIO Java IO 介绍Java NIO(New IO)介绍windows 安装 ffmpeg完整示例参考文献 Java IO 介绍 Java IO(Input/Output)流是用于处理输入和输出数据的机制。它提供了一种标准化的方式来读取和写入数据,可以…...

Linux-crontab使用问题解决
添加定时进程 终端输入: crontab -e选择文本编辑方式,写入要运行的脚本,以及时间要求。 注意,如果有多个运行指令分两种情况: 1.多个运行指令之间没有耦合关系,分别独立,则可以直接分为两个…...

【设计模式】
文章目录 设计模式分类UML图类与类之间关系的表示方式 设计原则 设计模式分类 创建型模式 用于描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”。单例、原型、工厂、抽象工厂、建造者等 5 种创建型模式。 结构型模式 用于描述如何将类或对象按某种…...

2023_Spark_实验四:SCALA基础
一、在IDEA中执行以下语句 或者用windows徽标R 输入cmd 进入命令提示符 输入scala直接进入编写界面 1、Scala的常用数据类型 注意:在Scala中,任何数据都是对象。例如: scala> 1 res0: Int 1scala> 1.toString res1: String 1scala…...
【深入解析spring cloud gateway】04 Global Filters
上一节学习了GatewayFilter。 回忆一下一个关键点: GateWayFilterFactory的本质就是:针对配置进行解析,为指定的路由,添加Filter,以便对请求报文进行处理。 一、原理分析 GlobalFilter又是啥?先看一下接口…...
c++搜索基础进阶
搜索算法基础 搜索算法是利用计算机的高性能来有目的的穷举一个问题的部分或所有的可能情况,从而求出问题的解的一种方法。搜索过程实际上是根据初始条件和扩展规则构造一棵解答树并寻找符合目标状态的节点的过程。 所有的搜索算法从其最终的算法实现上来看&#…...

管网水位监测的必要性
城市燃气、桥梁、供水、排水、热力、电力、电梯、通信、轨道交通、综合管廊、输油管线等,担负着城市的信息传递、能源输送、排涝减灾等重要任务,是维系城市正常运行、满足群众生产生活需要的重要基础设施,是城市的生命线。基础设施生命线就像…...

无涯教程-Android - 系统架构
Android操作系统是一堆软件组件,大致分为五个部分和四个主要层,如体系结构图中所示。 Linux内核 底层是Linux-Linux 3.6,带有大约115个补丁,这在设备硬件之间提供了一定程度的抽象,并且包含所有必需的硬件驱动程序&am…...
await接受成功的promise,失败的promise用try catch
在 JavaScript 中,await 关键字用于等待一个 Promise 对象的解决(fulfillment)。下面是一个示例: async function example() {try {const result await doSomethingAsync();console.log(result); // 如果 Promise 成功解决&…...

赞奇科技参与华为云828 B2B企业节,云工作站入选精选产品解决方案
8月27日,由华为云携手上万家伙伴共同发起的第二届 828 B2B 企业节拉开帷幕,围绕五大系列活动,为万千中小企业带来精细化商机对接。 聚焦行业数字化所需最优产品,举办超1000场供需对接会,遍及20多个省100多个城市&…...

Docker私有镜像仓库(Harbor)安装
Docker私有镜像仓库(Harbor)安装 1、什么是Harbor Harbor是类似与DockerHub 一样的镜像仓库。Harbor是由VMware公司开源的企业级的Docker Registry管理项目,它包括权限管理(RBAC)、LDAP、日志审核、管理界面、自我注册、镜像复制和中文支持等功能。Docker容器应用的…...

【深入解析spring cloud gateway】06 gateway源码简要分析
上一节做了一个很简单的示例,微服务通过注册到eureka上,然后网关通过服务发现访问到对应的微服务。本节将简单地对整个gateway请求转发过程做一个简单的分析。 一、核心流程 主要流程: Gateway Client向 Spring Cloud Gateway 发送请求请求…...

2023年行研行业研究报告
第一章 行业概述 1.1 行研行业 行业定义为同一类别的经济活动,这涉及生产相似产品、应用相同生产工艺或提供同类服务的集合,如食品饮料行业、服饰行业、机械制造行业、金融服务行业和移动互联网行业等。 为满足全球金融业的需求,1999年8月…...

linux上vscode中.cpp文件中引入头文件.hpp时报错:找不到头文件(启用错误钵形曲线)
当在.cpp文件中引入系统给定的头文件时:#include < iostream > 或者引入自定义的头文件 :#include <success.hpp> 报错:找不到相应的头文件,即在引入头文件的改行底下标出红波浪线 解决方法为: &#…...
Sphinx Docstring
入门 — Sphinx documentation pip install sphinx pip install sphinx-rtd-themesphinx-quickstartexport PYTHONPATH"-"make html cd build/htmlpython -m http.server 9121nohup python -m http.server 9121 &...

JVM的故事——虚拟机类加载机制
虚拟机类加载机制 文章目录 虚拟机类加载机制一、概述二、类加载的时机三、类加载的过程四、类加载器 一、概述 本章将要讲解class文件如何进入虚拟机以及虚拟机如何处理这些class文件。Java虚拟机把class文件加载到内存,并对数据进行校验、转换解析和初始化&#…...

Sentry 是一个开源的错误监控和日志聚合平台-- 通过docker-compose 安装Sentry
概述 Sentry 是一个开源的错误监控和日志聚合平台,用于帮助开发团队实时监控和调试应用程序中的错误和异常。它可以捕获应用程序中的错误和异常,并提供详细的错误报告,包括错误堆栈跟踪、环境信息、用户信息等。这些报告可以帮助开发团队快速…...

Redis 7 第六讲 主从模式(replica)架构篇
🌹🌹🌹 此篇开始进入架构篇范围(❤艸`❤) 理论 即主从复制,master以写为主,Slave以读为主。当master数据变化的时候,自动将新的数据异步同步到其它slave数据库。 使用场景 读写分离 容灾备份数据备份水平扩容主从架构 演示案例 注:masterauth、replicaof主…...

学习资源记录 =0=
学习路线: 无人机学习路线 无人机学习路线2 自主无人机: 浙大fastlab无人机 机器人理论: 华中科技大学机器人学 C课程 机器人仿真: 2023gazebo仿真开发四足机器人...
Python import包路径管理
import sys sys.path.insert(0, "../")详细链接...

SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...

使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...

数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !
我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...

企业大模型服务合规指南:深度解析备案与登记制度
伴随AI技术的爆炸式发展,尤其是大模型(LLM)在各行各业的深度应用和整合,企业利用AI技术提升效率、创新服务的步伐不断加快。无论是像DeepSeek这样的前沿技术提供者,还是积极拥抱AI转型的传统企业,在面向公众…...