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

JavaIO流的使用和修饰器模式(直击心灵版)

系列文章目录

   JavaIO流的使用和修饰器模式


文章目录

  • 系列文章目录
  • 前言
  • 一、字节流:
    • 1.FileInputStream(读取文件)
    • 2.FileOutputStream(写入文件)
  • 二、字符流:
    • 1..基础字符流:
    • 2.处理流:
    • 3.对象处理流:
    • 4.转换流:
  •  三、修饰器模式
  • 总结


前言

  前面我们讲解了Java文件和IO流的基础部分。把流简单的分了一下类,但是我们还不知道具体是如何是使用的,下面我们将详细的讲解一下这些个流各自的职责是什么,简言之就是各自的使用方式。然后我还想给大家强戴一下IO流当中的修饰器模式,因为这个实际上通过封装真的太牛逼了。


          我先给大家按字节流和字符流的分类方式来进行讲述:

一、字节流:

       用于处理二进制数据(如图片、视频、任何文件)​,核心类为 InputStream 和 OutputStream

        (1)FileInputStream(读取文件)

            每次调用 read() 方法从磁盘读取1字节,频繁IO操作性能差。
  适用场景:小文件读取或需要逐字节处理的场景。

try (InputStream in = new FileInputStream("test.jpg")) {int byteData;while ((byteData = in.read()) != -1) { // 每次读取1字节// 处理字节(例如加密、校验)System.out.print((char)byteData + " ");}
} catch (IOException e) {e.printStackTrace();
}

        我们要注意,这样单个字节读取,如果文件当中有汉字就不行了。                  

 所以进阶版可以用int read(byte[] b)方法来读取,这个方法底层是从该输入流中读取最多b.length字节数据到字节数组,如果读取正常,返回实际读取字节数, -1表示的是读取完毕了。但记得最后还要转换为字符串 new String(buf,0,readlen).

           (2) FileOutputStream(写入文件)

        注意点:若文件不存在会自动创建,若存在默认覆盖(通过构造参数可设置为追加模式)。

// 第二个参数 true 表示追加写入
try (OutputStream out = new FileOutputStream("log.txt", true)) {String logEntry = "Error occurred at " + new Date() + "\n";out.write(logEntry.getBytes(StandardCharsets.UTF_8)); // 显式指定编码
} catch (IOException e) {e.printStackTrace();
}

这里还有一处细节要注意,就是这样创建,写入内容会覆盖原来的内容,但如果是这样创建的 new FileOutputStream(filepath,true),这样再写入内容就会追加到文件后面。

二、字符流

1.基础字符流:

  (1)FileReader 读文件

  这里循环读取使用read()是单个字符读取,使用read(buf)返回的是实际取到的字符数.

  (2)FileWriter      写文件

这里面注意一定要关闭流,或者Flush才能真正的把数据写入到文件

2.处理流:

BufferedReader 和 BufferedWriter:

readLine() 可逐行读取文本。

// 读取CSV文件并解析
try (BufferedReader br = new BufferedReader(new FileReader("data.csv"))) {String line;while ((line = br.readLine()) != null) {String[] columns = line.split(",");// 处理每一列数据}
}// 写入带换行的文本
try (BufferedWriter bw = new BufferedWriter(new FileWriter("output.txt"))) {bw.write("Line 1");bw.newLine();  // 跨平台换行(Windows为\r\n,Linux为\n)bw.write("Line 2");
}

像BufferedReader类中,有属性Reader,即可以封装一个节点流 (该节点流可以是任意的,只要是Reader的子类就行,这个我们下面讲修饰器模式再讲)。

details:

1.BufferedReader 和 BufferedWriter都是按照字符操作的。

2.不要去操作二进制文件(如声音,视频等)可能会造成文件损坏。

   总结:

场景正确流类型原因
图片、视频、EXE文件字节流直接处理原始字节,避免编解码干扰
文本文件(.txt)字符流正确处理字符编码(如UTF-8、GBK)
混合数据(如PDF)字节流PDF包含文本和二进制结构,需精确控制字节
网络传输数据字节流网络协议基于字节,而非字符

所以说字符流是“文本专用工具”,操作二进制文件就像用剪刀拧螺丝——不仅费力,还可能搞砸!

  3.对象处理流:

  能够将基本数据类型或者对象进行序列化和反序列化的操作。

      这里我们需要注意的是如果需要让某个对象支持序列化机制,则必须让其类是可序列化的,而为了让某个类是可序列化的,该类必须实现如下两个接口之一:

    Serializable  和   Externalizable  我们常用的是Serializable接口,因为它不用再重写方法了。

    

class User implements Serializable {private static final long serialVersionUID = 1L; // 版本号private String name;private transient String password; // transient字段不会被序列化
}// 序列化对象到文件
User user = new User("Alice", "secret");
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("user.dat"))) {oos.writeObject(user);
}// 反序列化
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("user.dat"))) {User restoredUser = (User) ois.readObject();System.out.println(restoredUser.getName()); // 输出 "Alice"System.out.println(restoredUser.getPassword()); // 输出 null(transient字段)
}

     注意读取(反序列化)的顺序需要和保存数据(序列化)的顺序一致,否则会出现异常。

