Java 7新特性深度解析:提升效率与功能
文章目录
- Java 7新特性深度解析:提升效率与功能
- 一、Switch中添加对String类型的支持
- 二、数字字面量的改进
- 三、异常处理(捕获多个异常)
- 四、增强泛型推断
- 五、NIO2.0(AIO)新IO的支持
- 六、SR292与InvokeDynamic
- 七、Path接口
- 八、fork/join计算框架
Java 7新特性深度解析:提升效率与功能
一、Switch中添加对String类型的支持
Switch语句可以使用原始类型或枚举类型。
Java引入了另一种类型,可以在switch语句中使用:字符串类型。
public class switchAddString {public static void main(String[] args) {String s = "a";switch (s) {case "a":System.out.println("a");break; case "b":System.out.println("b");break;default:System.out.println("default");}}
}
编译器在编译时的处理情形
- 仅有一个
case
和default
,则直接转换为if…else…
。 - 有多个
case
。先将String转换为hashCode
,然后相应的进行处理。
二、数字字面量的改进
- 数字中可加入分隔符:
- Java7中支持在数字量中间添加’_’作为分隔符。
- 下划线仅仅能在数字中间。
- 编译时编译器自己主动删除数字中的下划线。
- Java7添加二进制表示。
public static void main(String[] args) {int i = 10;System.out.println("i=" + i);// 二进制int j = 0b1010;// 十六进制int k = 0x1234;// 1,000,000int l = 1_000_000;// 1,000,000int m = 1__000_000;System.out.println("j=" + j);System.out.println("k=" + k);System.out.println("l=" + l);System.out.println("m=" + m);}
三、异常处理(捕获多个异常)
- catch子句能够同一时候捕获多个异常:
- 使用’|'切割,多个类型,一个对象e 。
- try-with-resources语句:
- Java7之前须要在
finally
中关闭socket
、文件、数据库连接等资源。 - Java7引入
try-with-resources
,用于确保资源在使用后能够正确地关闭。 - 在使用
try-with-resources
时,你可以在 try 关键字后面的括号中声明一个或多个资源。 - 这些资源必须实现
AutoCloseable
接口(Java 7引入的接口,它具有一个close()
方法用于释放资源)。
- Java7之前须要在
public static void main(String[] args) {// 捕获多个异常try {int a = 10;int b = 0;System.out.println("a/b=" + (a / b));} catch (ArithmeticException | NullPointerException e) {e.printStackTrace();}// try-with-resources,在 try 关键字后面的括号中声明一个或多个资源,每个资源用逗号分隔String fileName = "example.txt";try (// 使用try-with-resources声明BufferedReader资源BufferedReader reader = new BufferedReader(new FileReader(fileName));// 需要声明多个资源,我们只需在括号中用逗号分隔BufferedReader reader1 = new BufferedReader(new FileReader("file1.txt"));BufferedReader reader2 = new BufferedReader(new FileReader("file2.txt"))) {// 读取文件内容String line;while ((line = reader.readLine()) != null) {System.out.println(line);}// 这里不需要显式调用reader.close(),因为try-with-resources会自动处理} catch (IOException e) {// 处理可能发生的IOExceptione.printStackTrace();}// 在try代码块执行完毕后,reader会被自动关闭}
四、增强泛型推断
- 菱形操作符:
- 在实例化泛型类时,可以使用菱形操作符
<>
来省略类型参数。 - 编译器会根据上下文推断类型参数。
- 简化代码,减少冗余,提高代码的可读性。
- 在实例化泛型类时,可以使用菱形操作符
- 泛型实例化类型推断:
- 当泛型类的构造函数的参数包含泛型类型时,Java 7 能够推断泛型的类型。
- 这允许你在实例化泛型类时省略类型参数,只在构造函数参数中指定类型即可。
public static void main(String[] args) {// Java7之前ArrayList<String> arrayList = new ArrayList<String>();// Java7之后ArrayList<String> arrayList2 = new ArrayList<>();// 泛型类class Generic<T> {// 构造函数参数为泛型类型public Generic(T t) {}}// 使用泛型实例化类型推断Generic<String> generic = new Generic<>("abc");}
五、NIO2.0(AIO)新IO的支持
Java 7 引入了 NIO 2.0(New I/O),其中包含对异步 I/O(AIO)的支持,这是一个显著的新特性,特别是在处理非阻塞 I/O 操作时非常有用。具体来说,NIO 2.0 的 AIO 支持通过引入
AsynchronousFileChannel
类来实现异步文件 I/O 操作。
- AsynchronousFileChannel 类:
- 允许进行异步文件读取和写入操作。
- 相比于传统的阻塞 I/O,异步 I/O 可以在读写数据的同时执行其他操作,从而提高系统的效率和性能。
public static void main(String[] args) throws Exception {// 异步读取文件Path path = Paths.get("file.txt");AsynchronousFileChannel fileChannel = AsynchronousFileChannel.open(path, StandardOpenOption.READ);// 分配缓冲区ByteBuffer buffer = ByteBuffer.allocate(1024);// 读取文件long position = 0;// 异步读取数据,用于检查读取操作的状态和获取读取的结果Future<Integer> operation = fileChannel.read(buffer, position);while (!operation.isDone()) {// 等待读取完成Thread.sleep(1000);}// 读取完成,将缓冲区数据翻转buffer.flip();// 读取数据byte[] data = new byte[buffer.limit()];// 将缓冲区数据复制到data中buffer.get(data);System.out.println(new String(data));// 关闭文件fileChannel.close();}
- AsynchronousServerSocketChannel 和 AsynchronousSocketChannel:
- 用于支持异步的网络编程。
- 这些类允许你创建异步服务器端和客户端,并进行异步的网络数据读取和写入操作。
- 在高并发环境下处理 I/O 操作变得更为高效和灵活。
public static void main(String[] args) throws Exception {// 创建异步通道AsynchronousServerSocketChannel serverChannel =AsynchronousServerSocketChannel.open().bind(new InetSocketAddress(8080));// 接受连接serverChannel.accept(null, new CompletionHandler<AsynchronousSocketChannel, Void>() {/*** 接受连接完成时调用此方法。* @param clientChannel* @param attachment*/@Overridepublic void completed(AsynchronousSocketChannel clientChannel, Void attachment) {// 继续接受连接serverChannel.accept(null, this);// 读取数据ByteBuffer buffer = ByteBuffer.allocate(1024);// 异步读取数据clientChannel.read(buffer, buffer, new CompletionHandler<Integer, ByteBuffer>() {/*** 当读取操作完成时调用此方法。** @param result 读取操作的结果,通常为读取的字节数,但在此处未使用* @param attachment 包含读取数据的ByteBuffer对象*/@Overridepublic void completed(Integer result, ByteBuffer attachment) {// 处理读取完成attachment.flip();// 读取数据byte[] data = new byte[attachment.limit()];// 将数据复制到数组中attachment.get(data);System.out.println(new String(data));}/*** 读取操作失败时调用此方法。* @param exc* @param attachment*/@Overridepublic void failed(Throwable exc, ByteBuffer attachment) {// 处理读取失败}});}/*** 接受连接失败时调用此方法。* @param exc* @param attachment*/@Overridepublic void failed(Throwable exc, Void attachment) {// 处理接受连接失败}});// 程序继续执行其他操作Thread.sleep(Long.MAX_VALUE);}
六、SR292与InvokeDynamic
- SR-292(Small Ranges):
SR-292
是 Java 7 中引入的一个改进,主要针对switch
语句的性能优化。- 在早期的 Java 版本中,
switch
语句的效率问题在于它通过逐个比较每个case
条件来确定执行的分支,如果分支很多,这个过程可能会很慢。 - SR-292 引入了一种优化,即当
switch
语句的case
常量之间的距离非常小(称为 “small ranges
”),Java 编译器会使用一种更有效的查找方式,而不是简单的逐个比较。 - 这种方式可以显著提高
switch
语句的执行速度,特别是在处理密集的条件分支时。
public static void main(String[] args) {int month = 3;String monthName;// Java 7 的 SR-292 特性可以在一些情况下优化这样的 switch 语句,尤其是在 case 常量的范围较小时switch (month) {case 1:monthName = "January";break;case 2:monthName = "February";break;case 3:monthName = "March";break;case 4:monthName = "April";break;case 5:monthName = "May";break;case 6:monthName = "June";break;default:monthName = "Unknown";break;}System.out.println("Month: " + monthName);}
- InvokeDynamic(动态方法调用):
InvokeDynamic
是Java 7
引入的另一个重要特性,它是 Java 虚拟机(JVM
)层面的改进,旨在支持更灵活和高效的动态语言实现。- 允许 Java 代码中的方法调用在运行时动态解析,并且可以绑定到相应的方法实现。
- 用来优化字节码生成和方法调用的性能。
Java 8
的Lambda
表达式依赖于InvokeDynamic
来生成相应的字节码。
public static void main(String[] args) throws Throwable {// 创建动态调用MethodHandles.Lookup lookup = MethodHandles.lookup();// 创建方法句柄,使用lookup对象来查找Math.class中的静态方法sqrt,该方法接受一个double参数并返回一个dou* 第一个参数是`lookup`对象。MethodHandle mh = lookup.findStatic(Math.class, "sqrt",MethodType.methodType(double.class, double.class));// 创建动态调用// 第一个参数是`lookup`对象// 第二个参数是方法名,这里使用`"apply"`,因为它是`Function`接口中唯一的方法。// 第三个参数是`Function`接口的签名(即`Function.class`的类型)。// 第四个参数是`mh`的泛型类型签名。// 第五个参数是我们要调用的方法句柄(即`mh`)。// 第六个参数是`mh`的类型签名,表示我们要调用的方法的实际类型。CallSite sqrt = LambdaMetafactory.metafactory(lookup, "apply",MethodType.methodType(Function.class),mh.type().generic(),mh,mh.type());// 调用动态调用MethodHandle factory = sqrt.getTarget();// 调用工厂方法,得到一个Function对象,使用了强制类型转换,因为factory.invoke()返回的是一个ObjectFunction<Double, Double> sqrtFunc = (Function<Double, Double>) factory.invoke();double result = sqrtFunc.apply(16.0);System.out.println("Square root of 16: " + result);}
七、Path接口
在 Java 7 之前,通常使用
java.io.File
类来处理文件路径,Java 7 引入了java.nio.file.Path
接口,它是 Java 中操作文件和目录路径的抽象表示。Path
接口提供了更多功能和更强大的操作能力。
Path
接口的一些主要特性和用法:
-
路径表示:
Path
接口可以表示文件系统中的路径,可以是文件或目录。它不仅仅是一个字符串,而是一个真正的对象,提供了丰富的方法来操作路径。
-
创建路径:
-
可以使用Paths 类的静态方法来创建 Path 对象
Path path = Paths.get("/path/to/file.txt");
-
-
路径操作:
- Path 接口提供了多种方法来获取路径的信息
toString()
:将路径转换为字符串表示。getFileName()
:获取路径中的文件名部分。getParent()
:获取路径中的父路径。getRoot()
:获取路径的根部分。getNameCount()
:获取路径中的名称元素的数量。subpath(int beginIndex, int endIndex)
:获取指定范围内的子路径。
- Path 接口提供了多种方法来获取路径的信息
-
路径解析:
resolve()
方法可以用于解析相对路径或者连接两个路径,返回一个新的路径对象。
-
检查路径属性:
- 可以使用
Files
类的静态方法来检查文件或目录的属性,例如是否存在、是否可读、是否可写等。
- 可以使用
-
文件操作:
Files
类结合Path
接口提供了丰富的文件操作功能,包括读取文件内容、写入文件、复制、移动、删除等。
-
路径迭代:
-
Path接口支持迭代,可以方便地遍历路径的各个部分。
for (Path element : path) {System.out.println(element); }
-
-
相对路径和绝对路径:
Path
接口可以表示相对路径和绝对路径,并提供了方法来转换和处理这两种路径。
public static void main(String[] args) {// 创建一个 Path 对象Path path = Paths.get("/path/to/file.txt");// 获取文件名Path fileName = path.getFileName();System.out.println("File Name: " + fileName);// 获取父路径Path parent = path.getParent();System.out.println("Parent Path: " + parent);// 获取路径的根部分Path root = path.getRoot();System.out.println("Root of the path: " + root);// 获取路径的元素数量int nameCount = path.getNameCount();System.out.println("Number of elements in the path: " + nameCount);// 遍历路径的每个元素System.out.println("Elements in the path:");for (int i = 0; i < nameCount; i++) {System.out.println("Element " + i + ": " + path.getName(i));}// 路径解析示例Path resolvedPath = path.resolve("subdir");System.out.println("Resolved Path: " + resolvedPath);// 检查文件或目录的属性// 判断文件是否存在boolean exists = Files.exists(path);System.out.println("Exists: " + exists);// 判断文件是否是目录boolean isReadable = Files.isReadable(path);System.out.println("Readable: " + isReadable);// 判断文件是否是可写boolean isWritable = Files.isWritable(path);System.out.println("Writable: " + isWritable);// 读取文件内容Path filePath = Paths.get("/path/to/file.txt");List<String> lines = null;try {lines = Files.readAllLines(filePath, StandardCharsets.UTF_8);} catch (IOException e) {throw new RuntimeException(e);}for (String line : lines) {System.out.println(line);}// 写入文件内容Path newFilePath = Paths.get("/path/to/newfile.txt");String content = "Hello, Java 7!";try {Files.write(newFilePath, content.getBytes());} catch (IOException e) {throw new RuntimeException(e);}// 复制文件Path copiedFilePath = Paths.get("/path/to/copiedfile.txt");try {Files.copy(filePath, copiedFilePath, StandardCopyOption.REPLACE_EXISTING);} catch (IOException e) {throw new RuntimeException(e);}// 移动文件Path targetPath = Paths.get("/path/to/targetdir/movedfile.txt");try {Files.move(filePath, targetPath, StandardCopyOption.REPLACE_EXISTING);} catch (IOException e) {throw new RuntimeException(e);}// 删除文件try {Files.delete(filePath);} catch (IOException e) {throw new RuntimeException(e);}}
八、fork/join计算框架
Java 7 引入了
Fork/Join
框架,是一种并行计算框架,专门用于解决分而治之的问题。主要用于执行递归式地将问题划分为更小子问题,并行执行这些子问题的计算,然后合并结果的任务。
使用 Fork/Join 框架的基本步骤:
- 定义任务类 (
RecursiveTask
或RecursiveAction
):RecursiveTask
: 用于有返回值的任务。RecursiveAction
: 用于无返回值的任务。
- 重写
compute()
方法:- 在任务类中,需要实现
compute()
方法来定义任务的具体执行逻辑。 - 通常会判断是否需要进一步拆分任务,执行子任务的计算,最终将子任务的结果合并或处理。
- 在任务类中,需要实现
- 创建 Fork/Join 池:
- 使用
ForkJoinPool
类来管理并发执行的任务。 - 通常可以通过
ForkJoinPool.commonPool()
方法来获取默认的线程池,也可以根据需要创建自定义的线程池。
- 使用
- 提交任务:
- 将任务提交给
ForkJoinPool
来执行。
- 将任务提交给
使用 Fork/Join
框架来计算数组的总和Demo:
import java.util.concurrent.*;// 继承 RecursiveTask 来实现有返回值的任务
class SumTask extends RecursiveTask<Long> {// 阈值,控制任务拆分的粒度private static final int THRESHOLD = 10;private int[] array;private int start;private int end;public SumTask(int[] array, int start, int end) {this.array = array;this.start = start;this.end = end;}@Overrideprotected Long compute() {if (end - start <= THRESHOLD) {// 如果任务足够小,直接计算结果long sum = 0;for (int i = start; i < end; i++) {sum += array[i];}return sum;} else {// 否则,拆分任务为更小的子任务int mid = (start + end) / 2;SumTask leftTask = new SumTask(array, start, mid);SumTask rightTask = new SumTask(array, mid, end);// 异步执行左边的子任务leftTask.fork();// 同步执行右边的子任务long rightResult = rightTask.compute(); // 获取左边子任务的结果long leftResult = leftTask.join(); // 合并子任务的结果return leftResult + rightResult;}}
}public class ForkJoinDemo {public static void main(String[] args) {int[] array = new int[100];for (int i = 0; i < array.length; i++) {array[i] = i;}// 创建 Fork/Join 线程池ForkJoinPool forkJoinPool = ForkJoinPool.commonPool();// 创建任务并提交给 Fork/Join 线程池SumTask task = new SumTask(array, 0, array.length);long result = forkJoinPool.invoke(task);// 输出计算结果System.out.println("Sum: " + result);}
}
如果你累了,学会休息,而不是放弃
相关文章:

Java 7新特性深度解析:提升效率与功能
文章目录 Java 7新特性深度解析:提升效率与功能一、Switch中添加对String类型的支持二、数字字面量的改进三、异常处理(捕获多个异常)四、增强泛型推断五、NIO2.0(AIO)新IO的支持六、SR292与InvokeDynamic七、Path接口…...

RHEL9找不到/var/log/dmesg日志文件问题
问题描述 在Rocky Linux 9 服务器上查看启动日志,发现没有/var/log/dmesg文件。 dmesg是什么? dmesg(diagnostic messages)用于打印kernel ring buffer的所有消息。 kernel会将开机信息存储在ring buffer中,如果开机时来不及查看启动信息&…...

是什么让以太坊从众多公链中脱颖而出
以太坊从众多公链中脱颖而出,成为区块链和加密货币领域的一个重要玩家,主要是由于以下几个关键因素: 智能合约: 以太坊是第一个广泛实施智能合约的区块链平台,智能合约允许在区块链上自动执行合同条款,无需…...

HarmonyOS--路由管理--组件导航 (Navigation)
文档中心 什么是组件导航 (Navigation) ? 1、Navigation是路由容器组件,一般作为首页的根容器,包括单栏(Stack)、分栏(Split)和自适应(Auto)三种显示模式 2、Navigation组件适用于模块内和跨模块的路由切换,一次开发࿰…...

【Linux 命令】文件比较 diff
diff 命令是 Unix 和类 Unix 系统(如 Linux 和 macOS)中用于比较文件内容差异的一个非常有用的命令行工具。它可以逐行比较两个文件的内容,并输出它们之间的差异。这些差异通常以行为单位显示,并且会标记出哪些行是唯一的、添加的…...

猫头虎分享[可灵AI」官方推荐的驯服指南-V1.0
猫头虎分享[可灵AI」官方推荐的驯服指南-V1.0 猫头虎是谁? 大家好,我是 猫头虎,别名猫头虎博主,擅长的技术领域包括云原生、前端、后端、运维和AI。我的博客主要分享技术教程、bug解决思路、开发工具教程、前沿科技资讯、产品评…...

你的硬盘知道的太多:你以为你的秘密真的被删除了吗?
某一天你收到了朋友发给你的一个秘密文件,在看完之后,为了不被别人发现,你决定将文件毁尸灭迹! 你选中文件名称 / 右键 / 删除,好了,文件已经消失了。但你是懂电脑的,知道文件此时还在回收站里面…...

虚拟机的网络配置
📑打牌 : da pai ge的个人主页 🌤️个人专栏 : da pai ge的博客专栏 ☁️ 每一步都向着梦想靠近,坚持就是胜利的序曲 一 …...

ONLYOFFICE8.1版本桌面编辑器简单测评
ONLYOFFICE官网链接:在线PDF查看器和转换器 | ONLYOFFICE ONLYOFFICE介绍:https://www.onlyoffice.com/zh/office-suite.aspx OnlyOffice 是一款免费且开源的 Office 协作办公套件,支持桌面端和移动端等多平台,由一家领先的 IT 公…...

PDF内存如何变小,PDF内存压缩,PDF内存变小怎么调整
在数字化时代,pdf已成为工作、学习和生活中不可或缺的文件格式。它以其跨平台兼容性和安全性受到广大用户的喜爱。然而,随着pdf文件中嵌入的图片、图形和文本内容的增多,文件大小往往会变得相当可观,给文件的传输和存储带来一定的…...

深⼊理解MySQL Innodb存储引擎的缓冲池、事务、索引底层工作原理,掌握 MySQL 主从同步,读写分离技术以及集群的搭建,具备分库分表,SQL调优经验
深入理解MySQL的InnoDB存储引擎是数据库管理员和开发人员的重要技能。以下是对InnoDB存储引擎的缓冲池、事务、索引以及主从同步、读写分离技术和集群搭建的详细原理介绍: ### InnoDB存储引擎 1. **缓冲池(Buffer Pool)**: - 缓冲池是InnoDB存储引擎…...

《HelloGitHub》第 99 期
兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等,涵盖多种编程语言 Python、…...

mysql 将一个列按逗号分割为多列
在MySQL中,将一个列按逗号分割为多列通常需要使用字符串函数,如SUBSTRING_INDEX(),配合UNION ALL或CROSS JOIN等操作来实现。 假设有一个表my_table,它有一个列tags,其中存储了逗号分隔的标签值,如下所示&…...

Vue 3中 <script setup> 与生命周期钩子函数的详细解析
Vue 3中 <script setup> 与生命周期钩子函数的详细解析 Vue 3 引入了 <script setup> 语法糖,这是一种简化和集成组件逻辑的新方式。尽管 <script setup> 简化了组件的编写,但仍然可以利用 Vue 提供的生命周期钩子函数来管理组件的生…...

一篇文章入门主成分分析PCA
文章目录 基本概念事件随机变量独立同分布离散型随机变量伯努利分布(两点分布)二项分布几何分布泊松分布 连续型随机变量正态分布 期望方差标准化协方差相关系数线性组合特征值和特征向量特征值分解对称矩阵的特征值分解 齐次线性方程组单位向量基向量矩…...

Android系统为什么lmkd杀到adj 100就代表有低内存?
在Android系统中,lmkd(Low Memory Killer Daemon,低内存终止守护进程)负责监控系统的内存状态,并在内存压力较高时通过终止不必要的进程来释放内存,以维持系统的稳定运行。关于lmkd为何在杀到adj࿰…...

d嘤嘤不想求异或喵(牛客周赛49)
题意: 嘤嘤有两个整数 l,r,她想知道区间 [l,r] 所有整数的异或和是多少. 分析: 样例1只有一个数输出1 样例2 1^201^10113 样例3 1^2^301^10^1111^11000 #include<bits/stdc.h> using namespace std; typedef long long ll; ll f(l…...

java反射-动态调用方法
通过字符串动态创建对象,通过字符串动态使用对象方法 package com.hmdp.service.动态调用方法;import java.lang.reflect.Method;public class Main {public static void main(String[] args) throws Exception {String name "javax.swing.JFrame";Clas…...

ThreadLocal作用
ThreadLocal作用(线程本地存储) ThreadLocal,很多地方叫做线程本地变量,也有些地方叫做线程本地存储,ThreadLocal的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或者组件之…...

Python基础入门知识
目录 引言 简要介绍Python语言 为什么要学习Python Python的应用领域 Python安装和环境配置 Python的下载和安装(Windows, macOS, Linux) 配置Python环境变量 安装和使用IDE(如PyCharm, VS Code) Python基本语法 注释 变量和数据类型(数字,字符串,列表,元组,字典,…...

uniapp——据用户角色显示或隐藏部分功能权限。
v-if"user.state.agent_level!business || (user.state.agent_levelbusiness && item.value ! 3 && item.value ! 4)"...

JCR一区级 | Matlab实现BO-Transformer-LSTM多变量回归预测
JCR一区级 | Matlab实现BO-Transformer-LSTM多变量回归预测 目录 JCR一区级 | Matlab实现BO-Transformer-LSTM多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现BO-Transformer-LSTM多变量回归预测,贝叶斯优化Transformer结合LSTM长…...

软件开发环境-系统架构师(二十一)
1、对计算机评价的主要性能指标有时钟频率、()、运算精度和内存容量等。 对数据库管理系统评价的主要性能指标有()、数据库所允许索引数量和最大并发事务处理能力。 问题1 A丢包率 B端口吞吐量 C可移植性 D数据处理速率 问题…...

AI与大模型工程师证书研修班报名啦!
人工智能大模型是指拥有超大规模参数(通常在十亿个以上)、超强计算资源的机器学习模型,能够处理海量数据,完成各种复杂任务,如自然语言处理、图像识别等。计算机硬件性能不断提升,深度学习算法快速优化&…...

ctfshow-web入门-命令执行(web56、web57、web58)
目录 1、web56 2、web57 3、web58 1、web56 命令执行,需要严格的过滤 新增过滤数字,只能采用上一题临时文件上传的方法: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><…...

controller不同的后端路径对应vue前端传递数据发送请求的方式,vue请求参数 param 与data 如何对应后端参数
目录 案例一: 为什么使用post发送请求,参数依旧会被拼接带url上呢?这应该就是param 与data传参的区别。即param传参数参数会被拼接到url后,data会以请求体传递 补充:后端controller 参数上如果没写任何注解,…...

【FFmpeg】avcodec_send_frame函数
目录 1.avcodec_send_frame1.1 将输入的frame存入内部buffer(encode_send_frame_internal)1.1.1 frame的引用函数(av_frame_ref )1.1.1.1 帧属性的拷贝(frame_copy_props)1.1.1.2 buffer的引用函数…...

python获取字符编码
在Python中,您可以使用内置的ord()函数获取单个字符的Unicode编码,使用encode()方法获取字符串的字节编码。 获取单个字符的Unicode编码: char a unicode_code ord(char) print(unicode_code) # 输出字符的Unicode编码 获取字符串的字节编码: tex…...

通过MATLAB控制TI毫米波雷达的工作状态之实时数据采集
前言 前一章博主介绍了如何基于MATLAB的各种前面板组件结合MATLAB代码来发送CFG指令控制毫米波雷达的工作状态,这一章节博主将介绍如何基于这些组件结合MATLAB代码来实现TI毫米波雷达数据的实时采集。目前大部分TI毫米波雷达的数据采集均是仅可以采集一段数据又或者利用DAC10…...

华为HCIP Datacom H12-821 卷21
1.单选题 以下关于PIM-SM中SPT切换的描述,错误的是哪一项? A、若所有组播流量都经过RP路由器,则RP路由器可能成为数据转发的瓶颈 B、SPT路径最短,转发性能更优 C、SPT 切换完成后,组播流量依然经过 ReT 树 D、RPT 树可能不是组播流量转发的最优路径 正确答案: C 解析…...