Java文件流操作 - 【Guava】IO工具
引言
Guava 使用术语 流来表示可关闭的,并且在底层资源中有位置状态的 I/O 数据流。字节流对应的工具类为 ByteSterams,字符流对应的工具类为 CharStreams。 Guava 中为了避免和流直接打交道,抽象出可读的 源 source 和可写的 汇 sink 两个概念,指可以从中打开流的资源,比如 File、URL,同样也分别有字节和字符对应的源和汇,定义了一系列读写的方法。
Guava IO 极大简化了文件和流的操作。比如说,读写文件这种看似简单的操作,在Java原生代码中可能要写好几行,还不包括错误处理。Guava则可以用一两行搞定,简洁到让人惊叹。其次,它还提供了更丰富的功能,比如对不同字符集的处理,还有资源的高效管理。这些都是在开发过程中经常遇到的问题,Guava给了我们优雅的解决方案。
来看个简单的例子,比如说读取一个文本文件的内容。在Java原生代码中,可能得这么写:
try (BufferedReader br = new BufferedReader(new FileReader("example.txt"))) {String line;while ((line = br.readLine()) != null) {System.out.println(line);}
} catch (IOException e) {e.printStackTrace();
}
但是用Guava,就可以变得超级简单:
List<String> lines = Files.asCharSource(new File("example.txt"), Charsets.UTF_8).readLines();
lines.forEach(System.out::println);
看到区别了吧?Guava的代码不仅更短,而且可读性也强很多。而且,Guava还考虑了很多细节,比如字符集处理,在这里用的是Charsets.UTF_8,这在处理有不同编码的文件时特别有用。
文件操作简化
在Java的世界里,文件操作是个老生常谈的话题。传统的Java I/O操作,虽然功能强大,但代码写起来往往既长又复杂,但是,有了Guava,这一切都变得轻松多了。
读取文件
读取文件场景中,在Java原生方法里,可能需要创建FileReader,然后再包装成BufferedReader,最后一行一行地读。但在Guava中,只需要几行代码,就能搞定。
看这个例子:
// 使用Guava读取文件
File file = new File("example.txt");
List<String> lines = Files.asCharSource(file, Charsets.UTF_8).readLines();
for (String line : lines) {System.out.println(line);
}
在这段代码里,Files.asCharSource方法创建了一个字符源(CharSource),这样就可以直接读取文件中的内容了。再也不用担心FileNotFoundException和IOException这些让人头疼的异常了,Guava都处理好了一切。
写入文件
在传统的Java I/O中,写文件也是一大堆代码,需要处理流的打开和关闭,还得小心处理异常。但在Guava中,这也变得超级简单:
// 使用Guava写入文件
List<String> content = Arrays.asList("Line 1", "Line 2", "Line 3");
File file = new File("example-write.txt");
Files.asCharSink(file, Charsets.UTF_8).writeLines(content);
在这里,Files.asCharSink创建了一个字符汇(CharSink),它能轻松写入数据到文件中。这些代码不仅简洁,而且易于理解和维护。
复制和移动文件
但Guava的魔法不止于此。想要复制或者移动文件?也是分分钟的事情。看看这个:
// 复制文件
File original = new File("source.txt");
File copy = new File("destination.txt");
Files.copy(original, copy);
// 移动文件
File toMove = new File("toMove.txt");
File destination = new File("moved.txt");
Files.move(toMove, destination);
流处理与转换
在Java中,流(Streams)是处理数据的核心,不论是文件I/O还是网络通信,流都扮演着至关重要的角色。但有时候,处理Java原生的InputStream和OutputStream会让人觉得有点小复杂。幸好,Guava在这方面提供了非常便捷的工具,让流处理变得既简单又高效。
简化的流读取
在传统的Java I/O中,从InputStream读取数据通常需要创建一个buffer,然后一点点读取。但用Guava,整个过程就变得异常简单:
// 使用Guava从InputStream读取字符串
InputStream input = new FileInputStream("example.txt");
String text = CharStreams.toString(new InputStreamReader(input, Charsets.UTF_8));
input.close();
在这里,CharStreams.toString方法直接将整个InputStream转换为字符串。再也不需要手动创建buffer和循环读取了,一行代码就搞定。
流的转换和处理
有时候,需要对流中的数据进行某种形式的处理或转换。Guava在这方面也提供了很大的帮助。看看这个例子:
// 使用Guava对InputStream进行转换
InputStream input = new FileInputStream("example.txt");
FluentIterable<String> lines = CharStreams.readLines(new InputStreamReader(input, Charsets.UTF_8)).transform(line -> line.toUpperCase()); // 将每一行都转换为大写
input.close();
在这个例子中,CharStreams.readLines方法读取了所有行,并且通过transform方法对每一行进行了转换,这里是将其转换为大写。Guava的流式处理风格让这种转换变得非常优雅。
高效的流拷贝
在Java中,从一个流拷贝数据到另一个流通常需要手动创建buffer,并循环进行读写。但在Guava中,这也变得简单多了:
// 使用Guava进行流拷贝
InputStream input = new FileInputStream("source.txt");
OutputStream output = new FileOutputStream("dest.txt");
ByteStreams.copy(input, output); // 将数据从input流拷贝到output流
input.close();
output.close();
在这个例子中,ByteStreams.copy方法就直接完成了从一个流到另一个流的数据拷贝。Guava把复杂的操作隐藏在了简洁的API背后,大大降低了编码的复杂性。
字符集与编码处理
在Java世界里,字符集和编码经常会让人头疼,特别是当处理不同来源的数据时,比如从不同的文件或网络。字符编码问题能让一个简单的任务变得异常复杂。
字符编码的挑战
在Java中,处理不同编码的文本,尤其是在I/O操作中,经常会遇到UnsupportedEncodingException。这是因为不同的系统和文本文件可能使用不同的字符编码。比如,Windows可能默认使用CP1252,而Linux可能使用UTF-8。如果不正确处理这些编码,就会导致乱码或者错误。
Guava的Charsets
Guava提供了一套字符集(Charsets)工具,让处理这些问题变得简单。Guava定义了所有标准的Java字符集,这样咱们就不必手动处理那些繁琐的字符串了。比如,当需要转换字节数据到字符串,或者相反的操作时,Guava的Charsets就派上用场了。
看看下面这个例子:
// 使用Guava的Charsets处理字符串
String example = "这是一个测试字符串";
byte[] bytes = example.getBytes(Charsets.UTF_8); // 将字符串转换为UTF-8编码的字节
String decoded = new String(bytes, Charsets.UTF_8); // 再将字节解码回字符串
System.out.println(decoded);
在这段代码里,使用Charsets.UTF_8来确保字符串正确地被编码和解码。Guava的Charsets处理起来既简单又不易出错。
更多字符处理工具
除了Charsets,Guava还提供了更多字符处理工具。比如,有时咱们需要对字符串中的特定字符进行操作,Guava的CharMatcher类就是专门为此设计的。
来看个例子,假设咱们要从字符串中移除所有数字:
// 使用Guava的CharMatcher移除字符串中的数字
String input = "abc123xyz456";
String result = CharMatcher.inRange('0', '9').removeFrom(input);
System.out.println(result); // 输出结果: "abcxyz"
在这个例子中,CharMatcher.inRange(‘0’, ‘9’)创建了一个匹配所有数字的匹配器,然后removeFrom方法就将这些数字从字符串中移除了。这样的处理不仅代码量少,而且逻辑清晰易懂。
源(Source)和汇(Sink)模式
在处理文件和流的时候,常常需要读数据(Source)和写数据(Sink)。Guava在这方面提供了一套非常优雅的解决方案,让这些操作变得既简单又直观。
在Guava中,Source代表一个数据的来源,可以是文件、URL或者任何其他数据源。而Sink则是数据的目的地,比如文件或者某个输出流。这种抽象的好处是,无论数据来源或去向如何变化,操作逻辑都保持一致。
文件的Source和Sink
先来看看文件操作。在传统的Java I/O中,需要创建FileInputStream或FileOutputStream,然后进行读写操作。但用Guava的Source和Sink,整个过程变得更加清晰。
看这个读文件的例子:
// 使用Guava的FileSource读取文件
File file = new File("example.txt");
CharSource charSource = Files.asCharSource(file, Charsets.UTF_8);
String content = charSource.read();
System.out.println(content);
在这段代码中,Files.asCharSource创建了一个CharSource实例,它代表了文件中的字符数据。charSource.read()方法就能读取整个文件的内容。这样的代码不仅简洁,而且非常容易理解。
再来看看写文件的操作:
// 使用Guava的FileSink写入文件
List<String> lines = Arrays.asList("第一行", "第二行", "第三行");
File file = new File("example-write.txt");
CharSink charSink = Files.asCharSink(file, Charsets.UTF_8);
charSink.writeLines(lines);
这里Files.asCharSink创建了一个CharSink实例,它代表文件的写入点。charSink.writeLines方法可以轻松地将一个字符串列表写入文件。
URL的Source
除了文件,Source和Sink还可以用于其他类型的数据源。比如,可以从一个URL读取数据:
// 使用Guava的URLSource读取数据
URL url = new URL("http://example.com");
ByteSource byteSource = Resources.asByteSource(url);
byte[] data = byteSource.read();
System.out.println(new String(data, Charsets.UTF_8));
在这个例子中,Resources.asByteSource创建了一个表示URL数据的ByteSource。然后就可以使用byteSource.read()来读取数据,非常方便。
异常处理与资源管理
在Java编程中,正确处理异常和资源是非常重要的,尤其是在进行I/O操作或者处理外部资源时。如果处理不当,很容易造成资源泄露或程序崩溃。Guava在这方面提供了一些非常棒的工具,帮助咱们写出更安全、更可靠的代码。
快速失败:Preconditions
在开始处理数据之前,检查输入是非常重要的。Guava提供了Preconditions类,帮助咱们快速校验条件,并在条件不满足时立即失败。这种“快速失败”机制有助于尽早发现问题,避免更深层次的错误。
看看这个例子:
// 使用Guava的Preconditions进行参数校验
public void processData(String data) {Preconditions.checkNotNull(data, "data不能为null");// 处理数据
}
这段代码中,Preconditions.checkNotNull方法确保传入的data不是null。如果是null,它会抛出一个NullPointerException,并附带自定义的错误消息。这样的校验既直观又有效,有助于提高代码的健壮性。
资源管理:Closeables和FluentIterable
在Java中,正确管理资源,特别是那些需要关闭的资源,如流或连接,是非常重要的。Guava的Closeables类提供了便捷的方法来关闭这些资源,而不必担心IOException。
// 使用Guava的Closeables安全关闭资源
InputStream in = null;
try {in = new FileInputStream("example.txt");// 使用流
} catch (IOException e) {// 异常处理
} finally {Closeables.closeQuietly(in); // 安静地关闭流,忽略IOException
}
在这个例子中,无论在使用流的过程中是否发生异常,Closeables.closeQuietly都会在finally块中安全地关闭流。这样的处理方式不仅简洁,而且可以避免因忘记关闭资源而导致的问题。
Guava的FluentIterable也是资源管理的好帮手。它提供了一种链式的方法来处理集合,使得操作集合变得既简洁又优雅。
// 使用Guava的FluentIterable优雅地处理集合
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
List<String> filtered = FluentIterable.from(names).filter(name -> name.startsWith("A")).toList();
在这段代码中,FluentIterable.from创建了一个可迭代的集合视图,filter方法用于过滤,最后toList将结果转换为List。这样的链式调用,不仅代码可读性高,而且易于维护。
Guava与Java NIO的结合
Guava和Java NIO(非阻塞I/O)的结合。对于那些需要处理大量数据,或者对性能要求较高的应用来说,Java的NIO库是个非常强大的工具。但是,NIO的API有时候会显得有点复杂。这时候,Guava又一次展示了它的魔力,帮助我们更简单、更优雅地使用NIO。
Guava对NIO的增强
Guava对Java NIO做了一些增强,让它的使用变得更加友好。Guava提供了类似于ByteSource和ByteSink这样的抽象,使得使用NIO进行文件操作或网络操作更加直观。
来看看这个读取文件内容的例子:
// 使用Guava的ByteSource读取文件内容
File file = new File("example.txt");
ByteSource byteSource = Files.asByteSource(file);
byte[] readBytes = byteSource.read();
System.out.println(new String(readBytes, Charsets.UTF_8));
在这个例子中,Files.asByteSource方法创建了一个ByteSource实例,它代表文件中的字节数据。然后,可以使用byteSource.read()方法读取这些数据。这种方式比直接使用Java NIO的Channel和Buffer要简单得多。
NIO与流的转换
另一个强大的功能是Guava提供的NIO和流之间的转换。在某些情况下,可能需要在NIO的Channel和Java的InputStream/OutputStream之间进行转换。Guava在这方面提供了便利的工具。
// 使用Guava将InputStream转换为ReadableByteChannel
InputStream inputStream = new FileInputStream("example.txt");
ReadableByteChannel channel = Channels.newChannel(inputStream);
// 使用channel进行操作
在这个例子中,Channels.newChannel方法将一个InputStream转换为一个ReadableByteChannel。这样的转换让我们能够在需要使用NIO时,更加灵活地处理流。
相关文章:
Java文件流操作 - 【Guava】IO工具
引言 Guava 使用术语 流来表示可关闭的,并且在底层资源中有位置状态的 I/O 数据流。字节流对应的工具类为 ByteSterams,字符流对应的工具类为 CharStreams。 Guava 中为了避免和流直接打交道,抽象出可读的 源 source 和可写的 汇 sink 两个概…...
C语言中单链表操作:查找节点与删除节点
一. 简介 前面学习了C语言中创建链表节点,向链表中插入节点等操作,文章如下: C语言中单向链表:创建节点与插入新节点-CSDN博客 本文继续学习c语言中对链表的其他操作,例如在链表中查找某个节点,删除链表…...
mapbox基础,加载栅格图片到地图
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️raster 栅格图层 api二、🍀使用本地载…...
Linux红帽:RHCSA认证知识讲解(十 二)调试 SELinux,如何管理 SELinux 的运行模式、安全策略、端口和上下文策略
Linux红帽:RHCSA认证知识讲解(十 二)调试 SELinux,如何管理 SELinux 的运行模式、安全策略、端口和上下文策略 前言一、SELinux 简介二、SELinux 的运行模式2.1 查看和切换 SELinux 模式 三、SELinux 预设安全策略的开关控制四、管…...
模糊斜率熵Fuzzy Slope entropy+状态分类识别!2024年11月新作登上IEEE Trans顶刊
引言 2024年11月,研究者在测量领域国际顶级期刊《IEEE Transactions on Instrumentation and Measurement》(IF 5.6,JCR 1区,中科院二区)上发表科学研究成果,以“Optimized Fuzzy Slope Entropy: A Comple…...
【MATLAB】将数据保存在mat文件中 save/load/matfile
MAT文件为MATLAB格式的二进制文件 save()函数 save - 将工作区变量保存到文件中 save(filename) 将当前工作区中的所有变量保存在 MATLAB 格式的二进制文件(MAT 文件)filename 中。如果 filename 已存在,save 会覆盖该文件。 save(filena…...
009_抽象类和接口
抽象类和接口 final关键字常量 单例模式(设计模式)枚举类抽象类抽象类的注意事项、特点使用抽象类的好处模版方法设计模式 接口接口的好处接口的注意事项 final关键字 final关键字是最终的意思,可以修饰类、方法、变量。 修饰类:…...
【数据结构】排序算法(下篇·开端)·深剖数据难点
前引:前面我们通过层层学习,也就了解了Hoare大佬的排序思想,今天我们学习的东西可能稍微有点难度,因此我们必须学会思想,我很受感慨,因此借此分享一下:【用1520分钟去调试】,如果我们…...
Elixir语言的计算机视觉
Elixir语言在计算机视觉中的应用 引言 计算机视觉作为一门交叉学科,近年来随着深度学习技术的发展而蓬勃发展。传统上,计算机视觉应用通常采用Python、C等语言进行开发,因为这些语言拥有强大的图像处理库和深度学习框架。然而,随…...
VTK知识学习(51)- 交互与Widget(二)
1、交互器样式 前面所讲的观察者/命令模式是 VTK实现交互的方式之一。在前面示例 所示的窗口中可以使用鼠标与柱体进行交互,比如用鼠标滚轮可以对柱体放大、缩小;按下鼠标左键不放,然后移动鼠标,可以转动柱体;按下鼠标左键,同时按…...
目标跟踪Deepsort算法学习2025.4.7
一.DeepSORT概述 1.1 算法定义 DeepSORT(Deep Learning and Sorting)是一种先进的多目标跟踪算法,它结合了深度学习和传统的目标跟踪技术,在复杂环境下实现了高精度和鲁棒性的目标跟踪。该算法的核心思想是通过融合目标的外观特征和运动特征,实现对多个目标的持续跟踪,…...
nacos集群启动问题
根据您的描述,Nacos集群只能启动两个节点,可能的原因和解决方法如下: 1. 集群配置问题 • 原因:cluster.conf文件中可能只配置了两个节点的地址,导致第三个节点无法加入集群。 • 解决方法: • 检查每个…...
八大排序——c++版
本次排序都是按照升序排的 冒泡排序 void bubbleSort(vector<int>& nums) {int nnums.size();for(int i0;i<n-1;i){bool swappedfalse;for(int j0;j<n-1-i;j){if(nums[j]>nums[j1]){swap(nums[j],nums[j1]);swappedtrue;}}if(!swapped)break;} } //算法原…...
关于Spring MVC中传递数组参数的详细说明,包括如何通过逗号分隔的字符串自动转换为数组,以及具体的代码示例和总结表格
以下是关于Spring MVC中传递数组参数的详细说明,包括如何通过逗号分隔的字符串自动转换为数组,以及具体的代码示例和总结表格: 1. 核心机制 Spring MVC支持直接通过逗号分隔的字符串将请求参数自动转换为数组(String[]、int[]等&…...
VBA之Word应用:利用Range方法进行字体及对齐方式设置
《VBA之Word应用》(版权10178982),是我推出第八套教程,教程是专门讲解VBA在Word中的应用,围绕“面向对象编程”讲解,首先让大家认识Word中VBA的对象,以及对象的属性、方法,然后通过实…...
区块链技术:重塑供应链管理的未来
在当今全球化的商业环境中,供应链管理的复杂性和重要性日益凸显。从原材料采购到产品交付,供应链的每一个环节都可能影响企业的运营效率和客户满意度。随着区块链技术的兴起,供应链管理迎来了新的变革机遇。本文将深入探讨区块链技术在供应链…...
请回答集成测试和系统测试的区别,以及它们的应用场景主要是什么?
导语: 深夜收到粉丝私信:"面了5家大厂,4家都问集成测试和系统测试的区别,求大佬支招!" 作为经历过200+项目实战的测试老司机,今天用4个真实项目案例+3张原理图,带你彻底吃透这两个核心测试阶段!(文末送测试用例模板) 一、灵魂三问:到底测什么? 1.1 集成…...
SVT-AV1学习-svt_aom_get_sg_filter_level,svt_av1_selfguided_restoration_c
SVT-AV1学习-svt_aom_get_sg_filter_level,svt_av1_selfguided_restoration_c 一 函数的作用 根据编码模式,输入分辨率和快速解码标志动态计算自引导恢复(Self Guide Restoration)过滤器的启动级别,以下是详细解析; 1 参数说明 EncMode enc_m…...
第七章总结:集合
一、集合简介 Scala集合分为三大类:序列(Seq)、集(Set)、映射(Map),所有集合都扩展自Iterable特质。集合分为可变集合和不可变集合: 不可变集合:scala.collec…...
玄机靶场:apache日志分析
什么是Apache日志 Apache日志是Apache Web服务器在处理HTTP请求时记录的所有事件的详细信息。Apache是全球最受欢迎的Web服务器软件之一,支持约30.2%的所有活跃网站。Apache通过记录每次请求的信息,包括时间、来源IP、请求的资源等,帮助分…...
Laravel 使用 事件和监听器实现 数据状态变更
首先知道事件是什么 1.事件的概念 事件(Event)是 Laravel 中实现观察者模式的一种机制,它允许应用程序中的不同部分进行松耦合的通信。 通俗一点就是,发生在应用程序中的动作或者事情。例如: 用户注册成功后,需要发邮件&#…...
uniapp App页面通过 web-view 调用网页内方法
先是报这个错 A parser-blocking, cross site (i.e. different eTLD1) script, https://api.map.baidu.com/getscript?v3.0&akpgJsRF87Fjia&services&t20250225111334, is invoked via document.write. The network request for this script MAY be blocked by t…...
Daz3D角色UE5材质优化
解决Daz3D人物角色导入UE5后材质不真实的问题 1. 引言:跨平台3D资产传输中的材质保真度挑战 在当今的数字内容创作领域,对高质量3D人物角色的需求日益增长,广泛应用于游戏开发、电影制作、虚拟现实等多种应用场景。Daz3D因其丰富的人物模型…...
Android studio
问题:没有界面可以操作,页面没有hello wolrd 原因:gradle没同步完,依赖项没有下载完整,所以布局预览看不了...
Playwright快照测试:如何让UI回归测试变得轻松高效
引言 使用带有模拟数据的PlaywrightP快照可以显著提高UI回归测试的速度。它能够快速自动化检查三大主流浏览器(Chromium、Firefox、Webkit)中的 UI 元素。你可以将多个断言绑定到一个快照上,这极大地提高了 UI 测试的效率。在 GUI 应用快速扩…...
控制理论-传递函数
【硬核】终于有人把传递函数和卷积定理讲明白了!自动控制原理入门-传递函数 | 卷积定理 | 频率响应 | 喵星考拉...
虚拟世界的AI魔法:AIGC引领元宇宙创作革命
云边有个稻草人-CSDN博客——个人主页 热门文章_云边有个稻草人的博客-CSDN博客——本篇文章所属专栏 ~ 欢迎订阅~ 目录 1. 引言 2. 元宇宙与虚拟世界概述 2.1 什么是元宇宙? 2.2 虚拟世界的构建 3. AIGC在元宇宙中的应用 3.1 AIGC生成虚拟世界环境 3.2 AIGC…...
带QT界面的文件管理系统
下载地址 下载&完整介绍地址:https://www.mcso.top/course-design/qt-filesystem/ 开源地址:https://github.com/mcdudu233/FileSystem.git 软件包含 (1)设计数据的结构 (2)设计文件管理系统 &…...
【区块链安全 | 第二十六篇】表达式与控制结构(二)
文章目录 表达式与控制结构赋值结构化赋值与返回多个值数组和结构体的赋值复杂性作用域和声明检查或不检查的算术运算错误处理:Assert、Require、Revert 和异常通过 assert 进行 Panic 和通过 require 进行 Errorreverttry/catch表达式与控制结构 赋值 结构化赋值与返回多个…...
2025年前端框架全景解析:React、Vue、Angular的生态与未来之争
一、市场格局:全球与国内的双重差异12 全球市场React:凭借Facebook的支持和庞大的社区,全球使用率超40%,尤其在数据密集型应用(如金融、社交平台)中占据主导。其跨平台能力(React Native)和灵活生态(Next.js、Redux)是核心竞争力。Vue:亚洲市场占比显著,中国开发者…...
【VScode】C/C++使用教程
编辑器 1. VScode本质上是一款代码编辑器,上面包含了许多插件。 VScode下载 1. 下载链接:Download Visual Studio Code - Mac, Linux, Windowshttps://code.visualstudio.com/download2. 在拓展部分下载汉化包:Chinese。 编译器 1. 我们使用M…...
【Node】如何使用PM2高效部署nodejs前端应用
引言 Node.js 这个服务端 JavaScript 运行时,能帮你打造高性能的实时 Web 和移动应用。不过相比传统的 Apache 或 Nginx 这类 Web 服务器,Node 应用的管理可要多花点心思。 PM2 就是专为生产环境设计的 Node 应用进程管理系统。这篇指南将手把手教你安…...
从零开始的图论讲解(1)——图的概念,图的存储,图的遍历与图的拓扑排序
目录 前言 图的概念 1. 顶点和边 2. 图的分类 3. 图的基本性质 图的存储 邻接矩阵存图 邻接表存图 图的基本遍历 拓扑排序 拓扑排序是如何写的呢? 1. 统计每个节点的入度 2. 构建邻接表 3. 将所有入度为 0 的节点加入队列 4. 不断弹出队头节点,更新其…...
无人机双频技术及底层应用分析!
一、双频技术的核心要点 1. 频段特性互补 2.4GHz:穿透力强、传输距离远(可达5公里以上),适合复杂环境(如城市、建筑物密集区),但易受Wi-Fi、蓝牙等设备的干扰。 5.8GHz:带宽更…...
基础知识补充篇:认识区块链浏览器
专栏:区块链入门到放弃查看目录-CSDN博客文章浏览阅读218次。为了方便查看将本专栏的所有内容列出目录,按照顺序查看即可。https://blog.csdn.net/qq_22502303/article/details/147022618?spm=1001.2014.3001.5501 前言 在《基础知识补充篇:什么是区块链RPC节点》文中笔者…...
git rebase复杂场景验证
经常面临复杂的分支管理,这里对几种场景的行为做一些验证。 结论总结 git rebase br_name:等价与新建br_name分支,然后找到当前分支与br_name分支的分叉点。然后把分叉点以后的提交(当前分支)一个一个的cherry-pick过…...
安宝特应用 | 工业AR技术赋能高端制造领域验收流程数字化转型
引言 随着高端制造行业对效率与安全要求的不断提升,传统验收模式正迎来智能化升级。针对特殊行业产品验收过程中存在的跨区域协作难、人工核验效率低等痛点,基于AR增强现实技术的智能验收方案正在成为转型新方向。 01 可视化协同提升验收效能 安宝特AR…...
Spring启示录、概述、入门程序以及Spring对IoC的实现
一、Spring启示录 阅读以下代码: dao package org.example1.dao;/*** 持久层* className UserDao* since 1.0**/ public interface UserDao {/*** 根据id删除用户信息*/void deleteById(); } package org.example1.dao.impl;import org.example1.dao.UserDao;/**…...
Oracle 23ai Vector Search 系列之4 VECTOR数据类型和基本操作
文章目录 Oracle 23ai Vector Search 系列之4 VECTOR数据类型和基本操作VECTOR 数据类型基本语法Vector 维度限制和向量大小向量存储格式(DENSE vs SPARSE)1. DENSE存储2. SPARSE存储3. 内部存储与空间计算 Oracle VECTOR数据类型的声明格式VECTOR基本操…...
如何用开源工具,把“定制动漫面具”做成柔性制造?
原文链接:https://www.nocobase.com/cn/blog/kigland。 引言 在苏州,有一支团队正在悄悄改变个性化制造的方式。他们不做快消品,也不靠规模取胜,却在全球角色扮演爱好者圈子里收获了不少“忠粉”。 他们叫 KIGLAND,一…...
《命理学》专项探究与研习
基础论调 八字是什么 八字:用天干地支表示一个人的出生时间 例如: 如上图:某人的干支历出生时间:甲申年--己巳月--戊戌日--癸丑时 十天干 甲乙丙丁戊己庚辛壬癸 奇数位为阳,偶数位为阴 十二地支 子丑寅卯辰巳午未申酉…...
Linux 指令初探:开启终端世界的大门
前言 当我们初次接触 Linux,往往会被一串串在黑底屏幕中跳动的字符震撼甚至吓退。然而,正是这些看似晦涩的命令,构建了服务器、嵌入式系统乃至云计算的世界。 本篇将带你从最基础的 Linux 指令开始,逐步揭开命令行的神秘面纱。从…...
CentOS 7 yum 无法安装软件的解决方法
一、解决方法 1、备份原有的 CentOS 7 默认 YUM 源配置文件 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup2、从阿里云镜像源下载 CentOS 7 的 YUM 源配置文件,并覆盖原有的配置文件 wget -O /etc/yum.repos.d/CentOS-Base.re…...
oracle 游标的管理
8.2.1游标的概念和类型 游标(CURSOR)存储于服务器端,当服务器执行了一个查询后,查询返回的记录集存放在光标中,通过光标上的操作可以把这些记录检索到客户端的应用程序。光标是一种变量,它对应于一个查询语句确定的结果集。它用于…...
深入理解PCA降维:原理、实现与应用
1. 引言 在机器学习与数据科学领域,我们经常会遇到高维数据带来的"维度灾难"问题。随着特征数量的增加,数据稀疏性、计算复杂度等问题会显著加剧。主成分分析(PCA, Principal Component Analysis)作为一种经典的降维技术,能够有效解…...
AI重构农业:从“面朝黄土“到“数字原野“的产业跃迁—读中共中央 国务院印发《加快建设农业强国规划(2024-2035年)》
在东北黑土地的万亩良田上,无人机编队正在执行精准施肥作业;在山东寿光的智慧大棚里,传感器网络实时调控着番茄生长的微环境;在云南的咖啡种植园中,区块链溯源系统记录着每粒咖啡豆的旅程。这场静默的农业革命…...
当前主流的LLM Agent架构、能力、生态和挑战
一、LLM Agent的基本架构 尽管LLM Agent的具体实现五花八门,但大部分系统在架构层面上可以归纳为以下几个关键模块: 感知(Perception) Agent需要感知外界的信息。对于文本环境,感知往往是读取输入(如用户指…...
网站缓存怎么检查是否生效?
为何选择CDN缓存技术? 部署内容缓存系统可有效提升网页响应效率,降低服务器资源占用与流量消耗,改善访客交互体验,强化系统架构容错能力,促进搜索引擎优化效果,达成资源分配与运行效能的动态平衡。 科学配…...
Qt的稳定版本与下载
Qt的稳定版本主要包括Qt5和Qt6的长期支持(LTS)版本。以下是详细的版本信息: Qt5的稳定版本 Qt5.6 LTS:2016年3月15日发布,是一个长期支持版本。 Qt5.9 LTS:2017年6月16日发布,也…...
用 OpenCV 给图像 “挑挑拣拣”,找出关键信息!
目录 一、背景 二、OpenCV 关键词提取基础概念 什么是关键词提取 OpenCV 在关键词提取中的作用 三、OpenCV 关键词提取的流程 整体流程概述 详细步骤及作用 流程图 四、OpenCV 关键词提取的代码实现 环境准备 代码演示 代码说明 五、常见问题及解决方法 特征提取不…...