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

HDFS Java 客户端 API

一、基本调用

Configuration 配置对象类,用于加载或设置参数属性

FileSystem 文件系统对象基类。针对不同文件系统有不同具体实现。该类封装了文件系统的相关操作方法。

1. maven依赖pom.xml文件

        <dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-common</artifactId><version>3.1.4</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-hdfs</artifactId><version>3.1.4</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>3.1.4</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13</version></dependency>

2. 创建跟hdfs文件系统的连接和关闭

package com.yifeng.hadoop;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.junit.After;
import org.junit.Before;import java.io.IOException;/*** @Author: EstellaQ* @Date: 2025/2/21 18:00* @Description: 测试类**/
public class HDFSClientTest {private static Configuration conf = null;private static FileSystem fs = null;/*** 初始化方法,用于和hdfs集群建立连接* @throws IOException*/@Beforepublic void connect2HDFS() throws IOException {// 创建配置对象实例conf = new Configuration();//设置操作的文件系统是HDFS,并且指定HDFS操作地址conf.set("fs.defaultFS", "hdfs://node1.yifeng.cn:8020");// 创建FileSystem对象实例fs = FileSystem.get(conf);}/*** 关闭客户端和hdfs连接* @throws IOException */@Afterpublic void close() {// 首先判断文件系统实例是否为null,如果不为null,进行关闭if (fs != null) {try {fs.close();} catch (IOException e) {e.printStackTrace();}}}
}

3. 权限验证

直接调用api呢,会报错:Permission denied: user=hp, access=WRITE, inode="/user":root:supergroup:drwxr-xr-x

原因:以Windows登录用户访问HDFS,而该用户不具备在HDFS操作权限

解决     

1、修改HDFS文件系统权限     

2、或者设置客户端身份,该身份具备在HDFS操作权限

//设置客户端身份,以具备权限在hdfs上进行操作
System.setProperty("HADOOP_USER_NAME", "root");

4. 创建文件夹

/*** 创建文件夹操作*/@Testpublic void mkdir() throws IOException {// 判断文件夹是否存在,如果不存在再创建if (!fs.exists(new Path("/yifeng"))) {//创建文件夹fs.mkdirs(new Path("/yifeng"));}}

5. 上传文件

/*** 从本地文件系统上传文件到HDFS* Q:本地文件系统指的是?  客户端所在集群的文件系统 此处指的是Windows文件系统*/@Testpublic void  putFile2HDFS() throws IOException {//本地文件路径Path src = new Path("E:\\appdata\\hdfs\\helloworld.txt");//hdfs目标路径Path dst = new Path("/yifeng");//上传文件 参数(源路径,目标路径)fs.copyFromLocalFile(src,dst);}

6. 下载文件

/*** 从HDFS下载文件到本地文件系统*/@Testpublic void getFile2Local() throws IOException {//本地文件路径Path src = new Path("/yifeng/helloworld.txt");//hdfs目标路径Path dst = new Path("E:\\appdata\\helloworld.txt");//上传文件 参数(源路径,目标路径)fs.copyToLocalFile(src,dst);}

 此时会报错:

  • 原因:     
  1. Hadoop访问windows本地文件系统,要求Windows上的本地库能正常工作。
  2. 其中Hadoop使用某些Windows API来实现类似posix的文件访问权限。   
  3. 上述功能需要在hadoop.dll和winutils.exe来实现。
  • 解决:
  1. 下载Hadoop源码在windows平台编译,编译出windows本地库。然后配置Hadoop环境变量。
  2. 配置好之后重启IDEA,有些机器需要右键管理员权限运行IDEA。

HADOOP_HOME=E:\tools\hadoop\hadoop-3.1.4     

path=;%HADOOP_HOME%\bin   

二、Log4j使用

1. 介绍

        Log4J 是 Apache 的一个开源项目。通过在项目中使用 Log4J,我们可以控制日志信息输出到控制台、文件、GUI 组件、甚至是数据库中。我们可以控制每一条日志的输出格式,通过定义日志的输出级别,可以更灵活的控制日志的输出过程。方便项目的调试。

  • 官网: https://logging.apache.org/log4j/2.x/

2. 三大组件

  • Log4J主要由Logger(日志记录器)、Appender(输出端)和 Layout(日志格式化器)组成。
  • Logger控制日志的输出级别与日志是否输出;
  • Appender指定日志的输出方式(ConsoleAppender控制台、FileAppender文件、JDBCAppender等);
  • Layout控制日志信息的输出格式(simple格式、HTML格式、PatternLayout自定义格式)。

3. 日志的级别

  • Log4J 在 org.apache.log4j.Level 类中定义了OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、ALL八种日志级别。
  • 一般只使用4个级别,优先级从高到低为 ERROR > WARN > INFO > DEBUG。

4. 项目中应用

1)项目中引入log4j的jar包

hadoop中已经集成好log4j的jar包了。

2)添加配置文件log4j.properties

  • 只需要在项目路径下新建log4j.properties配置文件,并配置日志的输出格式等信息,Log4J框架会自动的加载配置文件,并将配置信息设置到Logger中。
# 控制台输出配置
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %p [%c] - %m%n
#指定日志的输出级别与输出端
log4j.rootLogger=DEBUG,Console#日志输出格式
%p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL, 
%d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy-MM-dd HH:mm:ss,SSS},输出类似:2011-10-18 22:10:28,921 
%r: 输出自应用启动到输出该log信息耗费的毫秒数 
%c: 输出日志信息所属的类目,通常就是所在类的全名 
%t: 输出产生该日志事件的线程名 
%l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。 
%x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。 
%%: 输出一个"%"字符 
%F: 输出日志消息产生时所在的文件名称 
%L: 输出代码中的行号 
%m: 输出代码中指定的消息,产生的日志具体信息 
%n: 输出一个回车换行符,Windows平台为"\r\n",Unix平台为"\n"输出日志信息换行

3)代码中使用

