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

HDFS Java API 操作

文章目录

  • HDFS Java API操作
    • 零、启动hadoop
    • 一、HDFS常见类接口与方法
      • 1、hdfs 常见类与接口
      • 2、FileSystem 的常用方法
    • 二、Java 创建Hadoop项目
      • 1、创建文件夹
      • 2、打开Java IDEA
        • 1) 新建项目
        • 2) 选择Maven
    • 三、配置环境
      • 1、添加相关依赖
      • 2、创建日志属性文件
    • 四、Java API操作
      • 1、在HDFS上创建文件
      • 2、在Java 上创建包
        • 1) 编写`create1()`方法
        • 2) 编写create2() 方法
      • 3、在HDFS上写入文件
        • 1) 将数据直接写入HDFS文件
          • (1)编写write1() 方法
        • 2) 将本地文件写入HDFS文件
          • (1)、编写witer2() 方法
          • (2)、编写write2_2() 方法
      • 4、读取HDFS文件
        • 1) 读取HDFS文件直接在控制台显示
          • (1) 编写read1() 方法
        • 2) 读取HDFS文件,保存为本地文件
          • (1) 创建`read2()`方法
      • 5、重命名目录或文件
        • 1) 重命名目录
          • (1) 编写`renameDir()` 方法
        • 2) 重命名文件
          • (1)编写renameFile() 方法
      • 6、显示文件列表
        • 1) 显示指定目录下文件全部信息
          • (1)、编写list1() 方法
        • 2) 显示指定目录下文件路径和长度信息
          • (1) 编写list2() 方法
      • 7、获取文件块信息

HDFS Java API操作

Hadoop是使用Java语言编写的,因此使用Java API操作Hadoop文件系统,HDFS Shell本质上就是对Java API的应用,通过编程的形式,操作HDFS,其核心是使用HDFS提供的Java API构造一个访问客户端对象,然后通过客户端对象对HDFS上的文件进行操作(增,删,改,查)

零、启动hadoop

在这里插入图片描述

一、HDFS常见类接口与方法

1、hdfs 常见类与接口

Hadoop 整合了众多文件系统,HDFS只是这个文件系统的一个实例
在这里插入图片描述

2、FileSystem 的常用方法

FileSystem 对象的一些方法可以对文件进行操作
在这里插入图片描述

二、Java 创建Hadoop项目

1、创建文件夹

现在D盘创建一个空的文件夹,HDFS02用来存放hadoop项目
在这里插入图片描述

2、打开Java IDEA

1) 新建项目

点击左上角,新建项目
在这里插入图片描述

2) 选择Maven

选择Maven包管理,记住一定是jdk1.8版本的,然后那个从archetype 不要选择
在这里插入图片描述
然后点击下一步,位置选择刚刚D盘创建的那个HDFS02文件夹,然后点击完成
在这里插入图片描述

三、配置环境

1、添加相关依赖

创建完成之后,进来是一个pom.xml文件
在这里插入图片描述
添加以下的相关的hadoopjunit依赖配置,其中大部分都是有的,主要是<dependencise></dependencise> 这个部分

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>HDFS02</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>18</maven.compiler.source><maven.compiler.target>18</maven.compiler.target></properties><dependencies><dependency><!--hadoop客户端--><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>3.3.4</version></dependency><!--单元调试框架--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version></dependency></dependencies></project>

然后右上角有一个m的图标,点击一下,加载配置文件,导入包,这个很关键,不然那些包都用不起
在这里插入图片描述
Manen Repository (Maven仓库) http://mvnrepository.com/
在这里插入图片描述
搜索 hadoop在这里插入图片描述
点击 hadoop-client 超链接,然后点击下面的3.3.4
在这里插入图片描述
就可以看到上面在Java里面配置的hadoop的依赖就是这个地方的
在这里插入图片描述

2、创建日志属性文件

resources目录里创建log4j.properties文件
在这里插入图片描述
把下面的配置添加进去
在这里插入图片描述

log4j.rootLogger=stdout, logfile
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/hdfs.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n

四、Java API操作

1、在HDFS上创建文件

在 /ied01 目录里创建hadoop.txt 文件
输入命令:hdfs dfs -mkdir /ied01/hadoop.txt
在这里插入图片描述
在webUI界面进行查看
在这里插入图片描述

2、在Java 上创建包

创建net.aex.hdfs包,在包里创建CreateFileOnHDFS
在这里插入图片描述

1) 编写create1()方法

注意导入包的时候一定不要导错了,有些很相似
在这里插入图片描述

package net.aex.hdfs;import org.apache.hadoop.conf.Configuration;
import java.net.URI;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
//下面这两个是错的
//import java.nio.file.FileSystem;
//import java.nio.file.Path;public class CreateFileOnHDFS {public static void create1() throws Exception{//创建配置对象Configuration conf = new Configuration();//定义统一资源标识符 (uri: uniform resource identifer)String uri = "hdfs://master:9000";//创建文件系统对象(基于HDFS的文件系统)FileSystem fs = FileSystem.get(new URI(uri),conf);//创建路径对象Path path = new Path(uri + "/ied01/hadoop.txt");//基于路径对象创建文件boolean result = fs.createNewFile(path);//根据返回值判断文件是否创建成功if(result){System.out.println("文件[" + path + "创建成功]");}else{System.out.println("文件[" + path + "创建失败]");}}public static void main(String[] args) throws Exception{create1();}
}

