Spring Boot + Apache Tika 从文件或文件流中提取文本内容

应用效果:

1、安装 Apache Tika 依赖

pom.xml

    <!-- Apache Tika 从文件中提取结构化文本和元数据 --><dependency><groupId>org.apache.tika</groupId><artifactId>tika-core</artifactId><version>2.9.2</version></dependency><dependency><groupId>org.apache.tika</groupId><artifactId>tika-parsers-standard-package</artifactId><version>2.9.2</version></dependency>

2、配置

新建配置文件:src/main/resources/tika-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<properties><encodingDetectors><encodingDetector class="org.apache.tika.parser.html.HtmlEncodingDetector"><params><param name="markLimit" type="int">64000</param></params></encodingDetector><encodingDetector class="org.apache.tika.parser.txt.UniversalEncodingDetector"><params><param name="markLimit" type="int">64001</param></params></encodingDetector><encodingDetector class="org.apache.tika.parser.txt.Icu4jEncodingDetector"><params><param name="markLimit" type="int">64002</param></params></encodingDetector></encodingDetectors>
</properties>

新建配置类:src/main/java/com/weiyu/config/TikaConfiguration.java

package com.weiyu.config;import org.apache.tika.Tika;
import org.apache.tika.config.TikaConfig;
import org.apache.tika.detect.Detector;
import org.apache.tika.exception.TikaException;
import org.apache.tika.parser.AutoDetectParser;
import org.apache.tika.parser.Parser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.xml.sax.SAXException;import java.io.IOException;
import java.io.InputStream;
/*** Tika 配置*/
@Configuration
public class TikaConfiguration {@Autowiredprivate ResourceLoader resourceLoader;@Beanpublic Tika tika() throws IOException, TikaException, SAXException {Resource resource = resourceLoader.getResource("classpath:tika-config.xml");InputStream inputStream = resource.getInputStream();TikaConfig config = new TikaConfig(inputStream);Detector detector = config.getDetector();Parser parser = new AutoDetectParser(config);return new Tika(detector, parser);}
}

扩展原有文件工具类(增加提取文本内容的方法) 或 新建文件服务类

工具类:src/main/java/com/weiyu/utils/FileUtils.java