public class Log4Test {public static void main(String[] args) {Logger logger = Logger.getLogger(Log4Test.class);logger.debug("这是debug");logger.info("这是info");logger.warn("这是warn");logger.error("这是error");logger.fatal("这是fatal");}
}

三、Google Option使用

1. 介绍

  • Google-option是Bazel Project中的命令行参数解析器。
  • option程序包已拆分为一个单独的jar,可用于通用程序。
  • GitHub:https://github.com/pcj/google-options

2. 引入Google-option的jar包

<dependency>  
    <groupId>com.github.pcj</groupId>
    <artifactId>google-options</artifactId>
    <version>1.0.0</version>
</dependency> 

3. 首先创建参数实体类

  • 类应提供与预期的命令行选项相对应的public字段; 每个public字段都应使用@Option注释进行注释 。
  • Option注解参数说明

        name:选项名称

        defaultValue:默认值

        abbrev:选项的单字符缩写

        help:使用信息的帮助字符串

        category:描述此选项所属的类别

        allowMultiple:一个标志,指示是否应允许选项类型在单个选项列表中多次出现。

import com.google.devtools.common.options.Option;
import com.google.devtools.common.options.OptionsBase;import java.util.List;public class ServerOptions extends OptionsBase {@Option(name = "help",abbrev = 'h',help = "Prints usage info.",defaultValue = "true")public boolean help;@Option(name = "host",abbrev = 'o',help = "The server host.",category = "startup",defaultValue = "")public String host;@Option(name = "port",abbrev = 'p',help = "The server port.",category = "startup",defaultValue = "8080")public int port;@Option(name = "dir",abbrev = 'd',help = "Name of directory to serve static files.",category = "startup",allowMultiple = true,defaultValue = "")public List<String> dirs;}

4. 在main方法中解析参数