下面使用main方法 对CreateFileOnHDFS 函数方法进行调用
在这里插入图片描述
运行程序查看结果,创建失败,因为我们之前已经在linux本地 hdfs上创建了这个文件
在这里插入图片描述
此时将这个创建的文件路径改为 /ied02/hadoop02.txt 就成功了
在这里插入图片描述
在webUI界面上进行查看
在这里插入图片描述
注意:在/ied01 目录里确实创建了一个0字节hadoop02.txt文件,有点类似于Hadoop shell 里执行 hdfs dfs -touchz /ied01/hadoop02.txt 但是在linux上面重复执行不会失败,只是会不断改变这个文件的时间戳,但是在Java API里面操作,如果重复执行就会失败

2) 编写create2() 方法

编写create2() 方法,事先判断文件是否已经存在

//create2public static void create2() throws Exception{//创建配置对象Configuration conf = new Configuration();//定义统一资源标识符 (uri: uniform resource identifer)String uri = "hdfs://master:9000";//创建文件系统对象(基于HDFS的文件系统)FileSystem fs = FileSystem.get(new URI(uri),conf);//创建路径对象Path path = new Path(uri + "/ied01/hadoop.txt");//判断路径对象指定的文件是否已经存在if(fs.exists(path)){//提示用户文件已经存在System.out.println("文件["+path+"]已经存在!");}else {//基于路径对象创建文件boolean result = fs.createNewFile(path);//根据返回值判断文件是否已经创建成功if (result){System.out.println("文件[" + path + "创建成功!");}else{System.out.println("文件[" + path + "创建失败!");}}}

使用main方法调用create2() 函数方法,查看程序运行结果,提示文件已经存在
在这里插入图片描述
此时我们怎么才能出现文件创建失败的情况呢,我们故意让HDFS进入安全模式(只能读,不能写)
linux上删除已经创建的/ied01/hadoop02.txt 文件
输入命令: hdfs dfs -rm /ied01/hadoop02.txt
在这里插入图片描述
输入命令:hdfs dfsadmin safemode enter 进入安全模式
在这里插入图片描述
此时,再运行程序,抛出SafeModelException 异常
在这里插入图片描述
修改程序,来处理这个可能会抛出的安全模式异常
使用try catch 来抛出捕获异常
在这里插入图片描述
运行程序,查看结果
在这里插入图片描述
linux 输入命令:hdfs dfsadmin -safemode leave 关闭安全模式
在这里插入图片描述
再运行程序,查看结果 创建成功
在这里插入图片描述

3、在HDFS上写入文件

net.aex.hdfs 包里创建WriteFileOnHDFS
在这里插入图片描述

1) 将数据直接写入HDFS文件

在linux本地 hdfs /ied01目录创建hello.txt文件
在这里插入图片描述

(1)编写write1() 方法

在Java 里创建 write1() 函数方法

package net.aex.hdfs;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;import java.net.URI;
import java.nio.charset.StandardCharsets;public class WriteFileOnHDFS {public static void write1() throws Exception{//创建配置对象Configuration conf = new Configuration();//定义统一资源标识符 (uri: uniform resource identifer)String uri = "hdfs://master:9000";//创建文件系统对象(基于HDFS的文件系统)FileSystem fs = FileSystem.get(new URI(uri),conf);//创建路径对象Path path = new Path(uri + "/ied01/hello.txt");//创建文件系统数据字节输出流FSDataOutputStream out = fs.create(path);//通过字节输出流向文件写入数据out.write("Hello hadoop world".getBytes());//关闭输出流out.close();//关闭文件系统对象fs.close();}public static void main(String[] args) throws Exception{write1();}
}

运行程序,查看结果,报错,没有数据节点可以写入数据
在这里插入图片描述
修改代码,添加一个 设置数据节点主机名属性
在这里插入图片描述
运行1程序,查看结果
在这里插入图片描述
在webUI界面上查看hello.txt 文件
在这里插入图片描述

2) 将本地文件写入HDFS文件

在Java项目根目录创建一个文本文件test.txt
在这里插入图片描述

(1)、编写witer2() 方法

在Java WriteFileOnHDFS类里面创建 write2函数方法
在这里插入图片描述

