【C到Java的深度跃迁:从指针到对象,从过程到生态】第四模块·Java特性专精 —— 第十七章 IO流:超越FILE*的维度战争
一、从C文件操作到Java流的进化
1.1 C文件操作的原始挑战
C语言通过FILE*
和低级文件描述符进行I/O操作,存在诸多限制:
典型文件复制代码:
#include <stdio.h> int copy_file(const char* src, const char* dst) { FILE* in = fopen(src, "rb"); if (!in) return -1; FILE* out = fopen(dst, "wb"); if (!out) { fclose(in); return -1; } char buffer[4096]; size_t bytes; while ((bytes = fread(buffer, 1, sizeof(buffer), in)) > 0) { if (fwrite(buffer, 1, bytes, out) != bytes) { fclose(in); fclose(out); return -1; } } fclose(in); fclose(out); return 0;
}
C文件操作的五大痛点:
- 手动资源管理(忘记关闭文件导致泄漏)
- 错误处理冗长(逐层检查返回值)
- 缓冲区大小固定(性能与内存的权衡)
- 无异常传播机制
- 跨平台差异处理(如路径分隔符)
1.2 Java流的封装哲学
等效Java实现:
public static void copyFile(String src, String dst) throws IOException { try (InputStream in = new FileInputStream(src); OutputStream out = new FileOutputStream(dst)) { byte[] buffer = new byte[4096]; int bytesRead; while ((bytesRead = in.read(buffer)) != -1) { out.write(buffer, 0, bytesRead); } }
}
Java流式优势:
维度 | C FILE* | Java流 |
---|---|---|
资源管理 | 手动fopen/fclose | try-with-resources自动管理 |
异常处理 | 返回错误码 | 异常传播机制 |
缓冲策略 | 固定大小缓冲区 | 可配置缓冲流(BufferedInputStream) |
扩展性 | 功能固定 | 装饰器模式灵活组合 |
字符编码 | 需手动处理 | Reader/Writer自动转换 |
1.3 流式宇宙的层级结构
Java IO核心体系:
字节流
├── InputStream
│ ├── FileInputStream
│ ├── ByteArrayInputStream
│ └── FilterInputStream
│ ├── BufferedInputStream
│ └── DataInputStream
└── OutputStream ├── FileOutputStream ├── ByteArrayOutputStream └── FilterOutputStream ├── BufferedOutputStream └── DataOutputStream 字符流
├── Reader
│ ├── InputStreamReader
│ └── BufferedReader
└── Writer ├── OutputStreamWriter └── BufferedWriter
二、NIO:零拷贝与内存映射的维度突破
2.1 C内存映射的复杂实现
mmap文件操作示例:
#include <sys/mman.h> void* map_file(const char* filename, size_t* length) { int fd = open(filename, O_RDONLY); if (fd == -1) return NULL; struct stat st; fstat(fd, &st); *length = st.st_size; void* addr = mmap(NULL, *length, PROT_READ, MAP_PRIVATE, fd, 0); close(fd); return addr;
} // 使用后需munmap释放
缺陷分析:
- 需要手动管理内存映射生命周期
- 不同系统API差异(Windows的CreateFileMapping)
- 缺乏类型安全(返回void*)
2.2 Java内存映射的优雅实现
MappedByteBuffer使用:
public class MappedFileReader { public static void read(String path) throws IOException { try (RandomAccessFile file = new RandomAccessFile(path, "r")) { FileChannel channel = file.getChannel(); MappedByteBuffer buffer = channel.map( FileChannel.MapMode.READ_ONLY, 0, channel.size()); while (buffer.hasRemaining()) { byte b = buffer.get(); // 处理字节 } } }
}
内存映射优势:
- 自动处理系统差异
- 缓冲区直接与文件关联
- 支持随机访问(seek高效)
- 零拷贝数据传输(避免用户态与内核态复制)
2.3 零拷贝的底层实现
传统文件读写流程:
- 磁盘 → 内核缓冲区
- 内核缓冲区 → 用户缓冲区
- 用户缓冲区 → 套接字缓冲区
- 套接字缓冲区 → 网络
零拷贝优化路径:
- transferTo/transferFrom方法
- 磁盘 → 内核缓冲区
- 内核缓冲区 → 网络
Java NIO实现:
public void transferFile(String src, SocketChannel socket) throws IOException { try (FileChannel file = FileChannel.open(Paths.get(src))) { long position = 0; long remaining = file.size(); while (remaining > 0) { long transferred = file.transferTo(position, remaining, socket); position += transferred; remaining -= transferred; } }
}
三、异步IO:从回调地狱到Future天堂
3.1 C异步IO的复杂性
epoll示例(Linux):
int epoll_fd = epoll_create1(0);
struct epoll_event event;
event.events = EPOLLIN | EPOLLET;
event.data.fd = socket_fd;
epoll_ctl(epoll_fd, EPOLL_CTL_ADD, socket_fd, &event); struct epoll_event events[MAX_EVENTS];
int n = epoll_wait(epoll_fd, events, MAX_EVENTS, -1);
for (int i = 0; i < n; i++) { if (events[i].data.fd == socket_fd) { // 处理I/O事件 }
}
主要痛点:
- 需要手动管理事件循环
- 回调函数导致代码碎片化
- 跨平台实现差异大
3.2 Java异步IO的现代方案
CompletableFuture示例:
public CompletableFuture<String> asyncReadFile(String path) { return CompletableFuture.supplyAsync(() -> { try { return new String(Files.readAllBytes(Paths.get(path))); } catch (IOException e) { throw new CompletionException(e); } });
} // 使用
asyncReadFile("data.txt") .thenApply(content -> content.toUpperCase()) .thenAccept(System.out::println) .exceptionally(ex -> { System.err.println("Error: " + ex.getMessage()); return null; });
异步IO优势:
- 链式调用避免回调嵌套
- 内置线程池管理
- 异常处理统一
- 支持组合多个异步操作
3.3 Selector与事件驱动模型
Java NIO多路复用:
Selector selector = Selector.open();
SocketChannel channel = SocketChannel.open();
channel.configureBlocking(false);
channel.register(selector, SelectionKey.OP_READ); while (true) { int ready = selector.select(); Set<SelectionKey> keys = selector.selectedKeys(); Iterator<SelectionKey> iter = keys.iterator(); while (iter.hasNext()) { SelectionKey key = iter.next(); if (key.isReadable()) { // 处理读事件 } iter.remove(); }
}
与C的epoll对比:
- 统一的选择器API(跨平台)
- 面向对象的Channel抽象
- 集成的缓冲区管理
四、文件锁与跨平台兼容性
4.1 C文件锁的碎片化实现
fcntl锁示例:
struct flock lock = { .l_type = F_WRLCK, .l_whence = SEEK_SET, .l_start = 0, .l_len = 0 // 锁整个文件
}; fcntl(fd, F_SETLKW, &lock); // 阻塞式加锁
// ...操作文件
lock.l_type = F_UNLCK;
fcntl(fd, F_SETLK, &lock);
痛点分析:
- Windows使用LockFileEx API
- 不同系统锁语义差异
- 难以实现跨平台可靠锁定
4.2 Java文件锁的统一抽象
跨平台文件锁:
public void safeWrite(String path, String data) throws IOException { try (RandomAccessFile file = new RandomAccessFile(path, "rw"); FileChannel channel = file.getChannel()) { FileLock lock = channel.lock(); // 自动适配系统 try { // 独占写入 channel.write(ByteBuffer.wrap(data.getBytes())); } finally { lock.release(); } }
}
锁特性对比:
特性 | C实现 | Java FileLock |
---|---|---|
跨平台 | 需条件编译 | 统一API |
锁范围 | 支持区域锁 | 支持区域锁 |
共享锁 | fcntl实现 | channel.lock(0, Long.MAX_VALUE, true) |
非阻塞 | F_SETLK | tryLock() |
五、高级流操作与装饰器模式
5.1 C扩展功能的艰难实现
添加压缩功能的痛苦过程:
// 需要集成zlib库
gzFile gz = gzopen("data.gz", "wb");
if (!gz) return -1; char buffer[4096];
while (/* 读取数据 */) { if (gzwrite(gz, buffer, sizeof(buffer)) == 0) { gzclose(gz); return -1; }
}
gzclose(gz);
缺点:
- 需引入外部库
- 错误处理与普通文件不同
- 无法与加密等操作组合
5.2 Java装饰器模式的威力
流操作组合示例:
public void writeCompressedEncryptedData(String path, byte[] data) throws IOException { try (OutputStream out = new BufferedOutputStream( new GZIPOutputStream( new CipherOutputStream( new FileOutputStream(path), cipher)))) { out.write(data); }
}
装饰器优势:
- 灵活组合功能(加密→压缩→缓冲)
- 统一异常处理
- 自动资源管理
- 可扩展性强
5.3 常见装饰流类
装饰类 | 功能 | C等效实现难度 |
---|---|---|
BufferedInputStream | 缓冲加速 | 需手动管理缓冲区 |
DataInputStream | 基本类型读取 | 需解析字节序 |
ObjectInputStream | 对象反序列化 | 需实现序列化协议 |
PushbackInputStream | 回退读取 | 复杂状态管理 |
六、C程序员的IO转型指南
6.1 思维模式转换矩阵
C模式 | Java最佳实践 | 注意事项 |
---|---|---|
fopen/fclose | try-with-resources | 自动释放资源 |
fread/fwrite | InputStream/OutputStream | 使用缓冲流提升性能 |
lseek | RandomAccessFile | 支持读写跳转 |
目录操作opendir/readdir | Files.list() | 返回Stream |
内存映射mmap | MappedByteBuffer | 无需手动释放 |
6.2 性能关键代码迁移
C高性能文件处理:
#define _GNU_SOURCE
#include <fcntl.h> int fd = open("data.bin", O_DIRECT); // 直接IO绕过缓存
posix_memalign(&buf, 512, 4096); // 对齐内存
read(fd, buf, 4096);
Java等效实现:
FileChannel channel = FileChannel.open(Paths.get("data.bin"), StandardOpenOption.READ); ByteBuffer buffer = ByteBuffer.allocateDirect(4096); // 直接缓冲区
channel.read(buffer);
优化技巧:
- 使用DirectByteBuffer减少拷贝
- 配置NIO的非阻塞模式
- 利用内存映射处理大文件
6.3 调试与诊断工具
常用诊断命令:
# 查看文件描述符
jcmd <pid> VM.native_memory # 监控IO等待
jconsole → 线程页 → 查看阻塞线程 # 堆外内存分析
Native Memory Tracking (NMT)
七、Java IO的未来:更现代的API
7.1 Files工具类的革命
简化文件操作示例:
// 读取所有行
List<String> lines = Files.readAllLines(Paths.get("data.txt")); // 遍历目录
Files.walk(Paths.get("/data")) .filter(Files::isRegularFile) .forEach(System.out::println); // 文件监控
WatchService watcher = FileSystems.getDefault().newWatchService();
Path dir = Paths.get("/data");
dir.register(watcher, ENTRY_MODIFY);
7.2 NIO.2的异步增强
异步目录操作:
AsynchronousFileChannel channel = AsynchronousFileChannel.open( Paths.get("bigfile.bin"), StandardOpenOption.READ); ByteBuffer buffer = ByteBuffer.allocate(1024);
channel.read(buffer, 0, buffer, new CompletionHandler<Integer, ByteBuffer>() { public void completed(Integer result, ByteBuffer attachment) { // 处理数据 } public void failed(Throwable exc, ByteBuffer attachment) { // 处理错误 } });
7.3 第三方库的扩展
推荐库:
- Apache Commons IO:FileUtils提供增强功能
- Google Guava:Files类简化常见操作
- Netty:高性能网络IO框架
- Jimfs:内存文件系统测试工具
转型检查表
C习惯 | Java IO最佳实践 | 完成度 |
---|---|---|
手动资源管理 | try-with-resources | □ |
错误码检查 | 异常处理 | □ |
固定缓冲区 | Buffered流装饰器 | □ |
平台相关路径处理 | Paths.get()自动转换 | □ |
直接内存操作 | ByteBuffer.allocateDirect | □ |
附录:JVM IO性能调优参数
关键JVM参数:
-Djava.nio.channels.DefaultThreadPool.initialSize=32
:NIO线程池初始化大小-XX:MaxDirectMemorySize=1G
:限制堆外内存大小-Djava.awt.headless=true
:禁用GUI加速文件操作
监控命令:
jstat -gc <pid> # 查看GC情况(Direct Buffer影响)
jcmd <pid> VM.info | grep 'direct' # 查看直接内存使用
下章预告
第十八章 JVM调优:内存管理的权力游戏
- GC算法对比:标记清除 vs 复制算法
- 内存泄漏诊断:MAT工具实战
- ZGC的低延迟秘密
在评论区分享您在处理大文件时遇到的性能挑战,我们将挑选典型案例进行优化分析!
相关文章:
【C到Java的深度跃迁:从指针到对象,从过程到生态】第四模块·Java特性专精 —— 第十七章 IO流:超越FILE*的维度战争
一、从C文件操作到Java流的进化 1.1 C文件操作的原始挑战 C语言通过FILE*和低级文件描述符进行I/O操作,存在诸多限制: 典型文件复制代码: #include <stdio.h> int copy_file(const char* src, const char* dst) { FILE* in fope…...
Leetcode刷题记录22——滑动窗口最大值
题源:https://leetcode.cn/problems/sliding-window-maximum/description/?envTypestudy-plan-v2&envIdtop-100-liked 题目描述: 思路一: 暴力遍历法,通过一个长度为k的滑动窗口遍历nums,将其中最大的数依次记…...
React 第三十四节 Router 开发中 useLocation Hook 的用法以及案例详解
一、useLocation基础用法 作用:获取当前路由的 location 对象 返回对象结构: {pathname: "/about", // 当前路径search: "?namejohn", // 查询参数(URL参数)hash: "#contact", …...
BT134-ASEMI机器人功率器件专用BT134
编辑:LL BT134-ASEMI机器人功率器件专用BT134 型号:BT134 品牌:ASEMI 封装:TO-126 批号:最新 引脚数量:3 封装尺寸:如图 特性:双向可控硅 工作结温:-40℃~150℃…...
十五种光电器件综合对比——《器件手册--光电器件》
十五、光电器件 名称 原理 特点 应用 发光二极管(LED) 基于半导体材料的电致发光效应,当电流通过时,电子与空穴复合,释放出光子。 高效、节能、寿命长、响应速度快、体积小。 广泛用于指示灯、照明、显示&#…...
网络安全攻防演练实训室建设方案
一、引言 在数字化浪潮席卷全球的当下,网络已深度融入社会的各个层面,成为推动经济发展、社会进步和科技创新的关键力量。从日常生活中的移动支付、社交互动,到企业运营中的数据管理、业务拓展,再到国家关键基础设施的运行&#…...
极客天成受邀参加2050大会,共赴人工智能科技盛宴
2025年4月25日,备受瞩目的2050大会在杭州云栖小镇盛大开幕。作为科技领域的佼佼者,北京极客天成科技有限公司受邀参加了此次盛会,与全球科技爱好者共同探索科技的未来。 大会盛况空前,科技盛宴开启 2050大会是由杭州市云栖科技创…...
GUI_DrawPixel 函数详解
GUI_DrawPixel 是嵌入式GUI库中的基础像素绘制函数,用于在指定坐标绘制单个像素点。下面我将详细介绍这个函数的功能、实现和使用方法。 1. 函数功能 在显示屏的指定位置(x,y)绘制一个像素点 使用当前设定的颜色进行绘制 是构建所有高级图形(线、圆、…...
AWS MSK 集群升级前配置检查:保障升级平稳进行的关键步骤
在 AWS Managed Streaming for Apache Kafka (MSK) 集群升级之前,进行全面的配置检查至关重要。本文将介绍一个用于 MSK 升级前配置检查的 Bash 脚本,帮助您识别潜在的风险点,确保升级过程的顺利进行。 为什么需要升级前检查? AWS MSK 提供了自动升级功能,但在升级过程中,不…...
leetcode 2516. 每种字符至少取 K 个
题目描述 滑动窗口问题 可以转化为求按照题目要求从两端取走字符后,中间部分的最大长度。中间部分就是一个滑动窗口。 class Solution { public:int takeCharacters(string s, int k) {vector<int> count(3,0);int n s.size();for(int i 0;i <n;i){cou…...
通信原理第七版与第六版区别附pdf
介绍 我用夸克网盘分享了「通信原理 第7版》樊昌信」,链接:https://pan.quark.cn/s/be7c5af4cdce 《通信原理(第7版)》是在第6版的基础上,为了适应当前通信技术发展和教学需求,并吸取了数十所院校教师的反…...
CPU 空转解析
在编程中,“避免 CPU 空转” 指的是防止程序在等待某个条件满足时,无意义地消耗 CPU 资源。以下是对这一问题的详细解释: 1. 什么是 CPU 空转? 当代码中出现类似以下逻辑时: while not condition_met: # 循环检查条…...
云蝠智能大模型智能呼叫:赋能零售行业服务,助力客户增长
在数字化浪潮席卷全球的今天,零售行业正面临前所未有的变革压力。消费者需求日益个性化、市场竞争愈发激烈,传统的人工客服模式已难以满足企业对高效触达、精准营销和极致体验的需求。而云蝠智能大模型智能呼叫系统,凭借其突破性的AI技术和深…...
Consul安装部署(Windows环境)
部署资料链接:https://download.csdn.net/download/ly1h1/90722829 1.下载 Consul 1.访问 Consul 官方下载页面:Install | Consul | HashiCorp Developer 2.选择适合 Windows 的版本(如 consul_1.16.1_windows_amd64.zipÿ…...
Sql刷题日志(day7)
面试: 1、怎么样的数据挖取能真正对业务起到指导作用? 明确的业务目标:开始之前明确你想通过数据挖掘解决的业务问题。这些问题应具体、可量化,并与业务战略紧密相关。正确的数据集:确保使用的数据与你的业务问题相关…...
【MuJoCo仿真】开源SO100机械臂导入到仿真环境
主要参考:https://github.com/jpata/gym-so100/tree/integration/gym_so100/assets/trs_so_arm100 参考:(八)lerobot开源项目扩展so100的仿真操控(操作记录)_so100机械臂 仿真-CSDN博客 下载:…...
redis 有序集合zrange和zrangebyscore的区别
起因是查询数据,用了zrangebyscore 但是一直显示没数据 具体命令zrangebyscore key 0 -1 withscores, 原有印象中一直是这么用的,但是突然查不出来了, 于是搜了下问题所在。 通过分数查看 不能用0和-1表示最小和最大,只能用分数来…...
基于C#窗体+GDI+绘图实现分形树
实验:分形树 一. 引言 实验目的:继续学习C#窗体应用程序的图形化界面设计以及GDI绘图的一些基本指示,通过制作各种类型的分形树增强对于递归的理解,在创造分形图形的过程中感受编程的快乐 Tutorial任务 1.制作不同类型的分形图形(本次演示的是两种不同类型的分…...
使用Langchain+DeepSeep进行测试相关工作
1.使用BaseChatModel实现自定义DeepSeekLLM import json import typing from typing import Optional, Any, List, Dict, Union, Sequence, Callable, Literalimport requests from langchain_core.callbacks import CallbackManagerForLLMRun from langchain_core.language_m…...
Java练习6
一.题目 数字加密与解密 需求: 某系统的数字密码(大于 0),比如 1983,采用加密方式进行传输。 规则如下: 先得到每位数,然后每位数都加上 5,再对 10 求余,最后将所有数字反转,得到一…...
二叉树知识点
1、树形结构 1.1概念 二叉树属于树形结构,所以先了解树形结构之后,再学习二叉树。 树形结构是一种非线性的数据结,是由n个有限节点组成的一个具有层次关系的集合,其形状就像一棵到这的树,跟朝上,叶子朝下…...
neo4j暴露公网ip接口——给大模型联通知识图谱
特别鸣谢 我的领导,我的脑子,我的学习能力,感动了 1. 搭建知识图谱数据库(见上一章博客) 这里不加赘述了,请参考上一篇博客搭建 2. FastApi包装接口 这里注意:NEO4J_URI不得写http:,只能写…...
在阿里云实例上部署通义千问QwQ-32B推理模型
通义千问QwQ-32B是阿里云开源的320亿参数推理模型,通过大规模强化学习在数学推理、编程及通用任务中实现性能突破,支持消费级显卡本地部署,兼顾高效推理与低资源消耗。 本文将介绍如何利用vLLM作为通义千问QwQ-32B模型的推理框架,在一台阿里云GPU实例上构建通义千问QwQ-32…...
GEE进行Theil-Sen Median斜率估计和Mann-Kendall检验
介绍一下Theil-Sen Median斜率估计和Mann-Kendall趋势分析,这两种方法经常结合使用,前者用于估计趋势的斜率,后者用于检验趋势的显著性。如多年NPP或者NDVI的趋势分析。 主要介绍使用GEE实现这一内容的代码方法,若使用python&…...
WSL2下Docker desktop的Cadvisor容器监控
由于WSL2的Docker存放是在Linux的docker-desktop目录下,需要从这里面挂载到WSL2里的/var/lib/docker,并且正确挂载启动,才能使 Cadvisor 识别到docker容器并且监控资源。 首先需要在WSL2终端进行挂载操作: sudo mount -t drvfs \…...
深度学习---pytorch搭建深度学习模型(附带图片五分类实例)
一、PyTorch搭建深度学习模型流程 1. 环境准备 安装PyTorch及相关库: pip install torch torchvision numpy matplotlib2. 数据准备 数据集加载:使用内置数据集(如CIFAR-10)或自定义数据集。数据预处理:包括归一化…...
基于 STM32 的智慧图书馆智能控制系统设计与实现
一、系统架构概述 智慧图书馆智能控制系统集成环境调控、安全监控、借阅管理与信息推送功能,通过 STM32 主控芯片联动传感器、执行器及云平台,实现图书馆智能化管理。系统架构分为感知层(传感器)、控制层(STM32 主控)、执行层(继电器 / 显示屏)及云端层(数据交互),…...
4. python3基本数据类型
Python3 中有六个标准的数据类型: Number(数字) String(字符串) List(列表) Tuple(元组) Set(集合) Dictionary(字典) Pyt…...
什么是缓冲区溢出?NGINX是如何防止缓冲区溢出攻击的?
大家好,我是锋哥。今天分享关于【什么是缓冲区溢出?NGINX是如何防止缓冲区溢出攻击的?】面试题。希望对大家有帮助; 什么是缓冲区溢出?NGINX是如何防止缓冲区溢出攻击的? 缓冲区溢出是指程序试图向一个固定…...
4.27搭建用户界面
更新 router下面的index.js添加新的children 先区分一下views文件夹下的不同vue文件: Home.vue是绘制home页面的所有的表格。 Main.vue是架构头部和左侧目录的框架的。 研究一下这个routes对象,就可以发现重定向redirect的奥妙所在,我们先把…...
常用回环检测算法对比(SLAM)
回环检测本质上是一种数据相似性检测算法,原理是通过识别机器人是否回到历史位置,建立位姿约束以优化全局地图,纠正长期的里程计漂移实现全局地图的一致性,简单讲就是识别场景中的重复特征以修正累积误差。 1. 概述 算法类别原理特点优势劣势词袋模型特征聚类为单词,TF-I…...
《从线性到二维:CSS Grid与Flex的布局范式革命与差异解析》
在前端开发的广袤宇宙中,CSS布局技术宛如闪耀的星辰,不断革新与演进,为构建绚丽多彩的网页世界提供了坚实的支撑。其中,CSS Grid布局与Flex布局作为两颗璀璨的明星,以其独特的魅力和强大的功能,深受开发者们…...
理解 EKS CloudWatch Pod CPU Utilization 指标:与 `kubectl top` 及节点 CPU 的关系
在使用 AWS EKS 时,CloudWatch Container Insights 提供了丰富的容器级别监控指标,帮助我们深入了解应用的运行状态。如下截图中的 ContainerInsights pod_cpu_utilization 指标就是一个非常重要的维度。本文将详细解释这个指标的含义,并将其…...
解读JetBrains ToolBox以及Windows环境AppData的那点事
AppData 顾名思义应用程序数据,指的就是程序运行实例数据。用于存储应用程序的自定义设置和缓存数据。这些数据不仅包括程序个性化的配置,还涵盖了在应用程序运行过程中产生的临时文件和日志信息。 本身它是一个隐藏文件夹,位于每个用户的个人…...
Elasticsearch:ES|QL lookup JOIN 介绍 - 8.18/9.0
警告:此功能在 8.18/9.0 中刚推出。此功能处于技术预览阶段,未来版本可能会更改或删除。Elastic 会努力修复任何问题,但技术预览中的功能不受正式 正式发布功能支持 SLA 的约束。 ES|QL LOOKUP JOIN 处理命令将你的 ES|QL 查询结果表中的数据…...
基于开闭原则优化数据库查询语句拼接方法
背景 在开发实践中,曾有同事在实现新功能时,因直接修改一段数据库查询条件拼接方法的代码逻辑,导致生产环境出现故障。 具体来看,该方法通过在函数内部直接编写条件判断语句实现查询拼接,尽管从面向对象设计的开闭原…...
无人机航拍牛只检测数据集VOC+YOLO格式906张1类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):906 标注数量(xml文件个数):906 标注数量(txt文件个数):906 标注…...
【LeetCode 560】和为K的子数组(前缀和+哈希)
题面: 思路: 看到连续非空序列之和,容易想到前缀和计算差分, n u m s nums nums 区间 [ j , i ] [j,i] [j,i] 的和即为: s u m ( i , j ) p r e [ i ] − p r e [ j − 1 ] sum(i, j) pre[i] - pre[j-1] sum(i,j)…...
手术中评估帕金森患者手部运动的无接触式系统
南开大学韩建达教授研究团队提出一种针对帕金森病手术治疗的评估系统,可在手术中对患者手部运动进行实时监测,实现无接触式运动特征提取,并结合可视化数据分析辅助临床决策。相关研究论文“A non-contact system for intraoperative quantita…...
服务器主动发送响应?聊天模块如何实现?
一、背景知识 当我们在某聊天界面中发送一个消息时,如A给B发送了一个消息,而B马上就收到,仔细思考会发现以下问题 : 1. A给服务器发送请求,但服务器却给B发送了响应 2.B没有向服务器发送请求,却收到了…...
服务器远程超出最大连接数的解决方案是什么?
以下是为您撰写的关于服务器远程连接超限问题的解决方案论文,包含技术原理分析、解决策略和实际应用案例: 服务器远程连接超限问题分析与多维解决方案研究 摘要 随着数字化转型进程加速,服务器远程连接过载问题已成为企业IT运维领域的重大挑…...
【资料分享】全志T536(异构多核ARMCortex-A55+玄铁E907 RISC-V)工业核心板硬件说明书
前 言 本文为创龙科技SOM-TLT536工业核心板硬件说明书,主要提供SOM-TLT536工业核心板的产品功能特点、技术参数、引脚定义等内容,以及为用户提供相关电路设计指导。 为便于阅读,下表对文档出现的部分术语进行解释;对于广泛认同释义的术语,在此不做注释。...
Missashe考研日记-day30
Missashe考研日记-day30 0 写在前面 日记也是写到第30篇了哈哈,满月了,虽然过了不止30天中间有断更,但还是表扬一下自己坚持下来了。:) 1 专业课408 学习时间:2h30min学习内容: 今天有其他事…...
工程管理部绩效考核关键指标与项目评估
工程管理部的关键绩效考核指标(KPI)设计旨在全面评估部门在设施设备管理、特种设备保养、维修质量以及业主满意度等方面的工作表现。每个指标都与部门的日常运营紧密相关,直接影响到设施的维护质量和业主的满意度。 本文将深入探讨工程管理部的主要绩效考核指标&am…...
【沉浸式求职学习day29】【信科知识面试题第一部分】【新的模块,值得收藏】
快五一辣,大家什么安排呀哈哈哈~可能五一期间我就不更新啦,时间比较碎片化,要陪重要的人 沉浸式求职学习 理论攻坚-计算机基础知识1.诞生2.发展3.特点4.分类巨型 5.应用计算机辅助: 6.计算机的性能指标7.信息的存储单位 理论攻坚…...
Cliosoft安装
创建安装目录、解压 [rootedatest opt]# mkdir Cliosoft [rootedatest opt]# mv sos_7.05.p9/ Cliosoft/ [rootedatest opt]# cd Cliosoft/ [rootedatest Cliosoft]# cd sos_7.05.p9/ [rootedatest sos_7.05.p9]# tar -xf sos_7.05.p9_linux64.tar 用普通用户eda安装 [rooteda…...
MES管理系统:重构生产任务管理的数智化引擎
在制造业的数字化浪潮中,生产任务管理正从传统的经验驱动转向数据驱动的精细化模式。作为连接计划层与执行层的核心枢纽,MES管理系统通过智能化、动态化的管理手段,将生产任务的接收、分配、执行与优化融入全流程闭环,为企业打造透…...
推荐系统在线离线打分不一致:核心原因与全链路解决方案
目录 一、特征维度:数据处理的「隐形杀手」1.1 特征穿越:训练数据的「上帝视角」1.2 线上线下特征不一致的四大陷阱(1)上线前一致性校验缺失(2)线上特征监控体系缺位(3)特征更新延迟…...
Markdown转WPS office工具pandoc实践笔记
随着DeepSeek、文心一言、讯飞星火等AI工具快速发展,其输出网页内容拷贝到WPS Office过程中,文档编排规整的格式很难快速复制。 注:WPS Office不支持Markdown格式,无法识别式样。 在这里推荐个免费开源工具Pandoc,实现…...
记录java线程中断理解,Thread.currentThread().interrupt();
记录java线程中断理解,Thread.currentThread().interrupt(); 一、概述 中断的理解: 1、Java 线程中断,协作式(通过 Thread.interrupt() 触发,需代码显式检查中断状态或调用可中断方法)。 2、操作系统中断…...