import com.google.devtools.common.options.OptionsParser;import java.util.Collections;public class Server {public static void main(String[] args) {//创建一个参数Parser解析对象  解析规则为ServerOptions中定义OptionsParser parser = OptionsParser.newOptionsParser(ServerOptions.class);//解析输入参数数组argsparser.parseAndExitUponError(args);//获得OptionServerOptions options = parser.getOptions(ServerOptions.class);//如果输入参数host为空 或 port<0(非法)或 dirs目录为空if (options.host.isEmpty() || options.port < 0 || options.dirs.isEmpty()) {//输出Usage使用方法printUsage(parser);return;}//输出Server运行的host portSystem.out.format("Starting server at %s:%d...\n", options.host, options.port);//输出每个dir的名字for (String dirname : options.dirs) {System.out.format("\\--> Serving static files at <%s>\n", dirname);}}private static void printUsage(OptionsParser parser) {System.out.println("Usage: java -jar server.jar OPTIONS");System.out.println(parser.describeOptions(Collections.<String, String>emptyMap(),OptionsParser.HelpVerbosity.LONG));}
}

四、舆情数据上报案例

  • 在HDFS上有一个目录,相当于企业中的数据中转站,会有源源不断的数据存储进去
  • 其中有些类型的数据是我们业务相关的舆情数据
  • 要求使用程序能够遍历数据源目录,找出符合需求的数据,上传移动到指定的HDFS目录下。

Step1:实现思路

  • 使用Google Option解析命令行参数。
  • 读取要采集的数据目录,生成上传任务,上传任务包含一个任务文件,该文件包含了要上传哪些文件到HDFS上。
  • 执行任务,读取要上传的任务文件,挨个将任务文件中的文件上传到HDFS。
  • 上传中、上传完毕需要给任务文件添加特别的标识(willdoing copy done)。

Step2:工程环境搭建

  • 添加maven依赖     
  • 构建代码包结构 

        arg: 处理命令行参数

        dfs: 存放操作HDFS的工具类

        task: 处理文件上传任务

Step3:开发舆情上报程序参数解析

同上,在main方法中解析参数

创建一个SentimentOptions类, 并从OptionsBase继承,定义以下几个参数

(1) 帮助,可以显示命令的帮助信息 help h 默认参数

(2) 要采集数据的位置 source s

(3) 生成待上传的临时目录 pending_dir p

(4) 生成要上传到的HDFS路径 output o

Step4:实现生成数据采集任务

task包下创建TaskMgr源文件。 先实现生成数据上报任务。

实现步骤:     

1.判断原始数据目录是否存在     

2.读取原始数据目录下的所有文件     

3.判断待上传目录是否存在,不存在则创建一个     

4.创建任务目录(目录名称:task_年月日时分秒_任务状态)     

5.遍历待上传的文件,在待上传目录生成一个willDoing文件     

6.将待移动的文件添加到willDoing文件中

Step5:实现执行数据上报任务

1. 读取待上传目录的willDoing任务文件,注意过滤COPY和DONE后的任务文件夹

2.遍历读取任务文件,开始上传     

        a)将任务文件修改为_COPY,表示正在处理中     

        b)获取任务的日期     

        c)判断HDFS目标上传目录是否存在,不存在则创建     

        d)读取任务文件     

        e)按照换行符切分     

        f)上传每一个文件,调用HDFSUtils进行数据文件上传     

        g)上传成功后,将_COPY后缀修改为_DONE

Step6:项目打包

shade插件可以将所有的jar打到一个jar包中。

将执行主类的项目路径复制到<mainClass></mainClass>中

然后打包:

这里打包好两个jar包,一个是原代码的jar包,下面那个是携带了依赖的jar包

Step7:结果测试

创建一个目录/root/sentiment_upload,使用以下shell脚本来驱动jar包执行。

#!/bin/bash
export SENTIMENT_HOME=/root/sentiment_upload
export JAVA_HOME=/export/server/jdk1.8.0_65
export JAVA_CMD="${JAVA_HOME}/bin/java"
export JAVA_OPS="-jar ${SENTIMENT_HOME}/hdfs-api-1.0-SNAPSHOT-jar-with-dependencies.jar"

SOURCE_DIR=$1
PENDING_DIR=$2
OUTPUT_DIR=$3

if [ ! $SOURCE_DIR ] || [ ! $OUTPUT_DIR ]; then
    ${JAVA_CMD} ${JAVA_OPS} -h
    exit;
fi

if [ ! $PENDING_DIR ] ; then
    ${JAVA_CMD} ${JAVA_OPS} -s $SOURCE_DIR -o $OUTPUT_DIR
    exit;
fi

${JAVA_CMD} ${JAVA_OPS} -s $SOURCE_DIR -p ${PENDING_DIR} -o $OUTPUT_DIR

将脚本和jar包都上传到服务器 /root/sentiment_upload 目录下

创建文件夹 source pending output

mkdir source

mkdir pending

mkdir output

 将数据集上传到source目录下(数据集在代码里边也有)

执行以下命令即可

sh sentiment_upload.sh /root/sentiment_upload/source /root/sentiment_upload/pending /root/sentiment_upload/out

项目地址:https://gitee.com/EstellaQ/hdfs-api.git

相关文章:

HDFS Java 客户端 API

一、基本调用 Configuration 配置对象类&#xff0c;用于加载或设置参数属性 FileSystem 文件系统对象基类。针对不同文件系统有不同具体实现。该类封装了文件系统的相关操作方法。 1. maven依赖pom.xml文件 <dependency><groupId>org.apache.hadoop</groupId&g…...

【华三】STP的角色选举(一文讲透)