package com.weiyu.utils;import org.apache.tika.Tika;
import org.apache.tika.exception.TikaException;import java.io.File;
import java.io.IOException;
import java.io.InputStream;/*** 文件工具*/
public class FileUtils {private static final Tika tika = new Tika();/*** 获取路径分隔符* <p>如 windows:D:\\MyCode\\file\\example.txt,返回 \\; example.txt,返回 \u0000(空字符)* <p>如 windows:D:/MyCode/file/example.txt,返回 /; example.txt,返回 \u0000(空字符)* <p>如 Linux:/MyCode/file/example.txt,返回 /; example.txt,返回 \u0000(空字符)* @param filePathName 文件路径名称 或 文件名称* @return 分隔符,如 /、\、\u0000(空字符)*/public static int getPathSplitChar(String filePathName) {if (filePathName == null || filePathName.isEmpty()) return '\u0000';int splitChar;// Linux 目录,以 / 开头if (filePathName.charAt(0) == '/') {splitChar = '/';}// windows 目录else {// windows 目录路径使用正斜杠(/)作为路径分隔符if (filePathName.contains("/")) {splitChar = '/';}// windows 目录路径使用反斜杠(\)作为路径分隔符else if (filePathName.contains("\\")){splitChar = '\\';} else {splitChar = '\u0000';}}return splitChar;}/*** 获取路径分隔字符串* <p>如 windows:D:\\MyCode\\file\\example.txt,返回 \\; example.txt,返回 \u0000(空字符)* <p>如 windows:D:/MyCode/file/example.txt,返回 /; example.txt,返回 \u0000(空字符)* <p>如 Linux:/MyCode/file/example.txt,返回 /; example.txt,返回 \u0000(空字符)* @param filePathName 文件路径名称 或 文件名称* @return 分隔字符串,如 /、\、\u0000(空字符)*/public static String getPathSplitString(String filePathName) {int splitChar = getPathSplitChar(filePathName);switch (splitChar) {case 47 -> {return "/";}case 92 -> {return "\\";}default -> {return "";}}}/*** 获取文件名* <p>如 windows:D:\\MyCode\\file\\example.txt,返回 example.txt; example.txt,返回 example.txt* <p>如 windows:D:/MyCode/file/example.txt,返回 example.txt; example.txt,返回 example.txt* <p>如 Linux:/MyCode/file/example.txt,返回 example.txt; example.txt,返回 example.txt* @param filePathName 文件路径名称 或 文件名称* @return 文件名(无路径、有后缀),如:example.txt*/public static String getFileName(String filePathName) {// 获取路径分隔符int ch = getPathSplitChar(filePathName);// 查找最后一个 ch 的位置int lastDotIndex = filePathName.lastIndexOf(ch);// 如果没有 ch,直接返回原文件名if (lastDotIndex == -1) {return filePathName;}return filePathName.substring(lastDotIndex + 1);}/*** 移除文件名后缀* <p>如 windows:D:\\MyCode\\file\\example.txt,返回 D:\\MyCode\\file\\example; example.txt,返回 example* <p>如 windows:D:/MyCode/file/example.txt,返回 D:/MyCode/file/example; example.txt,返回 example* <p>如 Linux:/MyCode/file/example.txt,返回 /MyCode/file/example; example.txt,返回 example* @param filePathName 文件路径名称 或 文件名称* @return 文件名(有路径、无后缀)*/public static String getFileNameContainPathWithoutExtension(String filePathName) {// 查找最后一个 . 的位置int lastDotIndex = filePathName.lastIndexOf('.');// 如果没有后缀,直接返回原文件名if (lastDotIndex == -1) {return filePathName;}return filePathName.substring(0, lastDotIndex);}/*** 移除文件名路径和后缀* <p>如 windows:D:\\MyCode\\file\\example.txt 或 example.txt,返回 example* <p>如 windows:D:/MyCode/file/example.txt 或 example.txt,返回 example* <p>如 Linux:/MyCode/file/example.txt 或 example.txt,返回 example* @param filePathName 文件路径名称 或 文件名称* @return 文件名(无路径、无后缀),如:example*/public static String getFileNameWithoutPathAndExtension(String filePathName) {// 获取路径分隔符int ch = getPathSplitChar(filePathName);// 查找最后一个 ch 的位置int lastDotIndex = filePathName.lastIndexOf(ch);// 如果没有ch,直接返回原文件名if (lastDotIndex != -1) {filePathName = filePathName.substring(lastDotIndex + 1);}// 查找最后一个 . 的位置lastDotIndex = filePathName.lastIndexOf('.');filePathName = filePathName.substring(0, lastDotIndex);return filePathName;}/*** 获取文件名的扩展名(后缀)* <p>如 windows:D:\\MyCode\\file\\example.txt 或 example.txt,返回 txt* <p>如 windows:D:/MyCode/file/example.txt 或 example.txt,返回 txt* <p>如 Linux:/MyCode/file/example.txt 或 example.txt,返回 txt* @param filePathName 文件路径名称 或 文件名称* @return 扩展名(后缀),不带.(如:txt)*/public static String getExtension(String filePathName) {// 处理 null 异常if (filePathName == null) return null;// 获取文件名中最右边的.int index = filePathName.lastIndexOf(".");// 没有.if (index == -1) return "";// 获取文件名的扩展名(后缀)return filePathName.substring(index + 1);}/*** 是否目录* <p>如 windows:D:\\MyCode\\file\\example.txt,返回 true; example.txt,返回 false* <p>如 windows:D:/MyCode/file/example.txt,返回 true; example.txt,返回 false* <p>如 Linux:/MyCode/file/example.txt,返回 true; example.txt,返回 false* @param filePathName 文件路径名称 或 文件名称* @return true,包含文件路径;false,不包含文件路径*/public static Boolean hasDirectory(String filePathName) {// 获取路径分隔符int ch = getPathSplitChar(filePathName);// 查找最后一个 ch 的位置int lastDotIndex = filePathName.lastIndexOf(ch);// 如果没有 ch,不包含文件路径return lastDotIndex != -1;}/*** 安全目录,windows目录以 \ 或 / 结尾,linux目录以 / 结尾* @param directoryPath 目录路径* @return 返回安全目录,如: 或 D:/MyCode/file/QualityFile/ 或 /MyCode/file/QualityFile/ 或 D:\\MyCode\\file\\QualityFile\\*/public static String safeDirectory(String directoryPath) {// 获取目录路径最后一位字符String lastChar = directoryPath.substring(directoryPath.length() - 1);// 目录路径最后没有目录分割符 \ 或 /(windows) 或 /(linux)if (!lastChar.equals("\\") && !lastChar.equals("/")) {// linux 目录路径以 / 开头if (directoryPath.charAt(0) == '/') {directoryPath = directoryPath + "/";}// windows 目录路径else {// windows 目录路径使用正斜杠(/)作为路径分隔符if (directoryPath.contains("/")) {directoryPath = directoryPath + "/";}// windows 目录路径使用反斜杠(\)作为路径分隔符else {directoryPath = directoryPath + "\\";}}}return  directoryPath;}/*** 拼接目录路径* @param mainDirectoryPath 主目录路径*                          如 windows:D:/MyCode/file 或 D:\\MyCode\\file,Linux:/MyCode/file*                          如 windows:D:/MyCode/file/ 或 D:\\MyCode\\file\\,Linux:/MyCode/file/* @param subDirectoryPathAndFileName 子目录路径 或 文件名 或 子目录路径及文件名*                                    如 windows:QualityFile/ 或  QualityFile\\,Linux:QualityFile/*                                    如 windows:QualityFile/example.txt 或 QualityFile\\example.txt,Linux:QualityFile/example.txt*                                    如 windows:/example.txt 或 \\example.txt,Linux:/example.txt* @return 目录路径* 如 windows:D:/MyCode/file/QualityFile/ 或 D:\\MyCode\\file\\QualityFile\\,Linux:/MyCode/file/QualityFile/* 如 windows:D:/MyCode/file/QualityFile/example.txt 或 D:\\MyCode\\file\\QualityFile\\example.txt,Linux:/MyCode/file/QualityFile/example.txt* 如 windows:D:/MyCode/file/example.txt 或 D:\\MyCode\\file\\example.txt,Linux:/MyCode/file/example.txt*/public static String joinDirectoryPath(String mainDirectoryPath, String subDirectoryPathAndFileName) {String filePathName;// 安全检查主目录路径,Linux:以 / 开头,windows:第二位字符是 :if (!isMainDirectoryPath(mainDirectoryPath)) {throw new RuntimeException("非法目录!");}filePathName = mainDirectoryPath;// 获取路径分隔符 / 或 \String pathSplitString = FileUtils.getPathSplitString(filePathName);// 确保最后是路径分隔符 / 或 \if (!filePathName.endsWith(pathSplitString)) {filePathName = filePathName + pathSplitString;}// 拼接子目录路径 或 文件名 或 子目录路径及文件名if (subDirectoryPathAndFileName != null && !subDirectoryPathAndFileName.isEmpty()) {// 拼接子目录路径 或 文件名 或 子目录路径及文件名 以 路径分隔符 / 或 \ 开头if (subDirectoryPathAndFileName.startsWith(pathSplitString)) {// 先删除子目录路径 或 文件名 或 子目录路径及文件名 开头的路径分隔符 / 或 \,再拼接filePathName = filePathName + subDirectoryPathAndFileName.substring(1);} else {// 直接拼接filePathName = filePathName + subDirectoryPathAndFileName;}}return filePathName;}/*** 是否是主目录,即 Linux:以 / 开头,windows:第二位字符是 :* @param mainDirectoryPath 主目录路径*                          如 windows:D:/MyCode/file 或 D:\\MyCode\\file,Linux:/MyCode/file*                          如 windows:D:/MyCode/file/ 或 D:\\MyCode\\file\\,Linux:/MyCode/file/* @return true 或 false*/public static boolean isMainDirectoryPath(String mainDirectoryPath) {// 安全检查主目录路径,Linux:以 / 开头,windows:第二位字符是 :return mainDirectoryPath != null &&!mainDirectoryPath.isEmpty() &&(mainDirectoryPath.startsWith("/") || (mainDirectoryPath.length() > 2 && mainDirectoryPath.charAt(1) == ':'));}/*** 解析文件,提取文件中的文本内容** @param file 文件* @return 文件中的文本内容* @throws IOException IO异常* @throws TikaException Tika异常*/public static String parseFile(File file) throws IOException, TikaException {return tika.parseToString(file);}/*** 解析文件,提取文件流中的文本内容** @param fileStream 文件流* @return 文件中的文本内容* @throws IOException IO异常* @throws TikaException Tika异常*/public static String parseFile(InputStream fileStream) throws IOException, TikaException {return tika.parseToString(fileStream);}
}

服务类:

src/main/java/com/weiyu/service/FileService.java

src/main/java/com/weiyu/service/impl/FileServiceImpl.java

package com.weiyu.service;import org.apache.tika.exception.TikaException;import java.io.File;
import java.io.IOException;
import java.io.InputStream;/*** 文件 Service 接口*/
public interface FileService {/*** 解析文件,提取文件中的文本内容** @param file 文件* @return 文件中的文本内容* @throws IOException IO异常* @throws TikaException Tika异常*/String parseFile(File file) throws TikaException, IOException;/*** 解析文件,提取文件流中的文本内容** @param fileStream 文件流* @return 文件中的文本内容* @throws IOException IO异常* @throws TikaException Tika异常*/String parseFile(InputStream fileStream) throws TikaException, IOException;
}

src/main/java/com/weiyu/service/impl/FileServiceImpl.java

package com.weiyu.service.impl;import com.weiyu.service.FileService;
import org.apache.tika.Tika;
import org.apache.tika.exception.TikaException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.io.File;
import java.io.IOException;
import java.io.InputStream;/*** 文件 Service 接口实现*/
@Service
public class FileServiceImpl implements FileService {@Autowiredprivate Tika tika;/*** 解析文件,提取文件中的文本内容** @param file 文件* @return 文件中的文本内容* @throws IOException IO异常* @throws TikaException Tika异常*/@Overridepublic String parseFile(File file) throws TikaException, IOException {return tika.parseToString(file);}/*** 解析文件,提取文件流中的文本内容** @param fileStream 文件流* @return 文件中的文本内容* @throws IOException IO异常* @throws TikaException Tika异常*/@Overridepublic String parseFile(InputStream fileStream) throws TikaException, IOException {return tika.parseToString(fileStream);}
}

3、前后端联合应用

3.1、前端 Vue3

API:qualityFile.ts

/*** 从文件或文件流中提取文本内容* @param fileNo 文件编号(可能包含非安全字符,如:4.2 2人员v∕V/v+DW=dw,其中空格、全角斜杠∕、半角斜杠/、加号+、非ASCII字符​​(如中文、日文等),这些字符为非安全字符,在URL中都会被编码传输)* @returns 文本内容*/
export const qualityFileParseService = (fileNo: string) => {return request.get("/resources/qualityFile/parse", {params: {fileNo: fileNo}});
};

UI:QualityFile.vue

// 提取
const onParseClick = async (fileNo: string) => {const result = await qualityFileParseService(fileNo);store.currentParseFileText = result.data;// 显示质量体系文件文本提取内容模态框showContentDialogRef.value?.showDialog();
};<BasePreventReClickButtonclass="table-btn"type="primary"size="default"text:loading="false":disabled="scope.row.isNullContent"@click="onParseClick(scope.row.fileNo)">提取</BasePreventReClickButton><!-- 显示质量体系文件文本提取内容模态框 --><BaseShowContentDialog ref="showContentDialogRef" title="提取的文本内容" :content="store.currentParseFileText" />

3.2、后端 Spring Boot

Controller:QualityFileController.java

