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

Java--IO基本流

IO流

概述

        生活中,你肯定经历过这样的场景。当你编辑一个文本文件,忘记了`ctrl+s` ,可能文件就白白编辑了。当你电脑上插入一个U盘,可以把一个视频,拷贝到你的电脑硬盘里。那么数据都是在哪些设备上的呢?键盘、内存、硬盘、外接设备等等。

        我们把这种数据的传输,可以看做是一种数据的流动,按照流动的方向,以内存为基准,分为`输入input` 和`输出output` ,即流向内存是输入流,流出内存的输出流。

        Java中I/O操作主要是指使用java.io包下的内容,进行输入、输出操作。输入也叫做读取数据,输出也叫做作写出数据

IO的分类

根据数据的流向分为:输入流和输出流。

输入流 :把数据从`其他设备`上读取到`内存`中的流。

程序 - > 文件

输出流 :把数据从`内存` 中写出到`其他设备`上的流。

文件 - > 程序

格局数据的类型分为:字节流和字符流。

字节流 :以字节为单位,读写数据的流。

字符流 :以字符为单位,读写数据的流。

注意:

纯文本文件:能用Windows自带的记事本打开能读懂的文件

如md和txt

IO流的体系

字节流基本用法

FileOutputStream类

        当你创建一个流对象时,必须传入一个文件路径。该路径下,如果没有这个文件,会创建该文件。如果有这个文件,会清空这个文件的数据。

构造方法:

        public FileOutputStream(File file):创建文件输出流以写入由指定的 File对象表示的文件。

        public FileOutputStream(String name): 创建文件输出流以指定的名称写入文件。

 代码示例:

public class FileOutputStreamConstructor throws IOException {public static void main(String[] args) {// 使用File对象创建流对象File file = new File("a.txt");FileOutputStream fos = new FileOutputStream(file);// 使用文件名称创建流对象FileOutputStream fos = new FileOutputStream("b.txt");}
}
 写出数据的三种方法

写出字节数据 : write(int b) 方法

代码演示:

public class FOSWrite {public static void main(String[] args) throws IOException {// 使用文件名称创建流对象FileOutputStream fos = new FileOutputStream("fos.txt");     // 写出数据fos.write(97); // 写出第1个字节fos.write(98); // 写出第2个字节fos.write(99); // 写出第3个字节// 关闭资源fos.close();}
}
输出结果:
abc

1.创建字节输出流对象细节:

        细节1:参数是字符串表示的路径或者是file对象都是可以的

        细节2:如果文件不存在会创建一个新的文件,但是要保障父级路径是存在的

        细节3:如果文件已经存在,则会清空文件

2.写数据:

        细节:write方法的参数是整数,但是实际上写到本地文件中的是整数在ASCII上对应的字符

3.释放资源

        每次使用完流之后都要释放资源(不然文件一直处于占用状态)

写出字节数组:write(byte[] b)
public class FOSWrite {public static void main(String[] args) throws IOException {// 使用文件名称创建流对象FileOutputStream fos = new FileOutputStream("fos.txt");     // 字符串转换为字节数组byte[] b = "黑马程序员".getBytes();// 写出字节数组数据fos.write(b);// 关闭资源fos.close();}
}
输出结果:
黑马程序员

写出指定长度字节数组:write(byte[] b, int off, int len)
public class FOSWrite {public static void main(String[] args) throws IOException {// 使用文件名称创建流对象FileOutputStream fos = new FileOutputStream("fos.txt");     // 字符串转换为字节数组byte[] b = "abcde".getBytes();// 写出从索引2开始,2个字节。索引2是c,两个字节,也就是cd。fos.write(b,2,2);// 关闭资源fos.close();}
}
输出结果:
cd

数据追加续写

        经过以上的演示,每次程序运行,创建输出流对象,都会清空目标文件中的数据。如何保留目标文件中数据,还能继续添加新数据呢?

        public FileOutputStream(File file, boolean append): 创建文件输出流以写入由指定的 File对象表示的文件。  

        public FileOutputStream(String name, boolean append): 创建文件输出流以指定的名称写入文件。  