//write2public static void write2() throws Exception{//创建配置对象Configuration conf = new Configuration();//设置数据节点主机名属性conf.set("dfs.client.use.datanode.hostname","true");//定义统一资源标识符 (uri: uniform resource identifer)String uri = "hdfs://master:9000";//创建文件系统对象(基于HDFS的文件系统)FileSystem fs = FileSystem.get(new URI(uri),conf,"root");//创建路径对象Path path = new Path(uri + "/ied01/exam.txt");//创建文件系统数据字节输出流对象FSDataOutputStream out = fs.create(path);//创建文字字符输入流对象FileReader fr = new FileReader("test.txt");//创建缓冲字符输入流对象BufferedReader br = new BufferedReader(fr);//定义行字符串String nextLine = "";//通过循环读取缓冲字符输入流while ((nextLine=br.readLine()) != null){//在控制台输出读取的行System.out.println(nextLine);//通过文件系统数据字节输出流对象写入指定文件out.write(nextLine.getBytes());}//关闭文件系统字节输出流out.close();//关闭缓冲字符输入流br.close();//关闭文件字符输入流fr.close();//提示用户写入文件成功System.out.println("本地文件[test.txt]成功写入[" + path + "]!");}

main函数调用write2() 方法,查看结果 写入成功
在这里插入图片描述
其实这个方法的功能就是将本地文件复制(上传)到HDFS,有更简单的处理方法,通过使用一个工具类IOUtils来完成文件的相关操作

(2)、编写write2_2() 方法

在这里插入图片描述

//write2_2()public static void write2_2() throws Exception{//创建配置对象Configuration conf = new Configuration();//设置数据节点主机名属性conf.set("dfs.client.use.datanode.hostname","true");//定义统一资源标识符 (uri: uniform resource identifer)String uri = "hdfs://master:9000";//创建文件系统对象(基于HDFS的文件系统)FileSystem fs = FileSystem.get(new URI(uri),conf,"root");//创建路径对象Path path = new Path(uri + "/ied01/test.txt");//创建文件系统数据字节输出流对象FSDataOutputStream out = fs.create(path);//创建文字字符输入流对象FileInputStream in = new FileInputStream("test");//利用IOUtils类提供的字节拷贝方法来复制文件IOUtils.copyBytes(in,out,conf);//关闭文件字节输入流in.close();//关闭文件系统字节输入流out.close();//关闭文件系统fs.close();//提示用户写入文件成功System.out.println("本地文件[test.txt]成功写入[" + path + "]!");}

使用main方法,运行write2_2() 函数方法 查看结果 写入成功
在这里插入图片描述
在linux查看hdfs 目录 /ied01/test.txt内容
在这里插入图片描述

4、读取HDFS文件

相当于Shell里的两个命令:hdfs dfs -cathdfs dfs -get
net.aex.hdfs包里创建ReadFileOnHDFS

1) 读取HDFS文件直接在控制台显示

准备读取 /ied01/test.txt 文件
在这里插入图片描述

(1) 编写read1() 方法

在这里插入图片描述

package net.aex.hdfs;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;import java.io.BufferedReader;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.net.URI;public class ReadFileOnHDFS {public static void read1() throws Exception{//创建配置对象Configuration conf = new Configuration();//设置数据节点主机名属性conf.set("dfs.client.use.datanode.hostname","true");//定义统一资源标识符 (uri: uniform resource identifer)String uri = "hdfs://master:9000";//创建文件系统对象(基于HDFS的文件系统)FileSystem fs = FileSystem.get(new URI(uri),conf,"root");//创建路径对象(指向目录或文件)Path path = new Path(uri + "/ied01/test.txt");//创建文件系统数据字节输入流对象FSDataInputStream in = fs.open(path);//创建缓冲字符输入流对象,提高读取效率(字节流-->字符流-->缓冲流)BufferedReader br = new BufferedReader(new InputStreamReader(in));//定义行字符串String nextLine = "";// 通过循环读取缓冲字符输入流while ((nextLine=br.readLine())!=null){//在控制台输出读取的行内容System.out.println(nextLine);}//关闭缓冲字符输入流br.close();//关闭文件系统数据字节输入流in.close();//关闭文件系统fs.close();}public static void main(String[] args) throws Exception{read1();}
}

使用main方法调用 read1() 函数方法 查看结果 将/ied01/test.txt里的文件读取出来了
在这里插入图片描述
其实我们可以使用IOUtils类来简化代码,创建read_()函数方法
在这里插入图片描述

 //read1_2()public static void read1_2() throws Exception{//创建配置对象Configuration conf = new Configuration();//设置数据节点主机名属性conf.set("dfs.client.use.datanode.hostname","true");//定义统一资源标识符 (uri: uniform resource identifer)String uri = "hdfs://master:9000";//创建文件系统对象(基于HDFS的文件系统)FileSystem fs = FileSystem.get(new URI(uri),conf,"root");//创建路径对象(指向目录或文件)Path path = new Path(uri + "/ied01/test.txt");//创建文件系统数据字节输入流对象FSDataInputStream in = fs.open(path);//读取文件在控制台显示IOUtils.copyBytes(in,System.out,4096,false);//关闭文件系统数据字节输入流in.close();//关闭文件系统fs.close();}

使用main方法,调用read1_2() 函数方法 查看结果
在这里插入图片描述

2) 读取HDFS文件,保存为本地文件

任务:将/ied01/test.txt 下载到项目下download目录里