【华三】STP的角色选举 一、引言二、STP基础概念扫盲三、根桥选举过程详解四、根端口选举过程详解五、指定端口选举过程详解六、阻塞端口七、总结与配置建议七、附录**1. BPDU字段结构图&#xff08;文字描述&#xff09;****2. 华三STP常用命令速查表** 文章总结 一、引言 在…...

【C#零基础从入门到精通】(二十六)——C#三大特征-多态详解

【C#零基础从入门到精通】(二十六)——C#三大特征-多态详解 在 C# 中,多态是面向对象编程的重要特性之一,它允许不同的对象对同一消息做出不同的响应。多态可以分为静态多态和动态多态,下面将详细介绍它们以及各自包含的知识点。 多态概述 多态性使得代码更加灵活、可扩展…...

宇树科技13家核心零部件供应商梳理!

2025年2月6日&#xff0c;摩根士丹利&#xff08;Morgan Stanley&#xff09;发布最新人形机器人研报&#xff1a;Humanoid 100: Mapping the Humanoid Robot Value Chain&#xff08;人形机器人100&#xff1a;全球人形机器人产业链梳理&#xff09;。 Humanoid 100清单清单中…...

Java集合框架全解析:从LinkedHashMap到TreeMap与HashSet面试题实战

一、LinkedHashMap ①LinkedHashMap集合和HashMap集合的用法完全相同。 ②不过LinkedHashMap可以保证插入顺序。 ③LinkedHashMap集合因为可以保证插入顺序&#xff0c;因此效率比HashMap低一些。 ④LinkedHashMap是如何保证插入顺序的&#xff1f; 底层采用了双向链表来记…...

goland无法debug项目

1、其实个原因是因为正在使用的Delve调试器版本太旧&#xff0c;无法兼容当前的Go语言版本1.2。Delve是Go语言的一个调试工具&#xff0c;用于提供源码级别的调试功能。Go语言每隔一段时间会发布新版本&#xff0c;而相应的调试器Delve也可能会更新以提供新的特性或修复已知问题…...

深入探索 DeepSeek 在数据分析与可视化中的应用

在数据驱动的时代&#xff0c;快速且准确地分析和呈现数据对于企业和个人都至关重要。DeepSeek 作为一款先进的人工智能工具&#xff0c;凭借其强大的数据处理和可视化能力&#xff0c;正在革新数据分析的方式。 1. 数据预处理与清洗 在进行数据分析前&#xff0c;数据预处理…...

python面试题整理

Python 如何处理异常&#xff1f; Python中&#xff0c;使用try 和 except 关键字来捕获和处理异常 try 块中放置可能会引发异常的代码&#xff0c;然后在except块中处理这些异常。 能补充一下finally的作用吗&#xff1f; finally 块中的代码无论是否发生异常都会执行&#xf…...

大型装备故障诊断解决方案

大型装备故障诊断解决方案 方案背景 在全球航空工业迅猛发展的背景下&#xff0c;我国在军用和民用飞机自主研发制造领域取得了显著成就。尤其是在国家大力支持下&#xff0c;国内飞机制造企业攻克了诸多关键技术难题&#xff0c;实现了从设计研发到生产制造再到售后保障的完整…...

基于SpringBoot+vue+uniapp的智慧旅游小程序+LW示例参考

系列文章目录 1.基于SSM的洗衣房管理系统原生微信小程序LW参考示例 2.基于SpringBoot的宠物摄影网站管理系统LW参考示例 3.基于SpringBootVue的企业人事管理系统LW参考示例 4.基于SSM的高校实验室管理系统LW参考示例 5.基于SpringBoot的二手数码回收系统原生微信小程序LW参考示…...

小怿学习日记(七) | Unreal引擎灯光架构

灯光的布局对于HMI场景中车模的展示效果有着举足轻重的地位。本篇内容将简单介绍ES3.1的相关知识&#xff0c;再深入了解Unreal引擎中车模的灯光以及灯光架构。 一、关于ES3.1 1.1 什么是ES3.1 ES3.1这个概念对于美术的同学可能比较陌生&#xff0c;ES3.1指的是OpenGL ES3.1&…...

网络运维学习笔记 013网工初级(HCIA-Datacom与CCNA-EI)DHCP动态主机配置协议(此处只讲华为)

文章目录 DHCP&#xff08;Dynamic Host Configuration Protocol&#xff0c;动态主机配置协议&#xff09;网关配置DHCP服务器配置如果没有DHCP服务器&#xff0c;只在网关上做DHCP服务器&#xff1a; DHCP&#xff08;Dynamic Host Configuration Protocol&#xff0c;动态主…...