        这两个构造方法,参数中都需要传入一个boolean类型的值,`true` 表示追加数据,`false` 表示清空原有数据。这样创建的输出流对象,就可以指定是否追加续写了,

代码演示:

public class FOSWrite {public static void main(String[] args) throws IOException {// 使用文件名称创建流对象FileOutputStream fos = new FileOutputStream("fos.txt",true);     // 字符串转换为字节数组byte[] b = "abcde".getBytes();// 写出从索引2开始,2个字节。索引2是c,两个字节,也就是cd。fos.write(b);// 关闭资源fos.close();}
}
文件操作前:cd
文件操作后:cdabcde
写出换行

换行符:

        Windows:\r\n

        Linux系统:\n

        Mac: \r

细节:

        在windows系统中,Java对回车换行进行了优化

        虽然完整的是\r\n,但是我们写其中一个\r或者\n,

        java也可以实现换行,因为Java在底层会自动补全

建议:

        不要省略,还是写全

代码演示:

public class FOSWrite {public static void main(String[] args) throws IOException {// 使用文件名称创建流对象FileOutputStream fos = new FileOutputStream("fos.txt");  // 定义字节数组byte[] words = {97,98,99,100,101};// 遍历数组for (int i = 0; i < words.length; i++) {// 写出一个字节fos.write(words[i]);// 写出一个换行, 换行符号转成数组写出fos.write("\r\n".getBytes());}// 关闭资源fos.close();}
}输出结果:
a
b
c
d
e

FileInputStream类

        java.io.FileInputStream 类是文件输入流,从文件中读取字节。

构造方法:        

        FileInputStream(File file): 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的 File对象 file命名。

        FileInputStream(String name): 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名 name命名。  

        当你创建一个流对象时,必须传入一个文件路径。该路径下,如果没有该文件,会抛出FileNotFoundException。

代码演示:

public class FileInputStreamConstructor throws IOException{public static void main(String[] args) {// 使用File对象创建流对象File file = new File("a.txt");FileInputStream fos = new FileInputStream(file);// 使用文件名称创建流对象FileInputStream fos = new FileInputStream("b.txt");}
}

读取字节数据:

字节输入流的细节:

1.创建字节输入流对象

        细节1:如果文件不存在,就直接报错

        Java为什么会这么设计呢?

        输出流:不存在,创建

                把数据写到文件当中

        

        输入流:不存在,则是报错呢?

                读取的时候,数据在文件当中

                所以Java就没有这种无意义的逻辑,文件不存在直接报错

         程序中最重要的是:数据

        

2.写数据

        细节1:一次读一个字节,读出来的是数据在ASCII上对应的数字

        细节2:读到文件末尾了,read方法返回-1

3.释放资源

        细节:每次使用完流之后都要释放资源

read方法

        读一次数据,就移动一次指针指向下一个元素

代码演示:

public class FISRead {public static void main(String[] args) throws IOException{// 使用文件名称创建流对象FileInputStream fis = new FileInputStream("read.txt");// 读取数据,返回一个字节int read = fis.read();System.out.println((char) read);read = fis.read();System.out.println((char) read);read = fis.read();System.out.println((char) read);read = fis.read();System.out.println((char) read);read = fis.read();System.out.println((char) read);// 读取到末尾,返回-1read = fis.read();System.out.println( read);// 关闭资源fis.close();}
}
输出结果:
a
b
c
d
e
-1

循环改进读取方式,代码使用演示:

public class FISRead {public static void main(String[] args) throws IOException{// 使用文件名称创建流对象FileInputStream fis = new FileInputStream("read.txt");// 定义变量,保存数据int b ;// 循环读取while ((b = fis.read())!=-1) {System.out.println((char)b);}// 关闭资源fis.close();}
}
输出结果:
a
b
c
d
e

> 小贴士:

>

> 1. 虽然读取了一个字节,但是会自动提升为int类型。

> 2. 流操作完毕后,必须释放系统资源,调用close方法,千万记得。

使用字节数组读取:read(byte[] b)