(1) 创建read2()方法
//read2()public static void read2() throws Exception{//创建配置对象Configuration conf = new Configuration();//设置数据节点主机名属性conf.set("dfs.client.use.datanode.hostname","true");//定义统一资源标识符 (uri: uniform resource identifer)String uri = "hdfs://master:9000";//创建文件系统对象(基于HDFS的文件系统)FileSystem fs = FileSystem.get(new URI(uri),conf,"root");//创建路径对象(指向目录或文件)Path path = new Path(uri + "/ied01/test.txt");//创建文件系统数据字节输入流对象FSDataInputStream in = fs.open(path);//创建文件字节输出流FileOutputStream out = new FileOutputStream("D:\\HDFS02\\.idea\\download\\exam.txt");//读取HDFS文件(靠输入流),写入本地文件(靠输出流)IOUtils.copyBytes(in,out,conf);//关闭文件系统数据字节输入流in.close();//关闭文件字节输出流in.close();//关闭文件系统fs.close();//提示用户文件下载成功System.out.println("文件["+path+"]下载到本地文件[download/exam.txt]!");}

使用main方法,调用read2()函数,查看结果 exam.txt 文件已经下载到本地的download目录下了
在这里插入图片描述

5、重命名目录或文件

1) 重命名目录

任务:将/ied01 目录更名为 /lzy01

(1) 编写renameDir() 方法

在这里插入图片描述

package net.aex.hdfs;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;import java.net.URI;public class RenameDirOnFile {public static void renameDir() throws Exception{//创建配置对象Configuration conf = new Configuration();//设置数据节点主机名属性conf.set("dfs.client.use.datanode.hostname","true");//定义统一资源标识符 (uri: uniform resource identifer)String uri = "hdfs://master:9000";//创建文件系统对象(基于HDFS的文件系统)FileSystem fs = FileSystem.get(new URI(uri),conf);//创建源路径对象Path sourcePath = new Path("/ied01");//创建目标路径对象Path targePath = new Path("/lzy01");//利用文件系统对象重命名目录fs.rename(sourcePath,targePath);//关闭文件系统fs.close();//提示用户目录更名成功System.out.println("目录["+sourcePath.getName()+"]更名为目录[" + targePath.getName() + "]!");}public static void main(String[] args) throws Exception{renameDir();}
}

使用main方法调用renameDir()函数,查看结果 成功从/ied01 改为 lzy01
在这里插入图片描述
在webUI界面进行查看
在这里插入图片描述

2) 重命名文件

任务:将/lzy01目录下的hello.txt重名为hi.txt
在这里插入图片描述

(1)编写renameFile() 方法

主要需要两个对象的路径然后通过文件系统.rename()方法,把两个文件路径放进去进行更改

 public static void renameFile() throws Exception{//创建配置对象Configuration conf = new Configuration();//定义统一资源标识符 (uri: uniform resource identifer)String uri = "hdfs://master:9000";//创建文件系统对象(基于HDFS的文件系统)FileSystem fs = FileSystem.get(new URI(uri),conf);//创建源路径对象Path sourcePath = new Path("/lzy01/hello.txt");//目标对象//创建目标路径对象(指向文件)Path targePath = new Path("/lzy01/hi.txt");//利用文件系统重命名文件fs.rename(sourcePath,targePath);//关闭文件系统fs.close();//提示用户更更名成功System.out.println("文件[" + sourcePath.getName() + "]更名文件[" + targePath.getName() + "]!");}

使用main方法调用renameFile()方法,查看结果 更名成功
在这里插入图片描述
在这里插入图片描述

6、显示文件列表

net.aex.hdfs 包里创建ListHDFSFiles

1) 显示指定目录下文件全部信息

任务:显示/lzy01 目录下的文件列表
在这里插入图片描述

(1)、编写list1() 方法
package net.aex.hdfs;import jdk.jshell.execution.LoaderDelegate;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.LocatedFileStatus;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.RemoteIterator;import java.net.URI;public class ListHDFSFile {public static void list1() throws Exception{//设置配置对象Configuration conf = new Configuration();//设置数据节点主机名属性conf.set("dfs.client.use.datanode.hostname","true");//定义统一资源标识符 (uri: uniform resource identifer)String uri = "hdfs://master:9000";//创建文件系统对象(基于HDFS的文件系统)FileSystem fs = FileSystem.get(new URI(uri),conf,"root");//创建远程迭代器对象,泛型是位置文件状态类(相当于`hdfs dfs -ls -R /lzy01`)RemoteIterator<LocatedFileStatus> ri = fs.listFiles(new Path("/lzy01"),true);//遍历远程迭代器while (ri.hasNext()){System.out.println(ri.next());}}public static void main(String[] args) throws Exception{list1();}
}

使用main 方法,调用list1() 方法 查看结果 这些hdfs /lzy01 目录下的文件都读取出来了
在这里插入图片描述上述文件状态对象封装的有关信息,可以通过相应的方法来获取,比如getPath() 方法就可以获取路径信息,getLen()方法就可以获取文件长度信息

2) 显示指定目录下文件路径和长度信息
(1) 编写list2() 方法
//list2()public static void list2() throws Exception{//创建配置对象Configuration conf = new Configuration();//设置数据节点主机名属性conf.set("dfs.client.use.datanode.hosename","true");//定义uri字符串String uri = "hdfs://master:9000";//创建文件系统对象FileSystem fs = FileSystem.get(new URI(uri),conf,"root");//创建远程迭代器对象,泛型是位置文件状态类(相当于`hdfs dfs -ls -R /lzy01`)RemoteIterator<LocatedFileStatus> ri = fs.listFiles(new Path("/lzy01"),true);//遍历远程迭代器while (ri.hasNext()){LocatedFileStatus lfs = ri.next();System.out.println(lfs.getPath() + "" + lfs.getLen() +  "字节");}}