还有最容易忽略的一点就是序列化对象时,要求里面的属性的类型也需要实现序列化接口。

  序列化对象时,默认将里面所有属性都会进序列化,除了static或者transient修饰的成员。

    4.转换流:

乱码的本质是 ​字符编码不匹配

  1. 写入时:文本按编码A(如UTF-8)转换为字节。
  2. 读取时:字节按编码B(如GBK)解码为字符。
  3. 结果:编码A和编码B的映射关系不同,导致字符显示错误。

转换流的作用

类名功能核心价值
InputStreamReader将字节流(InputStream)按指定编码转换为字符流解决读取时的编码问题
OutputStreamWriter将字符流按指定编码转换为字节流(OutputStream解决写入时的编码问题
try (Reader reader = new InputStreamReader(new FileInputStream("utf8_file.txt"), StandardCharsets.UTF_8)) {// 正确读取中文字符int data;while ((data = reader.read()) != -1) {System.out.print((char) data);}
}try (Reader reader = new InputStreamReader(new FileInputStream("utf8_file.txt"), StandardCharsets.UTF_8)) {// 正确读取中文字符int data;while ((data = reader.read()) != -1) {System.out.print((char) data);}
}

综上可知,学习IO流我们必须要知道什么时候使用什么流。

   三、修饰器模式:

  其实我在学习的过程中也很疑惑这个修饰器模式到底有什么用,不就是像套娃一样一层套着一层吗,但是当我们真正理解了才发现Java设计者有多牛逼。

        像以BufferedInputStream举例:

BufferedInputStream 的缓冲机制

  • 内部缓冲区BufferedInputStream 维护一个字节数组(默认大小 8KB),用于临时存储从底层流读取的数据。
  • 读取逻辑
    1. 当用户调用 read() 时,BufferedInputStream 会优先从缓冲区读取数据
    2. 如果缓冲区为空,它会一次性从底层 InputStream(如 FileInputStream)读取一批数据(填满缓冲区)。
    3. 后续的 read() 直接从缓冲区返回数据,直到缓冲区耗尽,再重复步骤 2。

   

  • 数据来源BufferedInputStream 本身不连接任何数据源(如文件、网络等),它只是一个“功能增强包装器”。
  • 依赖关系:缓冲流需要底层流提供原始数据,而 FileInputStream 是唯一能直接读取文件的节点流。

   装饰器模式(Decorator Pattern)的核心思想是 ​动态地为对象添加功能,同时保持接口的一致性。

  举一个咖啡加料的例子:

     假设你经营一家咖啡店,需要灵活组合咖啡和配料(如牛奶、糖),但不想为每种组合创建子类(如 MilkSugarCoffeeSugarCoffee 等)。装饰器模式可以完美解决这个问题

     1.定义基础组件:

      

// 基础接口:咖啡
public interface Coffee {double getCost();String getDescription();
}// 具体组件:基础咖啡
public class SimpleCoffee implements Coffee {@Overridepublic double getCost() { return 2.0; }@Overridepublic String getDescription() { return "基础咖啡"; }
}

     2. 定义装饰器基类:

   

// 装饰器基类:实现 Coffee 接口,并持有一个 Coffee 对象
public abstract class CoffeeDecorator implements Coffee {protected Coffee decoratedCoffee;public CoffeeDecorator(Coffee coffee) {this.decoratedCoffee = coffee;}// 委托给被装饰的 Coffee 对象@Overridepublic double getCost() { return decoratedCoffee.getCost(); }@Overridepublic String getDescription() { return decoratedCoffee.getDescription(); }
}

     3. 具体修饰器:牛奶或糖:

     

// 牛奶装饰器
public class MilkDecorator extends CoffeeDecorator {public MilkDecorator(Coffee coffee) {super(coffee);}@Overridepublic double getCost() { return super.getCost() + 0.5; }@Overridepublic String getDescription() { return super.getDescription() + "+牛奶"; }
}// 糖装饰器
public class SugarDecorator extends CoffeeDecorator {public SugarDecorator(Coffee coffee) {super(coffee);}@Overridepublic double getCost() { return super.getCost() + 0.2; }@Overridepublic String getDescription() { return super.getDescription() + "+糖"; }
}

     4.使用修饰器的动态组合: 

public class Main {public static void main(String[] args) {// 基础咖啡Coffee coffee = new SimpleCoffee();System.out.println(cost: " + coffee.getCost() + ", desc: " + coffee.getDescription());// 加牛奶coffee = new MilkDecorator(coffee);System.out.println(cost: " + coffee.getCost() + ", desc: " + coffee.getDescription());// 再加糖coffee = new SugarDecorator(coffee);System.out.println(cost: " + coffee.getCost() + ", desc: " + coffee.getDescription());}
}

而在IO流中:

  • 组件接口InputStream(所有输入流的基类)。
  • 具体组件FileInputStream(直接操作文件的节点流)。
  • 装饰器基类FilterInputStream(实现 InputStream,并持有 InputStream 对象)。
  • 具体装饰器BufferedInputStream(扩展 FilterInputStream,添加缓冲功能)。
// 节点流:直接读取文件
InputStream fileStream = new FileInputStream("data.txt");// 装饰器:添加缓冲功能
InputStream bufferedStream = new BufferedInputStream(fileStream);// 可以继续装饰:例如添加解密功能(假设有 DecryptInputStream)
InputStream decryptedStream = new DecryptInputStream(bufferedStream);

当调用 bufferedStream.read() 时:

  1. 检查缓冲区:如果有数据,直接返回。
  2. 缓冲区为空:调用底层 fileStream.read(byte[]) 批量读取数据到缓冲区。
  3. 返回数据:从缓冲区返回一个字节。

其实吧,处理流(如 BufferedInputStream)需要传入 InputStream 对象的核心目的,正是为了在自己的成员方法中调用底层流的 read 方法,并在其基础上添加额外功能(如缓冲、编码转换等)。这是装饰器模式的精髓所在。


总结

以上就是今天要讲的内容,本文仅简单的讲述了IO流分类后的使用和例子,然后讲了一下修饰器模式,接下来我会一直持续更新,谢谢大家。

相关文章:

JavaIO流的使用和修饰器模式(直击心灵版)

系列文章目录 JavaIO流的使用和修饰器模式 文章目录 系列文章目录前言一、字节流: 1.FileInputStream(读取文件)2.FileOutputStream(写入文件) 二、字符流: 1..基础字符流:2.处理流:3.对象处理流:4.转换流: 三、修饰器…...

10-STL、位运算、常用函数库

1-STL vector vector是变长数组 //定义vector vector<int>a;//第一维长233&#xff0c;第二维长度动态变化 vector<int>b[233];//自定义的结构体类型也可以保存在vector中 struct res{...}; vector<rec>c;//函数 a.size();//返回vector的实际长度&#xf…...

【Ratis】Ratis Streaming概览

看了Tsz-Wo Nicholas Sze博士的一个关于Ratis的share,在share里提到了raits做的一个性能优化:客户端流。比较感兴趣,特此记录一下。如果想看原始分享的,可以搜关键词:Apache Ratis - A High Performance Raft Library 关于Ratis Stream的pdf介绍,在这个PR的附件里: [Ra…...

Python Seaborn面试题及参考答案

目录 如何用 stripplot () 绘制带随机偏移的分类散点图?如何控制 jitter 参数? swarmplot () 如何避免散点重叠?适用场景与数据量限制是什么? 使用 catplot () 绘制箱线图时,如何通过 kind 参数切换图表类型? 如何通过 hue 参数在分类图中添加第三个维度(如性别)? …...

linux下基本命令和扩展命令(安装和登录命令、文件处理命令、系统管理相关命令、网络操作命令、系统安全相关命令、其他命令)欢迎补充噢

基本命令 ls: 列出目录内容 ls&#xff1a;列出当前目录内容ls -l&#xff1a;以长格式列出&#xff08;显示详细信息&#xff09;ls -a&#xff1a;显示隐藏文件ls -lh&#xff1a;以易读格式显示文件大小 pwd: 显示当前工作目录 pwd&#xff1a;显示当前目录的绝对路径 cd:…...

K8S学习之基础四十:K8S配置altermanager发送告警到钉钉群

配置altermanager发送告警到钉钉群 ​ 创建钉钉群&#xff0c;设置机器人助手(必须是管理员才能设置)&#xff0c;获取webhook webhook&#xff1a; https://oapi.dingtalk.com/robot/send?access_token25bed933a52d69f192347b5be4b2193bc0b257a6d9ae68d81619e3ae3d93f7c6…...

实用工具--OfficeAI 助手 v0.3.20(长期免费,2025-03-18 本地支持WPSWord联动)

软件简介 OfficeAI助手&#xff0c;作为Microsoft Office与WPS的得力智能插件&#xff0c;集文档自动生成、内容精准校对与润色、公式智能推荐等多功能于一体。它凭借强大的数据分析能力&#xff0c;深度融入Office/WPS办公生态&#xff0c;一键简化复杂流程&#xff0c;让办公…...

Android 关于compose的一些坑和理解

** 1.如何在 WindowManager.addView 中使用 Jetpack Compose** 一、引出问题 Android 开发中&#xff0c;很常见的一个场景&#xff0c;通过 WindowManager.addView() 添加一个 View 到屏幕上。Android 最新的视图框架 Jetpack Compose&#xff0c;如何应用进来。这个被添加的…...

ref setState 合成事件

ref & setState & 合成事件 受控组件的概念&#xff1a;数据改变视图的叫受控组件&#xff1b;通过dom操作改变的叫非受控。 语法&#xff1a;给refxxx赋一个值&#xff0c;然后通过this.refs.xxx就可以获取到相应dom元素&#xff0c;通过你这个名字存储的值就是这个do…...

调用feapder作为子程序时setting.py文件不起作用

feaper 官方文档地址&#xff1a; 简介及安装 - feapder官方文档|feapder-document 问题&#xff1a; 在最近的开发中需要调用feapder作为主程序调用的子程序时发现自动入库时无法入库&#xff0c;通过查看日志信息发现连接数据库时被拒绝连接了&#xff0c;但是我的setting.p…...

gralloc1_perform具体在干什么

gralloc1_perform 会在特定场景下通过 ioctl 调用&#xff0c;执行 缓存 (cache) 管理 和 内存映射 操作&#xff0c;确保 CPU 和 GPU 之间的数据一致性。 &#x1f4cc; 为什么需要对 cache 进行操作&#xff1f; 在 Android 系统中&#xff0c;CPU 和 GPU 通常共享 DDR 内存…...

【Pandas】pandas Series plot.barh

Pandas2.2 Series Plotting 方法描述Series.plot([kind, ax, figsize, …])用于绘制 Series 对象的数据可视化图表Series.plot.area([x, y, stacked])用于绘制堆叠面积图&#xff08;Stacked Area Plot&#xff09;Series.plot.bar([x, y])用于绘制垂直条形图&#xff08;Ver…...

机器学习之浅层神经网络

文章目录 一、浅层神经网络概述&#xff08;一&#xff09;定义&#xff08;二&#xff09;常见类型 二、浅层神经网络的前向传播三、浅层神经网络的反向传播四、编写浅层神经网络案例&#xff08;Python NumPy 实现&#xff09;代码解释 五、浅层神经网络与深度学习的区别&am…...

透析Vue的nextTick原理

nextTick 是 Vue.js 中的一个核心机制&#xff0c;用于在 下一次 DOM 更新周期后 执行回调函数。它的核心原理是 利用 JavaScript 的事件循环机制&#xff08;Event Loop&#xff09;&#xff0c;结合微任务&#xff08;Microtask&#xff09;或宏任务&#xff08;Macrotask&am…...

Beans模块之工厂模块注解模块@Qualifier

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…...

产品更新 | 数字助决胜:华望M-Arch平台实现从体系模型到仿真推演

华望产品更新速递 功能介绍 |M-Arch体系建模软件的核心功能 ◆体系架构建模 ◆逻辑仿真 ◆与多种工具集成 ◆多专业协同建模 产品亮点 |M-Arch软件在体系作战中的作用 ◆全面构建任务和体系架构建模的能力 ◆模型化的装备体系分析方法 ◆提升作战体系架构设计与优化 前…...

IP地址结构体与字符串转换函数详解

IP地址结构体与字符串转换函数详解 在Linux C网络编程中&#xff0c;IP地址的二进制结构体&#xff08;如struct in_addr&#xff09;与字符串形式&#xff08;如"192.168.1.1"&#xff09;之间的转换经常涉及到&#xff0c;与IP地址格式相关的函数包括inet_aton、i…...

debug - 安装.msi时,为所有用户安装程序

文章目录 debug - 安装.msi时&#xff0c;为所有用户安装程序概述笔记试试在目标.msi后面直接加参数的测试 备注备注END debug - 安装.msi时&#xff0c;为所有用户安装程序 概述 为了测试&#xff0c;装了一个test.msi. 安装时&#xff0c;只有安装路径的选择&#xff0c;没…...

基于springboot的社区团购系统(012)

摘 要 本课题是根据用户的需要以及网络的优势建立的一个社区团购系统&#xff0c;来满足用户团购的需求。 本社区团购系统应用Java技术&#xff0c;MYSQL数据库存储数据&#xff0c;基于Spring Boot框架开发。在网站的整个开发过程中&#xff0c;首先对系统进行了需求分析&…...

应用权限组列表

文章目录 使用须知位置相机麦克风通讯录日历运动数据身体传感器图片和视频音乐和音频跨应用关联设备发现和连接剪切板文件夹文件(deprecated) 使用须知 在申请目标权限前&#xff0c;建议开发者先阅读应用权限管控概述-权限组和子权限&#xff0c;了解相关概念&#xff0c;再合…...

4.1、网络安全模型

目录 网络安全体系概述网络安全模型-BLP模型网络安全模型-Biba模型网络安全模型 - 信息流模型信息保障模型能力成熟度模型其它安全模型网络安全原则 网络安全体系概述 网络安全体系是网络安全保证系统的最高层概念抽象&#xff0c;是一个体系&#xff0c;体系一般是一个概念&a…...

前端对接生成式AI接口(类ChatGPT)问题汇总

文章目录 前端实现对话流问题总结流式数据传输问题后台Response Headers问题大量数据分段接收问题多个流时间戳&#xff08;Time&#xff09;相同导致被合并的问题 中止对话问题复制问题部署上线问题&#xff08;Nginx缓冲导致&#xff09; 前端实现对话流问题总结 流式数据传…...

布隆过滤器(Bloom Filter)详解

布隆过滤器详解 1. 什么是布隆过滤器&#xff1f; 布隆过滤器&#xff08;Bloom Filter&#xff09;是一种高效的概率型数据结构&#xff0c;主要用于判断某个元素是否存在于一个集合中。它的特点是&#xff1a; 允许误判&#xff1a;可能会误判元素存在&#xff08;假阳性&…...

QoS(Quality of Service)服务质量概念

一、什么是QoS&#xff1f; QoS&#xff08;Quality of Service&#xff09;即服务质量&#xff0c;在网络业务中可以通过保证传输的带宽、降低传输时延、降低数据丢包率以及时延抖动等措施来提高服务质量。QoS是一套用于管理和提高网络性能的工具和技术&#xff0c;用于流量优…...

CSS实现当鼠标悬停在一个元素上时,另一个元素的样式发生变化的效果

CSS可以实现当鼠标悬停在一个元素上时&#xff0c;另一个元素的样式发生变化的效果。可以通过以下几种方法来实现&#xff1a; 1. 使用兄弟选择器&#xff08;Adjacent Sibling Selector&#xff09; 如果两个元素是兄弟关系&#xff08;即它们有相同的父元素&#xff09;&am…...

【C++11】左值引用、右值引用、移动语义和完美转发

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:C ⚙️操作环境:Visual Studio 2022 目录 &#x1f4cc;左值引用和右值引用 &#x1f38f;左值和左值引用 &#x1f38f;右值和右值引用 &#x1f4cc;左值引用和右值引用比较 &#x1f38f;左值引用 &#x1f38f;右值…...

Docker镜像迁移

目录 1.查看镜像当前配置 2.镜像迁移 1. 停止 Docker Desktop 2. 关闭 WSL 实例&#xff08;若基于 WSL 2&#xff09; 4. 导出原镜像数据 5.注销原实例 6. 导入数据到新路径 7. 设置 Docker Desktop 使用新路径&#xff08;可选&#xff09; 8. 启动 Docker Desktop …...

Compose 实践与探索十五 —— 自定义触摸

1、自定义触摸与一维滑动监测 之前我们在讲 Modifier 时讲过如下与手势检测相关的 Modifier&#xff1a; Modifier.clickable { } Modifier.combinedClickable { } Modifier.pointerInput {detectTapGestures { } }这里对以上内容就不再赘述了&#xff0c;直接去讲解更复杂的…...

第P8周:YOLOv5-C3模块实现

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客 &#x1f356; 原作者&#xff1a;K同学啊 1. 模块组成 C3 模块由 卷积层&#xff08;Convolutional layers&#xff09;、激活函数&#xff08;Activation functions&#xff09; 和 残差连接&#…...

知识蒸馏:让大模型“瘦身“而不失智慧的魔术

引言&#xff1a;当AI模型需要"减肥" 在人工智能领域&#xff0c;一个有趣的悖论正在上演&#xff1a;大模型的参数规模每年以10倍速度增长&#xff0c;而移动设备的算力却始终受限。GPT-4的1750亿参数需要价值500万美元的GPU集群运行&#xff0c;但现实中的智能设备…...

`docker commit`和`docker tag`

1.docker commit docker commit是一个 Docker 命令&#xff0c;用于将一个正在运行的容器&#xff08;Container&#xff09;的状态提交为一个新的镜像&#xff08;Image&#xff09;。这类似于在版本控制系统中提交更改。 作用 • 当你对一个容器进行了修改&#xff08;例如安…...

构建下一代AI Agent:自动化开发与行业落地全解析

1. 下一代AI Agent&#xff1a;概念与核心能力 核心能力描述技术支撑应用价值自主性独立规划与执行任务&#xff0c;无需持续人工干预决策树、强化学习、目标导向规划减少人工干预&#xff0c;提高任务执行效率决策能力评估多种方案并选择最优解决方案贝叶斯决策、多目标优化、…...

项目篇:模拟实现高并发内存池(2)

1.整体框架的设计 首先我们要来大概的梳理一下我们的高并发内存池的整体框架设计 在现代很多开发环境其实都是多核多线程&#xff0c;在申请内存的情况下&#xff0c;就必然会存在激烈的锁竞争问题。如果我们需要要实现内存池&#xff0c;必须要考虑以下几方面的问题。 1.性…...

PostgreSQL用SQL实现俄罗斯方块

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验 Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯…...

强大的AI网站推荐(第二集)—— V0.dev

网站&#xff1a;V0.dev 号称&#xff1a;前端开发神器&#xff0c;专为开发人员和设计师设计&#xff0c;能够使用 AI 生成 React 代码 博主评价&#xff1a;生成的UI效果太强大了&#xff0c;适合需要快速创建UI原型的设计师和开发者 推荐指数&#xff1a;&#x1f31f;&…...

田间机器人幼苗视觉检测与护苗施肥装置研究(大纲)

田间机器人幼苗视觉检测与护苗施肥装置研究 基于多光谱视觉与精准施肥的农业机器人系统设计 第一章 绪论 1.1 研究背景与意义 农业智能化需求&#xff1a; 传统幼苗检测依赖人工&#xff0c;效率低且易遗漏弱苗/病苗施肥不精准导致资源浪费和环境污染 技术挑战&#xff1a;…...

vLLM 同时部署多个模型及调用

目录 一、单例加载多模型 &#xff08;一&#xff09; 原生多模型支持&#xff08;vLLM ≥0.3.0&#xff09; &#xff08;二&#xff09; 针对 vLLM 单实例部署多模型时 只有最后一个模型生效 的问题&#xff0c;结合实际测试和源码分析&#xff0c;以下是具体原因和解决方…...

LeetCode 2680.最大或值:位运算

【LetMeFly】2680.最大或值&#xff1a;位运算 力扣题目链接&#xff1a;https://leetcode.cn/problems/maximum-or/ 给你一个下标从 0 开始长度为 n 的整数数组 nums 和一个整数 k 。每一次操作中&#xff0c;你可以选择一个数并将它乘 2 。 你最多可以进行 k 次操作&#…...

Python——MySQL数据库编程

MySQL 是现在最流行的关系型数据库管理系统&#xff0c;在 WEB 开发中&#xff0c;MySQL 是最好的 RDBMS 应用软件之一。接下来&#xff0c;让我们快速掌握 python 使用 MySQL 的相关知识&#xff0c;并轻松使用 MySQL 数据库。 第1关&#xff1a;python数据库编程之创建数据库…...

AI 如何重塑数据湖的未来

在生成式 AI 与大模型技术飞速发展的今天&#xff0c;数据湖技术正迎来前所未有的挑战与机遇。海量非结构化数据的存储与处理、实时性与计算效率的平衡、高效存储的需求&#xff0c;已成为数据平台的核心难题。如何突破传统架构的局限&#xff0c;构建支持 AI 驱动的高效数据湖…...

C++ - 从零实现Json-Rpc框架-2(服务端模块 客户端模块 框架设计)

项⽬设计 本质上来讲&#xff0c;我们要实现的rpc&#xff08;远端调⽤&#xff09;思想上并不复杂&#xff0c;甚⾄可以说是简单&#xff0c;其实就是客⼾端想要完成某个任务的处理&#xff0c;但是这个处理的过程并不⾃⼰来完成&#xff0c;⽽是&#xff0c;将请求发送到服务…...

课程5. 迁移学习

课程5. 迁移学习 卷积神经网络架构ImageNet神经网络架构实践从 torchvision 加载模型在一个图像上测试预先训练的网络 迁移学习网络训练冻结层实践准备数据替换网络的最后一层冻结层网络训练获取测试样本的质量指标 课程计划&#xff1a; 流行的神经网络架构迁移学习 卷积神经…...

SATA(Serial Advanced Technology Attachment)详解

一、SATA的定义与核心特性 SATA&#xff08;串行高级技术附件&#xff09;是一种 用于连接存储设备&#xff08;如硬盘、固态硬盘、光驱&#xff09;的高速串行接口标准&#xff0c;取代了早期的PATA&#xff08;并行ATA&#xff09;。其核心特性包括&#xff1a; 高速传输&am…...

常用的 MyBatis 标签及其作用

MyBatis 是一个优秀的持久层框架&#xff0c;它通过 XML 或注解的方式将 Java 对象与数据库操作进行映射。在 MyBatis 的 XML 映射文件中&#xff0c;可以使用多种标签来定义 SQL 语句、参数映射、结果映射等。以下是一些常用的 MyBatis 标签及其作用&#xff1a; 1. 基本标签 …...

Blender配置渲染设置并输出动画

在Blender中&#xff0c;渲染设置和渲染动画的选项位于不同的面板中。以下是具体步骤&#xff1a; 渲染设置 渲染设置用于配置输出格式、分辨率、帧率等参数。 打开右侧的 属性面板&#xff08;按 N 键可切换显示&#xff09;。 点击 “输出属性” 选项卡&#xff08;图标是…...

网络故障排查指南:分治法与排除法结合的分层诊断手册

目录 一、排查方法论&#xff1a;分治法与排除法的结合 1. 分治法&#xff08;Divide and Conquer&#xff09; 2. 排除法&#xff08;Elimination&#xff09; 二、分层诊断实战手册 1. 物理层排查&#xff08;设备与线路&#xff09; 硬件检测三板斧 运维经验 2. 网络…...

【万字总结】前端全方位性能优化指南(三)——GPU渲染加速、WebGPU、OffscreenCanvas多线程渲染

theme: condensed-night-purple 前言 当每秒60帧的流畅渲染遭遇百万级多边形场景,传统CPU绘图如同单车道上的赛车——即便引擎轰鸣,依然难逃卡顿困局。现代GPU加速技术将渲染任务从「单车道」扩展到「八车道」,本章以分层爆破、API革命、线程联邦为技术支柱,拆解如何通过G…...

报错 - redis - Unit redis.service could not be found.

报错&#xff1a; Unit redis.service could not be found.Could not connect to Redis at 127.0.0.1:6379: Connection refused解决方法&#xff1a; 检查状态、有必要的话 重新安装 Linux 上查看状态 systemctl status redis显示以下内容&#xff0c;代表正常服务 出现下面…...

Windows系统本地部署OpenManus对接Ollama调用本地AI大模型

文章目录 前言1. 环境准备1.1 安装Python1.2. 安装conda 2. 本地部署OpenManus2.1 创建一个新conda环境2.2 克隆存储库2.3 安装依赖环境 3. 安装Ollama4. 安装QwQ 32B模型5. 修改OpenManus配置文件6. 运行OpenManus7.通过网页使用OpenManus8. 安装内网穿透8.1 配置随机公网地址…...

【递归,搜索与回溯算法篇】- 名词解释

一. 递归 1. 什么是递归&#xff1f; 定义&#xff1a; 函数自己调用自己的情况关键点&#xff1a; ➀终止条件&#xff1a; 必须明确递归出口&#xff0c;避免无限递归 ➁子问题拆分&#xff1a; 问题需能分解成结构相同的更小的子问题缺点&#xff1a; ➀栈溢出风险&#x…...