        每次读取b的长度个字节到数组中,返回读取到的有效字节个数,读取到末尾时,返回`-1`

代码演示:

public class FISRead {public static void main(String[] args) throws IOException{// 使用文件名称创建流对象.FileInputStream fis = new FileInputStream("read.txt"); // 文件中为abcde// 定义变量,作为有效个数int len ;// 定义字节数组,作为装字节数据的容器   byte[] b = new byte[2];// 循环读取while (( len= fis.read(b))!=-1) {// 每次读取后,把数组变成字符串打印System.out.println(new String(b));}// 关闭资源fis.close();}
}输出结果:
ab
cd
ed

        错误数据`d`,是由于最后一次读取时,只读取一个字节`e`,数组中,上次读取的数据没有被完全替换,所以要通过`len` ,获取有效的字节,代码使用演示:

public class FISRead {public static void main(String[] args) throws IOException{// 使用文件名称创建流对象.FileInputStream fis = new FileInputStream("read.txt"); // 文件中为abcde// 定义变量,作为有效个数int len ;// 定义字节数组,作为装字节数据的容器   byte[] b = new byte[2];// 循环读取while (( len= fis.read(b))!=-1) {// 每次读取后,把数组的有效字节部分,变成字符串打印System.out.println(new String(b,0,len));//  len 每次读取的有效字节个数}// 关闭资源fis.close();}
}输出结果:
ab
cd
e

> 小贴士:

>

> 使用数组读取,每次读取多个字节,减少了系统间的IO操作次数,从而提高了读写的效率,建议开发中使用。

练习:小文件拷贝
        FileOutputStream fos = new FileOutputStream("a.txt");FileInputStream fis = new FileInputStream("b.txt");byte[] bytes = new byte[1024];int len;long start = System.currentTimeMillis();while((len = fis.read(bytes)) != -1) {fos.write(bytes, 0, len);}fos.close();fis.close();//统计拷贝时间long end = System.currentTimeMillis();System.out.println("拷贝时间:" + (end - start) + "ms");

> 小贴士:

>

> 流的关闭原则:先开后关,后开先关。

字符集

字符集(GBK)

字符集(Unicode)

为什么会有乱码

原因1:

        读取数据时未读完整个汉字

原因2:

        编码和解码时的方式不一样

如何不产生乱码?

1、不要用字节流读取文本文件

2、编码解码时使用同一个码表,同一个编码方式

扩展:

疑问:字节流读取中文会乱码,但是为什么拷贝不会乱码呢?

因为拷贝时,数据源没有丢失,用记事本(采用对应的解码方式)打开不会出现乱码

Java中的编码和解码

字符流

字符流的底层其实就是字节流

字符流=字节流+字符集

特点:

        输入流:一次读一个字节。遇到中文时,一次读多个字节

        输出流:底层会把数据按照指定的编码方式进行编码,变成字节再写到文件中

使用场景

        对于出纯文本文件进行读写操作

FileReader

无参read()代码演示 

        FileReader fileReader = new FileReader("a.txt");//读取数据read()//字符流的底层也是字节流,默认也是一个字节一个字节的读取的//如果遇到中文就会一次读取多个,GBK一次读两个字节,UTF-8一次读3个字节//read()细节//在读取之后,方法的底层还会进行解码并转成十进制//  最终把这个十进制作为返回值//  这个十进制的数据也表示在字符集上的数字//  英文:文件里面二进制数据  0110 0001//          read()方法进行读取,转成十进制97//  中文:文件里面二进制数据  11100110 10110001 10001001//          read()方法进行读取,转成十进制27721//  我想看到中文汉字,就是把这些十进制数据,再进行强转就行了int ch = 0;while ((ch = fileReader.read()) != -1) {System.out.print((char)ch);}fileReader.close();

有参read()代码演示

        FileReader fileReader = new FileReader("a.txt");int len;char[] chars = new char[1024];while((len=fileReader.read(chars))!=-1){System.out.println(new String(chars,0,len));}fileReader.close();

注意:

        无参的ch表示拿到的字符的十进制

        有参的len表示读取到字符的个数

FileWriter

基本写出数据

`write(int b)` 方法,每次可以写出一个字符数据,代码使用演示:

        FileWriter fw = new FileWriter("fw.txt");     // 写出数据fw.write(97); // 写出第1个字符fw.write('b'); // 写出第2个字符fw.write('C'); // 写出第3个字符fw.write(30000); // 写出第4个字符,中文编码表中30000对应一个汉字。/*【注意】关闭资源时,与FileOutputStream不同。如果不关闭,数据只是保存到缓冲区,并未保存到文件。*/// fw.close();输出结果:
abC田

> 小贴士:

>

> 1. 虽然参数为int类型四个字节,但是只会保留一个字符的信息写出。

> 2. 未调用close方法,数据只是保存到了缓冲区,并未写出到文件中。

关闭和刷新

因为内置缓冲区的原因,如果不关闭输出流,无法写出字符到文件中。但是关闭的流对象,是无法继续写出数据的。如果我们既想写出数据,又想继续使用流,就需要`flush` 方法了。

* `flush` :刷新缓冲区,流对象可以继续使用。

* `close `:先刷新缓冲区,然后通知系统释放资源。流对象不可以再被使用了。

代码演示:

public class FWWrite {public static void main(String[] args) throws IOException {// 使用文件名称创建流对象FileWriter fw = new FileWriter("fw.txt");// 写出数据,通过flushfw.write('刷'); // 写出第1个字符fw.flush();fw.write('新'); // 继续写出第2个字符,写出成功fw.flush();// 写出数据,通过closefw.write('关'); // 写出第1个字符fw.close();fw.write('闭'); // 继续写出第2个字符,【报错】java.io.IOException: Stream closedfw.close();}
}

> 小贴士:即便是flush方法写出了数据,操作的最后还是要调用close方法,释放系统资源。

写出其他数据

1. **写出字符数组** :`write(char[] cbuf)` 和 `write(char[] cbuf, int off, int len)` ,每次可以写出字符数组中的数据,用法类似FileOutputStream,代码使用演示:

public class FWWrite {public static void main(String[] args) throws IOException {// 使用文件名称创建流对象FileWriter fw = new FileWriter("fw.txt");     // 字符串转换为字节数组char[] chars = "黑马程序员".toCharArray();// 写出字符数组fw.write(chars); // 黑马程序员// 写出从索引2开始,2个字节。索引2是'程',两个字节,也就是'程序'。fw.write(b,2,2); // 程序// 关闭资源fos.close();}
}

2. **写出字符串**:`write(String str)` 和 `write(String str, int off, int len)` ,每次可以写出字符串中的数据,更为方便,代码使用演示:

public class FWWrite {public static void main(String[] args) throws IOException {// 使用文件名称创建流对象FileWriter fw = new FileWriter("fw.txt");     // 字符串String msg = "黑马程序员";// 写出字符数组fw.write(msg); //黑马程序员// 写出从索引2开始,2个字节。索引2是'程',两个字节,也就是'程序'。fw.write(msg,2,2);	// 程序// 关闭资源fos.close();}
}

续写和换行
public class FWWrite {public static void main(String[] args) throws IOException {// 使用文件名称创建流对象,可以续写数据FileWriter fw = new FileWriter("fw.txt",true);     // 写出字符串fw.write("黑马");// 写出换行fw.write("\r\n");// 写出字符串fw.write("程序员");// 关闭资源fw.close();}
}
输出结果:
黑马
程序员

> 小贴士:字符流,只能操作文本文件,不能操作图片,视频等非文本文件。

>

> 当我们单纯读或者写文本文件时  使用字符流 其他情况使用字节流

字符流综合练习

练习1:拷贝

        需求:拷贝一个文件夹,考虑子文件夹

public class Test01 {public static void main(String[] args) throws IOException {//拷贝一个文件夹,考虑子文件夹//1.创建对象表示数据源File src = new File("D:\\aaa\\src");//2.创建对象表示目的地File dest = new File("D:\\aaa\\dest");//3.调用方法开始拷贝copydir(src,dest);}/** 作用:拷贝文件夹* 参数一:数据源* 参数二:目的地** */private static void copydir(File src, File dest) throws IOException {dest.mkdirs();//递归//1.进入数据源File[] files = src.listFiles();//2.遍历数组for (File file : files) {if(file.isFile()){//3.判断文件,拷贝FileInputStream fis = new FileInputStream(file);FileOutputStream fos = new FileOutputStream(new File(dest,file.getName()));byte[] bytes = new byte[1024];int len;while((len = fis.read(bytes)) != -1){fos.write(bytes,0,len);}fos.close();fis.close();}else {//4.判断文件夹,递归copydir(file, new File(dest,file.getName()));}}}
}

练习2:文件加密