使用main方法调用list2() 方法,查看结果 /lzy01目录下的文件的字节都显示出来了
在这里插入图片描述

7、获取文件块信息

任务:获取/lzy01/hadoop-3.3.4.tar.gz文件块信息在这里插入图片描述
hadoop压缩包会分割成6个文件块
在这里插入图片描述
net.aex.hdfs包里创建GetBlockLocations

相关文章:

HDFS Java API 操作

文章目录 HDFS Java API操作零、启动hadoop一、HDFS常见类接口与方法1、hdfs 常见类与接口2、FileSystem 的常用方法 二、Java 创建Hadoop项目1、创建文件夹2、打开Java IDEA1) 新建项目2) 选择Maven 三、配置环境1、添加相关依赖2、创建日志属性文件 四、Java API操作1、在HDF…...

论文阅读之【Is GPT-4 a Good Data Analyst?(GPT-4是否是一位好的数据分析师)】

文章目录 论文阅读之【Is GPT-4 a Good Data Analyst?&#xff08;GPT-4是否是一位好的数据分析师&#xff09;】背景&#xff1a;数据分析师工作范围基于GPT-4的端到端数据分析框架将GPT-4作为数据分析师的框架的流程图 实验分析评估指标表1&#xff1a;GPT-4性能表现表2&…...

【数据结构】:二叉树与堆排序的实现

1.树概念及结构(了解) 1.1树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的有一个特殊的结点&#…...

纯css手写switch

CSS 手写switch 纯css手写switchcss变量 纯css手写switch 思路&#xff1a; switch需要的元素有&#xff1a;开关背景、开关按钮。点击按钮后&#xff0c;背景色变化&#xff0c;按钮颜色变化&#xff0c;呈现开关打开状态。 利用typecheckbox&#xff0c;来实现switch效果(修…...

PyTorch 深度学习之处理多维特征的输入Multiple Dimension Input(六)

1.Multiple Dimension Logistic Regression Model 1.1 Mini-Batch (N samples) 8D->1D 8D->2D 8D->6D 1.2 Neural Network 学习能力太好也不行&#xff08;学习到的是数据集中的噪声&#xff09;&#xff0c;最好的是要泛化能力&#xff0c;超参数尝试 Example, Arti…...

LeetCode【438】找到字符串中所有字母异位词

题目&#xff1a; 注意&#xff1a;下面代码勉强通过&#xff0c;每次都对窗口内字符排序。然后比较字符串。 代码&#xff1a; public List<Integer> findAnagrams(String s, String p) {int start 0, end p.length() - 1;List<Integer> result new ArrayL…...

关于LEFT JOIN的一次理解

先看一段例子&#xff1a; SELECTproduct_half_spu.id AS halfSpuId,product_half_spu.half_spu_code,product_half_spu.half_spu_name,COUNT( product_sku.id ) AS skuCount,product_half_spu.create_on,product_half_spu.create_by,product_half_spu.upload_pic_date,produc…...

各报文段格式集合

数据链路层-- MAC帧 前导码8B&#xff1a;数据链路层将封装好的MAC帧交付给物理层进行发送&#xff0c;物理层在发送MAC帧前&#xff0c;还要在前面添加8字节的前导码&#xff08;分为7字节的前同步码1字节的帧开始定界符&#xff09;MAC地址长度6B数据长度46&#xff5e;1500B…...

【算法-动态规划】最长公共子序列

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…...

区块链游戏的开发流程

链游&#xff08;Blockchain Games&#xff09;的开发流程与传统游戏开发有许多相似之处&#xff0c;但它涉及到区块链技术的集成和智能合约的开发。以下是链游的一般开发流程&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&…...

目标检测网络系列——YOLO V2

文章目录 YOLO9000better,更准batch Normalization高分辨率的训练使用anchor锚框尺寸的选择——聚类锚框集成改进——直接预测bounding box细粒度的特征图——passthrough layer多尺度训练数据集比对实验VOC 2007VOC 2012COCOFaster,更快网络模型——Darknet19训练方法Strong…...

15. Java反射和注解

Java —— 反射和注解 1. 反射2. 注解 1. 反射 动态语言&#xff1a;变量的类型和属性可以在运行时动态确定&#xff0c;而不需要在编译时指定 常见动态语言&#xff1a;Python&#xff0c;JavaScript&#xff0c;Ruby&#xff0c;PHP&#xff0c;Perl&#xff1b;常见静态语言…...

pdf处理工具 Enfocus PitStop Pro 2022 中文 for mac