    /*** 从文件或文件流中提取文本内容** @param fileNo 文件编号(可能包含非安全字符,如:4.2 2人员v∕V/v+DW=dw,其中空格、全角斜杠∕、半角斜杠/、加号+、中文为非安全字符)* @return 文本内容* @apiNote 本接口使用防抖机制,3s 内重复请求会被忽略*/@GetMapping("/parse")@Debounce(key = "/resources/qualityFile/parse", value = 3000)public Result<String> parse(String fileNo) throws TikaException, IOException {log.info("【质量体系文件】,提取文件中的文本内容,/resources/qualityFile/parse,fileNo = {}", fileNo);String fileContentStr = qualityFileService.parse(fileNo);return Result.success(fileContentStr);}

Service:QualityFileService.java

    /*** 从文件或文件流中提取文本内容*/String parse(String fileNo) throws TikaException, IOException;

Service 实现(使用文件工具类实现):QualityFileServiceImpl.java

    /*** 从文件或文件流中提取文本内容*/@Overridepublic String parse(String fileNo) throws TikaException, IOException {// 获取文件数据FileData fileData = qualityFileMapper.selectFileData(fileNo);// 从文件名中获取路径分隔符String pathSplitString = FileUtils.getPathSplitString(fileData.getFileName());// 有路径分隔符,提取本地磁盘中文件的文本内容if (!pathSplitString.isEmpty()) {// 获取文件绝对路径String filePathName = FileUtils.joinDirectoryPath(mainDirectoryPath, fileData.getFileName());// 提取本地磁盘中文件的文本内容return FileUtils.parseFile(new File(filePathName));}// 无路径分隔符,提取数据库中文件流的文本内容else {InputStream fileStream = new ByteArrayInputStream(fileData.getFileContent());// 提取数据库中文件流的文本内容return FileUtils.parseFile(fileStream);}}

Service 实现(使用文件服务类实现):WorkInstructionServiceImpl.java

    @Autowiredprivate FileService fileService;    /*** 从文件或文件流中提取文本内容*/@Overridepublic String parse(String fileNo) throws TikaException, IOException {// 获取文件数据FileData fileData = qualityFileMapper.selectFileData(fileNo);// 从文件名中获取路径分隔符String pathSplitString = FileUtils.getPathSplitString(fileData.getFileName());// 有路径分隔符,提取本地磁盘中文件的文本内容if (!pathSplitString.isEmpty()) {// 获取文件绝对路径String filePathName = FileUtils.joinDirectoryPath(mainDirectoryPath, fileData.getFileName());// 提取本地磁盘中文件的文本内容return fileService.parseFile(new File(filePathName));}// 无路径分隔符,提取数据库中文件流的文本内容else {InputStream fileStream = new ByteArrayInputStream(fileData.getFileContent());// 提取数据库中文件流的文本内容return fileService.parseFile(fileStream);}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/96116.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/96116.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

qqq数据结构补充

1.绪论1.存储方式顺序存储&#xff1a;逻辑相邻&#xff0c;物理相邻链式存储&#xff1a;逻辑相邻&#xff0c;物理不一定相邻2.线性表1.顺序表1.不可扩容数组写一个顺序表1.在头文件中应有#pragam once&#xff0c;防止头文件多次编译&#xff1b;如果头文件多次编译&#x…

Anaconda与Jupyter 安装和使用

Anaconda内部集成了很多科学计算包&#xff0c;并且可以实现环境隔离 1. 安装Anaconda 定义&#xff1a;Anaconda是一个集成的Python发行版&#xff0c;专为数据科学、机器学习和AI开发而设计。它包含了常用的Python库、包管理工具&#xff08;Conda&#xff09;和Jupyter No…

5.后台运行设置和包设计与实现

程序的入口点(想让其后台默认.exe进程运行)也可以不通过vs设置也可以通过定义预处理设置第三种就是没有窗口的变成后台运行的了 处理client传来的数据包 第一步&#xff1a;咱们怎么设计一种包呢&#xff1f;FEFF在网络环境里面出现的概率低所以就采用这个 自己数据包截断了&am…

【开题答辩全过程】以 基于微信小程序校园综合服务平台的设计与实现为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

地级市人口集聚、经济集聚、产业集聚与绿色经济效率匹配数据(含区域经济研究相关的控制变量,Excel|shp|免费数据)

D006 地级市人口集聚、经济集聚、产业集聚与绿色经济效率匹配数据&#xff08;含区域经济研究相关的控制变量&#xff0c;Excel|shp|免费数据&#xff09;数据简介今天我们分享的数据是2004-2020年地级市人口聚集、经济聚集与绿色经济效率匹配数据&#xff0c;并对其进行可视化…

视觉SLAM第7讲:视觉里程计2(3D-2D:PnP、3D-3D:ICP)

接上文&#xff0c;视觉SLAM第7讲&#xff1a;视觉里程计1&#xff08;特征点法、2D-2D对极约束&#xff09;&#xff0c;本节主要学习3D-2D:PnP、3D-3D:ICP。 目录 7.7 3D-2D:PnP 7.7.1 直接线性变换&#xff08;DLT&#xff09; 7.7.2 P3P 1.原理 2.小结 7.7.3 最小化重…

友元的功能解析

目录 一、友元的作用 二、实例说明 1. 友元方法 例&#xff1a; 2.友元类 例&#xff1a; 三、注意事项 一、友元的作用 1. 可以让一个类外 函数 或 类对象 访问一个 类内私有 成员或方法。 二、实例说明 1. 友元方法 例&#xff1a; 用friend 关键字在Tom 类中声明…

GNSS校准气压计

1、gnss信号较好的时候得到的GNSS高&#xff0c;得到海拔高。2、气压计数据转到标准数据然后计算出来海拔高。3、gnss高作基准 - 气压高 高差 &#xff1b;需要修正的是气压偏差&#xff0c;那么如何得到气压偏差1&#xff09;用gnss高 反求出一个气压&#xff0c;这个气压与…

基于Springboot + vue3实现的校园二手交易平台

项目描述本系统包含管理员、用户两个角色。管理员角色&#xff1a;用户管理&#xff1a;管理系统中所有用户的信息&#xff0c;包括添加、删除和修改用户。配置管理&#xff1a;管理系统配置参数&#xff0c;如上传图片的路径等。权限管理&#xff1a;分配和管理不同角色的权限…

新型存储介质应用:CXL内存扩展技术与AI工作负载适配

点击 “AladdinEdu&#xff0c;同学们用得起的【H卡】算力平台”&#xff0c;H卡级别算力&#xff0c;80G大显存&#xff0c;按量计费&#xff0c;灵活弹性&#xff0c;顶级配置&#xff0c;学生更享专属优惠。 引言&#xff1a;AI计算的内存瓶颈挑战 当前AI技术发展正面临着一…

Java 多线程(二)

目录synchronized刷新内存synchronized的特性可重入的出现死锁的情况如何避免死锁&#xff08;重点&#xff0c;死锁的成因和解决&#xff09;volatile关键字wait和notify多线程的代码案例饿汉模式和懒汉模式的线程安全问题指令重排序问题阻塞队列使用自己实现一个阻塞队列实现…

MySql 内外连接

1.内连接内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选&#xff0c;我们前面学习的查询都是内连 接&#xff0c;也是在开发过程中使用的最多的连接查询。 语法&#xff1a;select 字段 from 表1 inner join 表2 on 连接条件 and 其他条件&#xff1b;备注&…

【大前端】 断点续传 + 分片上传(大文件上传优化) 的前端示例

写一个 断点续传 分片上传&#xff08;大文件上传优化&#xff09; 的前端示例。这样即使网络中断&#xff0c;文件也可以从已上传的部分继续传&#xff0c;不需要重新传整个大文件。&#x1f539; 分片上传 断点续传思路分片切割&#xff1a;把大文件切成固定大小的小块&…

机器学习的发展与应用:从理论到现实

目录 引言 一、机器学习的发展历程 1. 萌芽阶段&#xff08;1950s–1970s&#xff09; 2. 符号主义与统计学习阶段&#xff08;1980s–1990s&#xff09; 3. 数据驱动与算法突破&#xff08;2000s–2010s&#xff09; 4. 深度学习崛起&#xff08;2012年至今&#xff09; …

Python实现讯飞星火大模型Spark4.0Ultra的WebSocket交互详解

核心架构设计与初始化机制 代码采用面向对象的设计模式构建了Ws_Param类作为核心配置载体。该类在初始化时接收四个关键参数:APPID(应用标识)、APIKey(接口密钥)、APISecret(签名秘钥)和Spark_url(服务端点地址)。通过urlparse模块解析URL结构,分离出主机名(host)与…

如何通过Linux在高通跃龙QCS6490 平台上优化部署AI/ML模型?

简介 高通于今年推出了高通跃龙&#xff0c;在边缘提供前沿的AI性能和超低延迟&#xff0c;为可扩展的工业创新带来新的可能性。研华已在各种规格尺寸的嵌入式方案中采用跃龙技术&#xff0c;包括由高通跃龙 QCS6490处理器支持的嵌入式模块、单板电脑和AI摄像头解决方案。研华…

MySQL内核革新:智能拦截全表扫描,百度智能云守护数据库性能与安全

在日常数据库运维中&#xff0c;“扫表风暴”数次悄然而至——某条未走索引的 SQL 突然执行全表扫描&#xff0c;短短几分钟内吃光 IO、拖高 CPU&#xff0c;最终引发集群抖动甚至服务不可用。这样的事故&#xff0c;你是否也曾经历过&#xff1f; 全表扫描&#xff08;Full Ta…

TCP 三次握手、四次挥手

三次握手 三次握手形象版&#xff0c;快速理解 deepseek 的象形比喻&#xff1a;三次握手建立连接就像打电话一样&#xff1a; (1) A 打给 B&#xff0c;“喂&#xff0c; 你能听到我说话吗&#xff1f;” (2) B 回答 A&#xff0c;“嗯&#xff0c;可以听到&#xff0c;你能听…

数据管理战略|1概念及组成部分

【小语】前面两个文章讲到了“数据管理战略数字化转型、数据驱动”三者之间关系,数字化改革中的原则与逻辑,本节用三次文章学习数据管理战略内容的组成部分(DAMA数据管理第1章1.2.6节)。 数据战略 VS 数字化转型 VS 数据驱动 数据管理战略|熵减与熵增相容原则 下文为【…

3.远程控制网络编程的设计上

RemoteCtrl.cpp// RemoteCtrl.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 //#include "pch.h" #include "framework.h" #include "RemoteCtrl.h"#ifdef _DEBUG #define new DEBUG_NEW #endif// 唯一的应用程序对象C…