javaEE-14.spring MVC练习

目录 1.加法计算器 需求分析: 前端页面代码: 后端代码实现功能: 调整前端页面代码: 进行测试: 2.用户登录 需求分析: 定义接口: 1.登录数据校验接口: 2.查询登录用户接口: 前端代码: 后端代码: 调整前端代码: 测试/查错因 后端: 前端: lombok工具 1.引入依赖…...

HTML/CSS中并集选择器

1.作用:选中多个选择器对应的元素,又称:分组选择器 所谓并集就是或者的含义. 2.语法:选择器1,选择器2,选择器3,......选择器n 多个选择器通过,连接,此处,的含义就是:或. .rich,.beauty{color: blue;} 3.注意事项 1.并集选择器,我们一般竖着写 2.任何形式的选择器,都可以作为并…...

可编辑35页PPT | DeepSeek如何赋能职场应用

DeepSeek作为一款基于人工智能技术的多模态AI工具&#xff0c;近年来在职场应用中迅速崭露头角&#xff0c;以其强大的功能和高效的表现赢得了广泛的赞誉。DeepSeek融合了文本生成、图像创作、数据分析与可视化等多种功能&#xff0c;为职场人士提供了前所未有的便利和效率提升…...

CSS `transform` 属性详解:打造视觉效果与动画的利器

CSS transform 属性详解&#xff1a;打造视觉效果与动画的利器 引言一、transform 属性简介二、平移&#xff08;Translation&#xff09;三、旋转&#xff08;Rotation&#xff09;四、缩放&#xff08;Scale&#xff09;五、倾斜&#xff08;Skew&#xff09;六、组合变换&am…...

Windows使用docker部署fastgpt出现的一些问题

文章目录 Windows使用docker部署FastGPT出现的一些问题1.docker部署pg一直重启的问题2.重启MongoDB之后一直出现“Waiting for MongoDB to start...”3.oneapi启动不了failed to get gpt-3.5-turbo token encoder Windows使用docker部署FastGPT出现的一些问题 1.docker部署pg一…...

Spring Boot中如何使用Thymeleaf模板引擎

Thymeleaf 是一个现代化的服务器端 Java 模板引擎,在 Spring Boot 项目中使用它可以方便地将 Java 代码和 HTML 页面进行整合,生成动态的 Web 页面。以下将详细介绍在 Spring Boot 中如何使用 Thymeleaf 模板引擎。 1. 添加依赖 如果你使用的是 Maven 项目,在 pom.xml 中添…...

C/C++跳动的爱心

系列文章 序号直达链接1C/C李峋同款跳动的爱心2C/C跳动的爱心3C/C经典爱心4C/C满屏飘字5C/C大雪纷飞6C/C炫酷烟花7C/C黑客帝国同款字母雨8C/C樱花树9C/C奥特曼10C/C精美圣诞树11C/C俄罗斯方块小游戏12C/C贪吃蛇小游戏13C/C孤单又灿烂的神14C/C闪烁的爱心15C/C哆啦A梦16C/C简单…...

Element UI中messageBox怎么区分点击取消按钮关闭弹窗,和点击右上角x号以及点击遮罩层关闭按钮

在某些场景下&#xff0c;我们可能需要区分点击取消按钮关闭 messageBox 和点击X号、遮罩层关闭 messageBox 。 实现&#xff1a; 将 distinguishCancelAndClose 设置为 true&#xff0c;这个属性的意思是&#xff1a;是否将取消&#xff08;点击取消按钮&#xff09;与关闭&…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

PHP 8.5 即将发布:管道操作符、强力调试

前不久&#xff0c;PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5&#xff01;作为 PHP 语言的又一次重要迭代&#xff0c;PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是&#xff0c;借助强大的本地开发环境 ServBay&am…...

xmind转换为markdown

文章目录 解锁思维导图新姿势&#xff1a;将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件&#xff08;ZIP处理&#xff09;2.解析JSON数据结构3&#xff1a;递归转换树形结构4&#xff1a;Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...

aardio 自动识别验证码输入

技术尝试 上周在发学习日志时有网友提议“在网页上识别验证码”&#xff0c;于是尝试整合图像识别与网页自动化技术&#xff0c;完成了这套模拟登录流程。核心思路是&#xff1a;截图验证码→OCR识别→自动填充表单→提交并验证结果。 代码在这里 import soImage; import we…...