Enfocus PitStop Pro 2022是一款专业的PDF预检和编辑软件&#xff0c;旨在帮助用户提高生产效率、确保印刷品质量并减少错误。以下是该软件的一些特色功能&#xff1a; PDF预检。PitStop Pro可以自动检测和修复常见的PDF文件问题&#xff0c;如缺失字体、图像分辨率低、颜色空…...

微信小程序入门开发教程

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《微信小程序开发实战》。&#x1f3af;&#x1f3a…...

php函数

1. strstr() 返回a在b中的第一个位置 2.substr() 截取字符串 3.PHP字符串函数parse_str(将字符串解析成多个变量)-CSDN博客 4.explode() 字符串分割为数组 5.trim&#xff08;&#xff09; 1.去除字符串两边的 空白字符 2.去除指定字符 6.extract()函数从数组里…...

3.3 封装性

思维导图&#xff1a; 3.3.1 为什么要封装 ### 3.3.1 为什么要封装 **封装**&#xff0c;在Java的面向对象编程中&#xff0c;是一个核心的思想。它主要是为了保护对象的状态不被外部随意修改&#xff0c;确保数据的完整性和安全性。 #### **核心思想&#xff1a;** - 保护…...

Redis魔法:点燃分布式锁的奇妙实现

分布式锁是一种用于在分布式系统中控制对共享资源的访问的锁。它与传统的单机锁不同&#xff0c;因为它需要在多个节点之间协调以确保互斥访问。 本文将介绍什么是分布式锁&#xff0c;以及使用Redis实现分布式锁的几种方案。 一、前言 了解分布式锁之前&#xff0c;需要先了…...

iOS 项目避坑:多个分类中方法重复实现检测

#前言 在项目中,我们经常会使用分类 -> category。category在实际项目中一般有两个左右:1.给已有class增加方法,扩充起能力、2.将代码打散到多个文件中,避免因为一个类过于复杂而导致代码篇幅过长(应用于viewController中很好用) 但是 category 也有很多弊端~ **首…...

【003】EIS数据分析_#LIB

EIS数据分析 1. EIS测试及数据获取2. EIS数据分析2.1 EIS曲线划分 1. EIS测试及数据获取 点击查看往期介绍 2. EIS数据分析 2.1 EIS曲线划分 一般来说&#xff0c;实轴处的截获表示体电阻(Rb)&#xff0c;它反映了电解质&#xff0c;隔膜和电极的电导率。高频区的半圆对应于…...

Sprint framework Day07:注解结合 xml 配置

前言 Spring注解结合XML配置是指在Spring应用中&#xff0c;使用注解和XML配置的方式来进行Bean的定义、依赖注入和其他配置。这种方式可以充分利用Spring框架的注解和XML配置两种不同的配置方式的特点。 在Spring框架中&#xff0c;我们可以使用注解来定义Bean&#xff0c;如…...

LiveGBS流媒体平台GB/T28181功能-国标流媒体服务同时兼容内网收流外网收流多网段设备收流

LiveGBS流媒体平台GB/T28181功能-国标流媒体服务同时兼容内网收流外网收流多网段设备收流 1、背景2、设备接入播放2.1、查看通道2.2、直播播放 3、默认收流地址配置4、其它网络设备收流配置5、搭建GB28181视频直播平台 1、背景 服务器部署的时候&#xff0c;可能有多个网卡多个…...

js题解(四)

文章目录 批量改变对象的属性判断是否包含数字判断是否符合指定格式 批量改变对象的属性 给定一个构造函数 constructor&#xff0c;请完成 alterObjects 方法&#xff0c;将 constructor 的所有实例的 greeting 属性指向给定的 greeting 变量。 function alterObjects(const…...

如何进行大数运算和高精度计算?

大数运算和高精度计算是在计算机编程中常见的需求&#xff0c;尤其是当处理大整数、分数、复数、浮点数等需要更多位数的数据时。在C语言中&#xff0c;由于原生的数据类型有限&#xff0c;您需要使用自定义的数据结构和算法来执行大数运算和高精度计算。在本文中&#xff0c;我…...

身份证读卡器跟OCR有何区别?哪个好?

二代身份证读卡器&#xff08;以下简称读卡器&#xff09;和OCR&#xff08;光学字符识别&#xff09;是两种常见的身份证信息获取技术&#xff0c;它们在原理、功能和应用方面存在一些区别。下面将详细介绍二者的区别并探讨哪个更好。 1. 原理&#xff1a; - 读卡器&#xff…...

华为云云耀云服务器L实例评测 | 实例评测使用之硬件参数评测:华为云云耀云服务器下的 Linux 网络监控神器 bmon

华为云云耀云服务器L实例评测 &#xff5c; 实例评测使用之硬件参数评测&#xff1a;华为云云耀云服务器下的 Linux 网络监控神器 bmon 介绍华为云云耀云服务器 华为云云耀云服务器 &#xff08;目前已经全新升级为 华为云云耀云服务器L实例&#xff09; 华为云云耀云服务器是什…...

C++ 设计模式 —— 组合模式