        需求:为了保证文件的安全性,就需要对原始文件进行加密存储,再使用的时候再对其进行解密处理。

        加密原理:对原始文件中的每一个字节数据进行更改,然后将更改以后的数据存储到新的文件夹中

        解密原理:读取加密之后的文件,按照加密的规则反向操作,变成原始文件

public class Test02 {public static void main(String[] args) throws IOException {/*为了保证文件的安全性,就需要对原始文件进行加密存储,再使用的时候再对其进行解密处理。加密原理:对原始文件中的每一个字节数据进行更改,然后将更改以后的数据存储到新的文件中。解密原理:读取加密之后的文件,按照加密的规则反向操作,变成原始文件。^ : 异或两边相同:false两边不同:true0:false1:true100:110010010: 10101100100^ 0001010__________1101110^ 0001010__________1100100*/}public static void encryptionAndReduction(File src, File dest) throws IOException {FileInputStream fis = new FileInputStream(src);FileOutputStream fos = new FileOutputStream(dest);int b;while ((b = fis.read()) != -1) {fos.write(b ^ 2);}//4.释放资源fos.close();fis.close();}}

练习3:修改文件中的数据

文本文件中有以下的数据:

        2-1-9-4-7-8

将文件中的数据进行排序,变成以下的数据:

        1-2-4-7-8-9

public class test {public static void main(String[] args) throws IOException {//读取数据FileReader fileReader =new FileReader("a.txt");StringBuilder stringBuilder=new StringBuilder();int ch;while ((ch=fileReader.read())!=-1){stringBuilder.append((char)ch);}fileReader.close();//排序String str=stringBuilder.toString();String[] str1=str.split("-");ArrayList<Integer> list=new ArrayList<>();for (String s : str1) {int i=Integer.parseInt(s);list.add(i);}Collections.sort(list);System.out.println(list);//写出FileWriter fileWriter=new FileWriter("b.txt");for (int i = 0; i < list.size(); i++) {if(i==list.size()-1){fileWriter.write(list.get(i)+"");}else {fileWriter.write(list.get(i)+"-");}}fileWriter.close();}
}

简化写法

        //排序Integer[] integers = Arrays.stream(stringBuilder.toString().split("-")).map(Integer::parseInt).sorted().toArray(Integer[]::new);System.out.println();//写出FileWriter fileWriter = new FileWriter("b.txt");String s = Arrays.toString(integers).replace(", ","-");String result = s.substring(1, s.length() - 1);System.out.println(result);fileWriter.write(result);fileWriter.close();

细节1:

        文件中的数据不要换行

细节2:bom头

相关文章:

Java--IO基本流

IO流 概述 生活中&#xff0c;你肯定经历过这样的场景。当你编辑一个文本文件&#xff0c;忘记了ctrls &#xff0c;可能文件就白白编辑了。当你电脑上插入一个U盘&#xff0c;可以把一个视频&#xff0c;拷贝到你的电脑硬盘里。那么数据都是在哪些设备上的呢&#xff1f;键盘…...

结合大语言模型的机械臂抓取操作简单介绍

一、大语言模型与机械臂抓取的基本操作 1. 大语言模型简介 大语言模型是基于深度学习技术构建的自然语言处理模型&#xff0c;能够生成、理解和处理文本信息。这些模型通过训练大量的文本数据&#xff0c;学习语法、上下文和常识&#xff0c;能够执行多种任务&#xff0c;如文…...

Vivado - BD(差分时钟、简单分频、RESET、KEY)

目录 1. 简介 1.1 要点 1.2 buffer 介绍 2. vivado 工程 2.1 Block Design 2.2 IBUFDS 2.3 BUFGCE_DIV 2.4 Processor System Reset 2.5 key_mod 2.6 led_drv 3. 编译与调试 3.1 XDC 3.2 Debug 4. 总结 1. 简介 1.1 要点 了解 Utility Buffer v2.2 中的 Buffer…...

7--苍穹外卖-SpringBoot项目中套餐管理 详解(一)

前言 目录 新增套餐 需求分析和设计 代码开发 根据分类id查询菜品 Controller层 Service层 ServiceImpl层 Mapper层 DishMapper.xml 新增套餐 实体类 mapper层 Service层 ServiceImpl层 Mapper层 SetmealMapper.xml setmealDishMapper.xml 套餐分页查询 需求分…...

【尚硅谷】RocketMQ 消息队列学习笔记

RocketMQ 和 Kafka 消息队列概念比较&#xff1f; 好的&#xff01;RocketMQ 和 Kafka 都是分布式消息队列系统&#xff0c;它们的核心概念有很多相似之处&#xff0c;但在具体实现和命名上有所不同。下面我通过一个表格来对比 RocketMQ 和 Kafka 中的五个概念&#xff1a;消息…...

C题(三)芝麻开门 --- strcmp函数应用

场景一&#xff1a;“芝麻开门 ”是通往C语言的大门的暗号&#xff0c;现在你需要说对暗号&#xff0c;大门才会打开。 【分解目标1】字符串的输入 char arr[20] { 0 }; //字符的集合---字符串&#xff08;数组表示&#xff09;//20为预定的数组的大小scanf("%s", a…...

C++函数模板、选择排序实现(从大到小)

template <class T> void mysw (T &a , T &b) {T temp b;b a;a temp; }template <class T> void muSort( T &arr ,int len) {//该实现为选择排序(高到低)for (int i 0; i < len; i) {int max i ; //首先默认本次循环首位元素为最大for (int j …...

EasyExcel使用介绍

EasyExcel使用 1、EasyExcel介绍 1.1 官网介绍 传统操作Excel大多都是利用Apach POI进行操作的&#xff0c;但是POI框架并不完善&#xff0c;使用过程非常繁琐且有较多的缺陷&#xff1a; 动态操作Excel非常繁琐,对于新手来说&#xff0c;很难在短时间内上手;读写时需要占用…...

字段临时缓存包装器

前言 在实际开发中&#xff0c;我们有时候存在一种需求&#xff0c;例如对于某个字段&#xff0c;我们希望在某个明确的保存节点前对字段的修改都仅作为缓存保留&#xff0c;最终是否应用这些修改取决于某些条件&#xff0c;比如玩家对游戏设置的修改可能需要玩家明确确认应用修…...

Python(三)——列表

文章目录 创建列表访问下标遍历列表元素新增元素查找元素删除元素连接列表切片操作 创建列表 创建列表主要有两种方式 [ ]表示一个空的列表 a [] print(type(a)) # <class list> print(a) # []通过list()的方式来创建一个空列表 a list() print(type(a)) # …...

MySQL--三大范式(超详解)

目录 一、前言二、三大范式2.1概念2.2第一范式&#xff08;1NF&#xff09;2.3第二范式&#xff08;2NF&#xff09;2.3第三范式&#xff08;3NF&#xff09; 一、前言 欢迎大家来到权权的博客~欢迎大家对我的博客进行指导&#xff0c;有什么不对的地方&#xff0c;我会及时改进…...

追梦无Bug的软件世界

追梦无Bug的软件世界&#xff1a;测试人员的视角与探索 我有一个梦想&#xff0c;今天我们共同承载着一个愿景&#xff1a;创造一个没有Bug的软件世界。 我梦想有一天&#xff0c;用户将享受到完全无Bug的软件体验&#xff0c;用户不再因为软件中的Bug而感到困扰和沮丧。 我梦…...

在C#中使用Redis实现高效消息队列

使用Redis实现C#中的消息队列 Redis是一种开源的内存数据结构存储系统,因其高性能和灵活性被广泛用于缓存、数据库和消息队列等场景。本文将详细介绍如何在C#中使用Redis实现一个简单的消息队列,涵盖环境准备、代码实现和使用示例。 1. 环境准备 1.1 安装Redis 首先,确保…...

微服务JMeter解析部署使用全流程

目录 1、介绍 2、下载 3、运行 4、设置简体中文版 5、开始测试 1、添加线程组 2、添加监听器 3、添加请求 先.测试userController里的查询方法 6、查看结果 1、查看结果树 2、汇总报告 3、聚合报告 7、JMeter报错 1、介绍 Apache JMeter 是 Apache 组织基于 Java…...

Python 从入门到实战32(数据库MySQL)

我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;通过熟练掌握python基础&#xff0c;然后结合经典实例、实践相结合&#xff0c;使我们完全掌握python&#xff0c;并做到独立完成项目开发的能力。 上篇文章我们讨论了数据库编程接口操作的相关知识。今天我们将学习…...

hrnet训练的pt模型结合目标检测进行关键点识别的更准确前向推理

本篇在将图像输入hrnet识别之前先进行目标检测来确定识别的位置&#xff0c;让识别更加精准。 本段代码设置了一个区域框BOX&#xff0c;让人走入区域内才开始检测&#xff0c;适用于考核等场景&#xff0c;也可以直接去掉BOX也是一样的效果。若画面背景中有多个行人&#xff0…...

Leetcode 3306. Count of Substrings Containing Every Vowel and K Consonants II

Leetcode 3306. Count of Substrings Containing Every Vowel and K Consonants II 1. 解题思路2. 代码实现 题目链接&#xff1a;3306. Count of Substrings Containing Every Vowel and K Consonants II 1. 解题思路 这一题的话思路上就是一个滑动窗口&#xff0c;考察没一…...

算法笔记(五)——分治

文章目录 算法笔记&#xff08;五&#xff09;——分治快排颜色分类排序数组数组中的第K个最大元素库存管理 III 归并排序数组交易逆序对的总数计算右侧小于当前元素的个数翻转对 算法笔记&#xff08;五&#xff09;——分治 分治算法字面上的解释是“分而治之”&#xff0c;就…...

多级侧边菜单(递归)

需要编写两个文件 aside-menu.vue 和 menu-item.vue menu-item.vue <script setup> defineOptions({name: MenuItem}) defineProps({menuList: Array}) </script><template><template v-for"menu of menuList"><!-- 如果当前有子菜单&a…...

JavaScript break与continue语句

break语句和continue语句都具有跳转作用&#xff0c;可以让代码不按既有的顺序执行。 break break语句用于跳出代码块或循环 for(i0;i<100;i){if(i5){break;}console.log(i);} continue continue语句用于应即终止本轮循环,返回循环结构的头部&#xff0c;开始下一轮循环。…...

算法【从递归入手一维动态规划】

动态规划&#xff1a;用空间代替重复计算&#xff0c;包含一整套原理和技巧的总和。后面会有非常多的文章介绍动态规划。 有些递归在展开计算时&#xff0c;总是重复调用同一个子问题的解&#xff0c;这种重复调用的递归变成动态规划很有收益。如果每次展开都是不同的解&#…...

Linux中的进程间通信之共享内存

共享内存 共享内存示意图 共享内存数据结构 struct shmid_ds {struct ipc_perm shm_perm; /* operation perms */int shm_segsz; /* size of segment (bytes) */__kernel_time_t shm_atime; /* last attach time */__kernel_time_t shm_dtime; /* last detach time */__kerne…...

第18周 3-过滤器

过滤器&#xff08;Filter&#xff09;概念总结 什么是过滤器 过滤器&#xff08;Filter&#xff09;是Java Web应用中用于统一拦截和处理请求的组件&#xff0c;类似于现实生活中的空气净化器或安检。它通过对请求进行前置处理&#xff0c;确保请求符合特定要求。 过滤器的…...

Linux之进程概念

作者主页&#xff1a; 作者主页 本篇博客专栏&#xff1a;Linux专栏 创作时间 &#xff1a;2024年9月28日 基本概念&#xff1a; 进程说白了其实就是一个程序的执行实例&#xff0c;正在执行的程序。 在内核层面来说&#xff0c;就是一个担当分配资源&#xff08;CPU时间…...

小程序-使用npm包

目录 Vant Weapp 安装 Vant 组件库 使用 Vant 组件 定制全局主题样式 API Promise化 1. 基于回调函数的异步 API 的缺点 2. 什么是 API Promise 化 3. 实现 API Promise 化 4.调用 Promise 化之后的异步 API 小程序对 npm 的支持与限制 目前&#xff0c;小程序中已经…...

【springboot】整合沙箱支付

目录 1. 配置沙箱应用环境2. 配置springboot项目1. 引入依赖2. 配置文件注册下载ngrok 3. 创建支付宝支付服务类4. 支付界面模板5. 控制类实现支付6. 测试 1. 配置沙箱应用环境 使用支付宝账号登录到开放平台控制台。 使用支付宝登录后&#xff0c;看到以下页面&#xff0c;下…...

技术速递|Python in Visual Studio Code 2024年9月发布

排版&#xff1a;Alan Wang 我们很高兴地宣布将于 2024 年 9 月发布适用于 Visual Studio Code 的 Python 和 Jupyter 扩展&#xff01; 此版本包括以下公告&#xff1a; Django 单元测试支持使用 Pylance 从 inlay 提示转到定义 如果您有兴趣&#xff0c;可以在我们的 Pyth…...

数据结构-3.5.队列的顺序实现

一.队列的顺序实现&#xff0c;初始化操作以及判断队列是否为空&#xff1a; 1.图解&#xff1a; 2.代码&#xff1a; #include<stdio.h> #define MaxSize 10 //定义一个队列最多存储的元素个数 ​ typedef struct {int data[MaxSize]; //用静态数组存放队列元素int f…...

preconnect 预解析

preconnect 是一种浏览器优化技术&#xff0c;用于告诉浏览器提前与指定的域名建立连接&#xff0c;包括DNS解析、TCP握手和TLS协商&#xff08;如果适用&#xff09;。这样做可以减少客户端在请求资源时所需的往返时间&#xff08;RTT&#xff09;&#xff0c;从而提高页面加载…...

Leecode热题100-283.移动零

给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0]示例 2: 输入: nums [0] 输出: […...

中职网站建设教学计划/h5制作

我很少写博文&#xff0c;今天就随便的写点自己的心得与体悟&#xff0c;虽谈不上深度&#xff0c;但是有自己的理解&#xff0c;也别出新意。下面我就分层次的逐步的讲讲学习网络的一点体会 一说“网络”这词&#xff0c;大伙应该知道是与硬件打交道的吧&#xff0c;路由器、交…...

react做的电商网站能上线吗/江阴百度推广公司

一&#xff0c;assert() assert宏的原型定义在<assert.h>中&#xff0c;其作用是如果它的条件返回错误&#xff0c;则终止程序执行&#xff0c;原型定义&#xff1a; #include <assert.h> void assert( int expression );assert的作用是现计算表达式 expression &…...

dede做漫画网站的案例/广告设计需要学什么

前言 这段时间我已经在一个公司实习了&#xff0c;虽然工资不高&#xff0c;我并没有太多的介意。但是有一点是我不舒服的&#xff0c;负责我们部门的经理助理似乎看不起实习生&#xff0c;对我有些轻蔑。主要是他技术也不是很牛逼那种。整个公司用的技术还是比较落后那种。当我…...

好的网站设计题目/百度热搜广告设计公司

1.重载是指允许存在多个同名函数&#xff0c;而这些函数的参数表不同&#xff08;或许参数个数不同&#xff0c;或许参数类型不同&#xff0c;或许两者都不同&#xff09;。实现原理上&#xff1a;编译器根据函数不同的参数表&#xff0c;对同名函数的名称做修饰&#xff0c;然…...

wordpress 建站 电子书/怎么让百度搜出自己

一句话总结通过ls -al查看命令软链接对应的真实地址。背景众所周知&#xff0c;npm可以注册bin命令&#xff0c;用于global或者local的npm scripts调用如"scripts": {"start": "react-scripts start","build": "react-scripts bu…...

注册域名费用/整站优化 mail

说到作文&#xff0c;大家肯定都不陌生吧&#xff0c;作文是一种言语活动&#xff0c;具有高度的综合性和创造性。你所见过的作文是什么样的呢&#xff1f;下面是小编精心整理的四年级期中考试反思作文300字&#xff0c;仅供参考&#xff0c;大家一起来看看吧。四年级期中考试反…...