C 设计模式 —— 组合模式 0. 引用连接 本文主要的思路和代码&#xff0c;来自于对以下连接的学习和实现&#xff1a; 组合模式 1. 引言 1.1 什么是组合模式&#xff1f; 组合模式的定义组合模式的作用 组合模式是一种行为型设计模式&#xff0c;它将对象组合成树形结构以…...

华为云Stack的学习(九)

十、华为云Stack灾备服务介绍 1.云硬盘备份VBS 云硬盘备份服务&#xff08;VBS&#xff0c;Volume Backup Service&#xff09;可为云硬盘&#xff08;EVS&#xff0c;Elastic Volume Service&#xff09;创建备份&#xff0c;利用备份数据恢复云硬盘&#xff0c;最大限度保障…...

Flink中jobmanager、taskmanager、slot、task、subtask、Parallelism的概念

场景 一个工厂有三个车间每个车间两条生产线 生产流程如下 原料->加工->过滤->分类->美化->包装->下线 JobManager&#xff1a;工厂 在上述场景中&#xff0c;工厂就是jobManager&#xff0c;负责协调、调度和监控整个生产过程 TaskManager&#xff1a;车间…...

OpenHarmony docker环境搭建

OpenHarmony docker环境搭建 要求一台安装ubuntu的虚拟机,vscode软件 安装docker 在 Ubuntu 上安装 Docker 非常直接。我们将会启用 Docker 软件源&#xff0c;导入 GPG key&#xff0c;并且安装软件包。 首先&#xff0c;更新软件包索引&#xff0c;并且安装必要的依赖软件…...

【计算机网络】网络编程接口 Socket API 解读(11)

Socket 是网络协议栈暴露给编程人员的 API&#xff0c;相比复杂的计算机网络协议&#xff0c;API 对关键操作和配置数据进行了抽象&#xff0c;简化了程序编程。 本文讲述的 socket 内容源自 Linux man。本文主要对各 API 进行详细介绍&#xff0c;从而更好的理解 socket 编程。…...

Qt工具开发,该不该跳槽?

Qt工具开发&#xff0c;该不该跳槽? 就这样吧&#xff0c;我怕你跳不动。 嵌入式UI&#xff0c;目前趋势是向着LVGL发展。QT已经在淘汰期了。很多项目还在用&#xff0c;但技术上已经落后。QT短期内不会全面淘汰&#xff0c;但退位让贤的大趋势已经很清楚了。 最近很多小伙伴…...

【深度学习】DDPM,Diffusion,概率扩散去噪生成模型,原理解读

看过来看过去&#xff0c;唯有此up主&#xff0c;非常牛&#xff1a; Video Explaination(Chinese) 1. DDPM Introduction q q q - 一个固定&#xff08;或预定义&#xff09;的正向扩散过程&#xff0c;逐渐向图像添加高斯噪声&#xff0c;直到最终得到纯噪声。 p θ p_θ p…...

HT8699:内置 BOOST 升Y双声道音频功率放大器

HT8699是一款内置BOOST升Y模块的立体声音频功率放大器。HT8699具有AB类和D类切换功能&#xff0c;在受到D类功放EMI干扰困扰时&#xff0c;可切换至AB类音频功放模式。 在D类模式下&#xff0c;内置的BOOST升Y模块可通过外置电阻调节升Y值&#xff0c;即使是锂电池供电&#xf…...

利达卓越:关注环保事业,持续赋能科技

随着全球环境问题的日益突出,绿色金融作为一种新兴的金融模式逐渐受到各国的重视。绿色金融是指在金融活动中,通过资金、信贷和风险管理等手段,支持环境友好和可持续发展的项目和产业。绿色金融的出现是为了应对气候变化、资源短缺、污染问题等现实挑战,促进经济的绿色转型和可…...

Spring MVC中通过配置文件配置定时任务

Spring MVC中配置定时任务&#xff08;配置文件方式&#xff09; 1.步骤 1.步骤 1-1 在springmvc.xml&#xff08;配置文件&#xff09;的beans中添加 xmlns:task"http://www.springframework.org/schema/task" http://www.springframework.org/schema/task http…...

AI项目十六:YOLOP 训练+测试+模型评估

若该文为原创文章&#xff0c;转载请注明原文出处。 通过正点原子的ATK-3568了解到了YOLOP&#xff0c;这里记录下训练及测试及在onnxruntime部署的过程。 步骤&#xff1a;训练->测试->转成onnx->onnxruntime部署测试 一、前言 YOLOP是华中科技大学研究团队在2021年…...

Flink报错could not be loaded due to a linkage failure

文章目录 1、报错2、原因3、解决 1、报错 在Flink上提交作业&#xff0c;点Submit没反应&#xff0c;F12看到接口报错信息为&#xff1a; 大概意思是&#xff0c;由于链接失败&#xff0c;无法加载程序的入口点类xx。没啥鸟用的信息&#xff0c;去日志目录继续分析&#xff1a…...

网络工程师--网络安全与应用案例分析

前言 需要网络安全学习资料的点击链接&#xff1a;【282G】网络安全&黑客技术零基础到进阶全套学习大礼包&#xff0c;免费分享&#xff01; 案例一&#xff1a; 某单位现有网络拓扑结构如下图所示&#xff0c;实现用户上网功能&#xff0c;该网络使用的网络交换机均为三…...

了解油封对汽车安全的影响?

油封也称为轴封或径向轴封&#xff0c;是车辆发动机、变速箱和其他各种机械系统中的重要部件。它们的主要功能是阻止重要发动机部件的液体(例如油或冷却剂)泄漏&#xff0c;同时防止污染物进入。这些看似简单的任务&#xff0c;但对汽车的安全性和可靠性有着深远的影响。 油封…...

创邻科技Galaxybase—激活数据要素的核心引擎

10月11日下午&#xff0c;创邻科技创始人张晨博士受杭州电子科技大学邀请&#xff0c;前往杭电校园开展交流分享。交流会中&#xff0c;张晨博士为现场的师生带来一场题为《图数据库——激活数据要素的新基建》的精彩分享&#xff0c;探讨数字经济时代底层技术的创新价值与图技…...

【Rust笔记】浅聊 Rust 程序内存布局

浅聊Rust程序内存布局 内存布局看似是底层和距离应用程序开发比较遥远的概念集合&#xff0c;但其对前端应用的功能实现颇具现实意义。从WASM业务模块至Nodejs N-API插件&#xff0c;无处不涉及到FFI跨语言互操作。甚至&#xff0c;做个文本数据的字符集转换也得FFI调用操作系统…...

玻璃生产过程中的窑内压力高精度恒定控制解决方案

摘要&#xff1a;在玻璃生产中对玻璃窑炉中窑压的要求极高&#xff0c;通常需要控制微正压4.7Pa&#xff08;表压&#xff09;&#xff0c;偏差控制在0.3Pa&#xff0c;而窑炉压力还会受到众多因素的影响&#xff0c;所以实现高稳定性的熔窑压力控制具有很大难度&#xff0c;为…...

创意营销:初期推广的多种策略!

文章目录 &#x1f34a; 预热&#x1f389; 制定预热计划和目标&#x1f389; 利用社交媒体传播&#x1f389; 创造独特的体验&#x1f389; 利用口碑营销&#x1f389; 定期发布更新信息&#x1f389; 案例说明 &#x1f34a; 小范围推广&#x1f389; 明确目标用户群体&#…...

【小黑嵌入式系统第一课】嵌入式系统的概述(一)

文章目录 一、嵌入式系统基本概念计算机发展的三大阶段CPU——计算机的核心什么是嵌入式系统嵌入式系统的分类 二、嵌入式系统的特点三、嵌入式系统发展无操作系统阶段简单操作系统阶段实时操作系统阶段面向Internet阶段 四、嵌入式系统的应用工业控制 工业设备通信设备信息家电…...

RK平台使用MP4视频做开机动画以及卡顿问题

rk平台android11以后系统都可以使用MP4格式的视频做开机动画,系统源码里面默认使用的是ts格式的视频,其实使用mp4的视频也是可以的。具体修改如下: diff --git a/frameworks/base/cmds/bootanimation/BootAnimation.cpp b/frameworks/base/cmds/bootanimation/BootAnimat…...

通讯网关软件023——利用CommGate X2HTTP实现HTTP访问Modbus TCP

本文介绍利用CommGate X2HTTP实现HTTP访问Modbus TCP。CommGate X2HTTP是宁波科安网信开发的网关软件&#xff0c;软件可以登录到网信智汇(http://wangxinzhihui.com)下载。 【案例】如下图所示&#xff0c;SCADA系统上位机、PLC、设备具备Modbus RTU通讯接口&#xff0c;现在…...

Python性能测试框架Locust实战教程!

01、认识Locust Locust是一个比较容易上手的分布式用户负载测试工具。它旨在对网站&#xff08;或其他系统&#xff09;进行负载测试&#xff0c;并确定系统可以处理多少个并发用户&#xff0c;Locust 在英文中是 蝗虫 的意思&#xff1a;作者的想法是在测试期间&#xff0c;放…...

c++视觉处理---仿射变换和二维旋转变换矩阵的函数

仿射变换cv::warpAffine cv::warpAffine 是OpenCV中用于执行仿射变换的函数。仿射变换是一种线性变换&#xff0c;可用于执行平移、旋转、缩放和剪切等操作。下面是 cv::warpAffine 函数的基本用法&#xff1a; cv::warpAffine(src, dst, M, dsize, flags, borderMode, borde…...

uiautomator2遍历子元素.all()

当你获取了页面某个元素之后 elements d(’//*[clickable“true”]’).all() 返回的是一个list&#xff0c;其中是<uiautomator2.xpath.XMLElement>类型的变量。 可以通过以下方式获取它所有子类的信息。 for ele in elements:children ele.elem.getchildren()注意…...

【手写数据库toadb】SQL字符串如何被数据库认识? 词法语法分析基础原理,常用工具

词法语法分析 ​专栏内容: 手写数据库toadb 本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。 本专栏会定期更新,对应的代码也会定期更新,每个阶段的代码会打上tag,方便阶段…...