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

Java IO流(超详细!!!)

Java IO流

文章目录

  • Java IO流
    • 1.文件相关基础普及
      • 1.1 常用文件操作
      • 1.3 目录的操作和文件删除
    • 2.IO流原理及流的分类
      • 2.1 字节流
        • 2.1.1 InputStream:字节输入流
        • 2.1.2 OutputStream
      • 2.2 字符流
        • 2.2.1 Reader
        • 2.2.1 Writer
      • 2.3 节点流和处理流
        • 2.3.1节点流
        • 2.3.2 处理流
          • 2.3.2.1 处理流设计模式
          • 2.3.2.2 缓冲流
            • 2.3.2.2.1 字节缓冲输入流
            • 2.3.2.2.1 字符缓冲流
          • 2.3.3 对象处理流
            • 2.3.3.1序列化与反序列化
            • 2.3.3.1 OjectOutputStream与OjectOutputStream
            • 2.3.3.2 对象处理流使用细节
      • 2.4 转换流
        • 2.4.1 InputStreamReader :
        • 2.4.1 OutputStreamWriter

在这里插入图片描述

1.文件相关基础普及

创建文件对象相关构造器和相关方法:

new File(String pathname)//根据路径构建一个File对象

new File(File parent, String child),/根据父目录文件+子路径构建

new File(String parent,String child)//根据父目录+子路径构建

createNewFile(); 创建新文件

接下来我们通过一个简单的例子,实现文件创建

package io;import java.io.File;
import java.io.IOException;public class ioTest01 {public static void main(String[] args) {String filePath = "/Users/Zhuanz1/Desktop/大三下Java就业/java网络/netTest/src/io/test.txt";//文件具体路径File file = new File(filePath);try {file.createNewFile();System.out.println("创建成功!");} catch (IOException e) {e.printStackTrace();}}
}

在这个例子中,我们使用绝对路径/Users/Zhuanz1/Desktop/大三下Java就业/java网络/netTest/src/io/test.txt将文件创建出来。

1.1 常用文件操作

在这里插入图片描述

文件操作中,常用的关键词有以下几个:getName, getAbsolutePath, getParent, length, exists ,isFile,isDirectory。包含获取文件名,获取文件的绝对路径,文件的父目录,长度等。

1.3 目录的操作和文件删除

mkdir创建一级目录、mkdirs创建多级目录、delete删除空目录或文件

在这里插入图片描述

文件创建案例:

package com.example;import java.io.File;public class FileTest01 {public static void main(String[] args) {try {File file = new File("src/main/resources/test");file.mkdir();System.out.println("创建成功!");}catch (Exception e) {e.printStackTrace();};}
}

在此案例中,我们根据指定创建了一个test文件夹。

2.IO流原理及流的分类

IO 即 Input/Output,输入和输出。数据输入到计算机内存的过程即输入,反之输出到外部存储(比如数据库,文件,远程主机)的过程即输出。数据传输过程类似于水流,因此称为 IO 流。IO 流在 Java 中分为输入流和输出流,而根据数据的处理方式又分为字节流和字符流。

Java IO 流的 40 多个类都是从如下 4 个抽象类基类中派生出来的。

  • InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。
  • OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流。

2.1 字节流

2.1.1 InputStream:字节输入流

InputStream用于从源头(通常是文件)读取数据(字节信息)到内存中,java.io.InputStream抽象类是所有字节输入流的父类。

package com.example;import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;public class InputStreamTest01 {public static void main(String[] args) {String fileAddress = "src/main/resources/file1.txt";File file = new File(fileAddress);// 确保父目录存在File parentDir = file.getParentFile();if (parentDir != null && !parentDir.exists()) {parentDir.mkdirs(); // 创建必要的父目录System.out.println("已创建目录:" + parentDir.getPath());}// 使用 try-with-resources 管理资源try (Scanner scanner = new Scanner(System.in);OutputStream outputStream = new FileOutputStream(file);InputStream inputStream = new FileInputStream(file)) {// 检查文件是否存在if (file.exists()) {System.out.println("文件已经存在!");} else {System.out.println("文件创建成功!");}// 获取用户输入并写入文件System.out.println("你可以记录的所感所想:");String record = scanner.nextLine();outputStream.write(record.getBytes(StandardCharsets.UTF_8)); // 指定 UTF-8 编码outputStream.flush(); // 确保数据写入文件// 读取文件内容并输出byte[] buffer = new byte[1024];int len;while ((len = inputStream.read(buffer)) != -1) {System.out.print(new String(buffer, 0, len, StandardCharsets.UTF_8));}} catch (IOException e) {System.err.println("操作文件时发生错误:" + e.getMessage());e.printStackTrace();}}
}

这个 Java 程序的功能是通过用户输入记录文本到文件,并读取文件内容显示出来。

在资源管理中使用 try-with-resources 语句初始化 Scanner(用于用户输入)、FileOutputStream(用于写文件)和 FileInputStream(用于读文件),确保资源自动关闭。

在这里插入图片描述

实现文件成功创建,并且将我们的输入的字段输出出来。

不过,一般我们是不会直接单独使用 FileInputStream ,通常会配合 BufferedInputStream(字节缓冲输入流,后文会讲到)来使用。

2.1.2 OutputStream

OutputStream用于将数据(字节信息)写入到目的地(通常是文件),java.io.OutputStream抽象类是所有字节输出流的父类。

通过这个例子:使用OutputStream在文件“file1.txt"中写入“i love you so”,若文件不存在,则创建

package com.example;import java.io.FileOutputStream;
import java.io.IOException;public class OutputSteamTest01 {public static void main(String[] args) throws IOException {String fileAdress = "src/main/resources/file1.txt";//操作目标文件路径int length = 0;byte[] buf = new byte[1024];//缓冲区FileOutputStream fileInputStream = null;try {fileInputStream = new FileOutputStream(fileAdress,true);//读取文件  加了true 实现文件不覆盖写入String str = "i love you so";fileInputStream.write(str.getBytes());//getBytes()String方法有将str转为byte类型System.out.println("写入成功!");} catch (Exception e) {e.printStackTrace();}finally {fileInputStream.close();}}
}

结果如下:成功写入~

在这里插入图片描述

类似于 FileInputStreamFileOutputStream 通常也会配合 BufferedOutputStream(字节缓冲输出流,后文会讲到)来使用。

FileOutputStream fileOutputStream = new FileOutputStream("output.txt");
BufferedOutputStream bos = new BufferedOutputStream(fileOutputStream)

2.2 字符流

不管是文件读写还是网络发送接收,信息的最小存储单元都是字节。 那为什么 I/O 流操作要分为字节流操作和字符流操作呢?

个人认为主要有两点原因:

  • 字符流是由 Java 虚拟机将字节转换得到的,这个过程还算是比较耗时。
  • 如果我们不知道编码类型就很容易出现乱码问题。

乱码问题这个很容易就可以复现,我们只需要将上面提到的 FileInputStream 代码示例中的 input.txt 文件内容改为中文即可,原代码不需要改动。

可以很明显地看到读取出来的内容已经变成了乱码。

因此,I/O 流就干脆提供了一个直接操作字符的接口,方便我们平时对字符进行流操作。如果音频文件、图片等媒体文件用字节流比较好,如果涉及到字符的话使用字符流比较好。

字符流默认采用的是 Unicode 编码,我们可以通过构造方法自定义编码。

Unicode 本身只是一种字符集,它为每个字符分配一个唯一的数字编号,并没有规定具体的存储方式。UTF-8、UTF-16、UTF-32 都是 Unicode 的编码方式,它们使用不同的字节数来表示 Unicode 字符。例如,UTF-8 :英文占 1 字节,中文占 3 字节。

2.2.1 Reader

Reader用于从源头(通常是文件)读取数据(字符信息)到内存中,java.io.Reader抽象类是所有字符输入流的父类。

Reader 用于读取文本, InputStream 用于读取原始字节。

Reader 常用方法:

  • read() : 从输入流读取一个字符。
  • read(char[] cbuf) : 从输入流中读取一些字符,并将它们存储到字符数组 cbuf中,等价于 read(cbuf, 0, cbuf.length)
  • read(char[] cbuf, int off, int len):在read(char[] cbuf) 方法的基础上增加了 off 参数(偏移量)和 len 参数(要读取的最大字符数)。
  • skip(long n):忽略输入流中的 n 个字符 ,返回实际忽略的字符数。
  • close() : 关闭输入流并释放相关的系统资源。

InputStreamReader 是字节流转换为字符流的桥梁,其子类 FileReader 是基于该基础上的封装,可以直接操作字符文件。

FileReader 代码示例:

try (FileReader fileReader = new FileReader("input.txt");) {int content;long skip = fileReader.skip(3);System.out.println("The actual number of bytes skipped:" + skip);System.out.print("The content read from file:");while ((content = fileReader.read()) != -1) {System.out.print((char) content);}
} catch (IOException e) {e.printStackTrace();
}

输出:

The actual number of bytes skipped:3
The content read from file:我是Guide。
2.2.1 Writer

Writer用于将数据(字符信息)写入到目的地(通常是文件),java.io.Writer抽象类是所有字符输出流的父类。

Writer 常用方法:

  • write(int c) : 写入单个字符。
  • write(char[] cbuf):写入字符数组 cbuf,等价于write(cbuf, 0, cbuf.length)
  • write(char[] cbuf, int off, int len):在write(char[] cbuf) 方法的基础上增加了 off 参数(偏移量)和 len 参数(要读取的最大字符数)。
  • write(String str):写入字符串,等价于 write(str, 0, str.length())
  • write(String str, int off, int len):在write(String str) 方法的基础上增加了 off 参数(偏移量)和 len 参数(要读取的最大字符数)。
  • append(CharSequence csq):将指定的字符序列附加到指定的 Writer 对象并返回该 Writer 对象。
  • append(char c):将指定的字符附加到指定的 Writer 对象并返回该 Writer 对象。
  • flush():刷新此输出流并强制写出所有缓冲的输出字符。
  • close():关闭输出流释放相关的系统资源。

FileWriter 代码示例:

try (Writer output = new FileWriter("output.txt")) {output.write("你好,我是Guide。");
} catch (IOException e) {e.printStackTrace();
}

2.3 节点流和处理流

2.3.1节点流

1.节点流可以从一个特定的数据源读写数据,如:FileReader、FileWriter;

在这里插入图片描述

如上图,就是javaIO中所有的的节点流与处理流,包括字节和字符类型。

例如下图,当我们需要操作一个文件时,那么我们就可以通过节点流,利用file文件类型,使用fileReader实现文件的读取。
在这里插入图片描述

同理,当我们需要操作别的类型时,就调用别的类型的节点流,即可实现不用数据类型的内容读取。
在这里插入图片描述

例如我们在上一章节使用过的一个例子,我们需要通过操作目标文件实现写入。我们使用了FileOutputStream节点流处理文件类型数据,实现文件读取功能。

package com.example;import java.io.FileOutputStream;
import java.io.IOException;public class OutputSteamTest01 {public static void main(String[] args) throws IOException {String fileAdress = "src/main/resources/file1.txt";//操作目标文件路径int length = 0;byte[] buf = new byte[1024];//缓冲区FileOutputStream fileInputStream = null;try {fileInputStream = new FileOutputStream(fileAdress,true);//读取文件  加了true 实现文件不覆盖写入String str = "i love you so";fileInputStream.write(str.getBytes());//getBytes()String方法有将str转为byte类型System.out.println("写入成功!");} catch (Exception e) {e.printStackTrace();}finally {fileInputStream.close();}}
}

由此我们可以得出,针对不同数据源,我们就选择相对应的节点流。直接操作数据源,这种方式也相对底层,无法对数据源进行修改删除操作。只能实现简单读取功能。

2.3.2 处理流
2.3.2.1 处理流设计模式

2.处理流(包装流)是“连接”在已存在的流(节点流或处理流)之上,为程序提供更为强大的读写能力,如:BufferedReader、BufferedWriter;

简单来说,就无须管文本输入输出类型,直接操作数据源。

在这里插入图片描述

例如我们后面会介绍到的BufferWriter,我们可以通过BufferWriter操作各种数据类型。更加灵活!

2.3.2.2 缓冲流
2.3.2.2.1 字节缓冲输入流

IO 操作是很消耗性能的,缓冲流将数据加载至缓冲区,一次性读取/写入多个字节,从而避免频繁的 IO 操作,提高流的传输效率。

字节缓冲流这里采用了装饰器模式来增强 InputStreamOutputStream子类对象的功能。

举个例子,我们可以通过 BufferedInputStream(字节缓冲输入流)来增强 FileInputStream 的功能。只

// 新建一个 BufferedInputStream 对象
BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream("input.txt"));

字节流和字节缓冲流的性能差别主要体现在我们使用两者的时候都是调用 write(int b)read() 这两个一次只读取一个字节的方法的时候。由于字节缓冲流内部有缓冲区(字节数组),因此,字节缓冲流会先将读取到的字节存放在缓存区,大幅减少 IO 次数,提高读取效率。

我使用 write(int b)read() 方法,分别通过字节流和字节缓冲流复制一个 524.9 mb 的 PDF 文件耗时对比如下

使用缓冲流复制PDF文件总耗时:15428 毫秒
使用普通字节流复制PDF文件总耗时:2555062 毫秒

两者耗时差别非常大,缓冲流耗费的时间是字节流的 1/165。

测试代码如下:

@Test
void copy_pdf_to_another_pdf_buffer_stream() {// 记录开始时间long start = System.currentTimeMillis();try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("深入理解计算机操作系统.pdf"));BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("深入理解计算机操作系统-副本.pdf"))) {int content;while ((content = bis.read()) != -1) {bos.write(content);}} catch (IOException e) {e.printStackTrace();}// 记录结束时间long end = System.currentTimeMillis();System.out.println("使用缓冲流复制PDF文件总耗时:" + (end - start) + " 毫秒");
}@Test
void copy_pdf_to_another_pdf_stream() {// 记录开始时间long start = System.currentTimeMillis();try (FileInputStream fis = new FileInputStream("深入理解计算机操作系统.pdf");FileOutputStream fos = new FileOutputStream("深入理解计算机操作系统-副本.pdf")) {int content;while ((content = fis.read()) != -1) {fos.write(content);}} catch (IOException e) {e.printStackTrace();}// 记录结束时间long end = System.currentTimeMillis();System.out.println("使用普通流复制PDF文件总耗时:" + (end - start) + " 毫秒");
}

在结束时,我们只需要关闭外层处理流即可,底层会去关闭节点流。

2.3.2.2.1 字符缓冲流

BufferedReader (字符缓冲输入流)和 BufferedWriter(字符缓冲输出流)类似于 BufferedInputStream(字节缓冲输入流)和BufferedOutputStream(字节缓冲输入流),内部都维护了一个字节数组作为缓冲区。不过,前者主要是用来操作字符信息。

2.3.3 对象处理流

既可以保存数据的值,也可以保存数据的数据类型;使得数据被保存到文件中后,还能够从文件中恢复。

作用 :

 eg1 : 一个基本类型数据 int i = 5; ,对象处理流可以将i变量的值5和它的数据类型int都保存到文件中;
   eg2 : 一个引用类型数据 Cat cat = new Cat("bubble", 5, "white");,对象处理流可以将cat变量的值String-"bubble", int-5, String-"white"都保存下来,还可以记录下它的数据类型是Cat类型。
2.3.3.1序列化与反序列化

序列化——*保存数据的值和数据类型到文件中*

反序列化——*将文件中保存的数据(包含值和数据类型)重新恢复成数据本身*

​ 如下图所示 :

在这里插入图片描述

2.3.3.1 OjectOutputStream与OjectOutputStream

ObjectOutputStream继承自OutputStream类;它可以实现数据的序列化。ObjectOutputStream类同样使用了“修饰器模式”,即该类中有一个OutputStream的引用变量(存在于OutputStream类的静态内部类BlockDataOutputStream中)。

ObjectInputStream类继承自InputStream类;它可以实现数据的反序列化。ObjectInputStream类同样使用了“修饰器模式”,即该类中有一个InputStream的引用变量(存在于InputStream类中的静态内部类PeekInputStream中)。

2.3.3.2 对象处理流使用细节

关于序列化的一些细节

 1° 序列化或者反序列化的对象必须实现实现Serializable接口;并且序列化和反序列化时写入数据与读取数据的顺序必须一致。2° 序列化类中,建议添加serialVersionUID,可以提高版本的兼容性。3° 序列化对象时,默认要将里面所有属性都进行序列化,但不包括static和transient修饰的成员。4° 序列化对象时,要求里面的属性的类型也要实现序列化接口。(eg : String, Integer等类已实现了序列化)5° 序列化具备可继承性,即如果某个类实现了序列化,默认其所有子类也实现了序列化。(eg : Number ---> Serializable)

2.4 转换流

若在txt文件中出现中文,并且该文件没有使用UTF-8形式编码;在使用IO流读取文件时就会出现乱码问题。

转换流可以解决乱码问题,转换流可以将字节流转成字符流,同时指定读取文件时按照怎样的编码方式。

常见转换流有两个 —— InputStreamReaderOutputStreamWriter

2.4.1 InputStreamReader :

*InputStreamReader是Reader抽象类的一个子类,因此它本身属于字符流范畴*。完成转换所调用的构造器如下,需要传入一个InputStream类的子类对象,以及一个编码类型。

package csdn.knowledge.api_tools.iocurrent.transformation;import java.io.*;
import static java.nio.charset.StandardCharsets.UTF_8;public class InputStreamReader_Demo {public static void main(String[] args) throws IOException {InputStreamReader inputStreamReader =new InputStreamReader(new FileInputStream("D:\\JAVA\\IDEA\\file\\3.txt"), UTF_8);BufferedReader bufferedReader = new BufferedReader(inputStreamReader);String data;while ((data = bufferedReader.readLine()) != null) {System.out.println(data);}bufferedReader.close();}
}

在这里插入图片描述

2.4.1 OutputStreamWriter

*OutputStreamWriter类继承自Writer类,转换方法与InputStreamWriter同理****。 以OutputStreamWriter_Demo类为演示类,代码如下 :

package csdn.knowledge.api_tools.iocurrent.transformation;import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;/*** @author : Cyan_RA9* @version : 21.0*/
public class OutputStreamWriter_Demo {public static void main(String[] args) throws IOException {OutputStreamWriter outputStreamWriter =new OutputStreamWriter(new FileOutputStream("D:\\JAVA\\IDEA\\fileEX\\1.txt"), "UTF-16");outputStreamWriter.write("Space-X, 星舰发射!");outputStreamWriter.close();}
}

在这里插入图片描述

以上便是Java IO流中的全部内容,欢迎站中大佬指出不足,笔者编写不宜,恳求一枚点赞收藏评论!!

相关文章:

Java IO流(超详细!!!)

Java IO流 文章目录 Java IO流1.文件相关基础普及1.1 常用文件操作1.3 目录的操作和文件删除 2.IO流原理及流的分类2.1 字节流2.1.1 InputStream:字节输入流2.1.2 OutputStream 2.2 字符流2.2.1 Reader2.2.1 Writer 2.3 节点流和处理流2.3.1节点流2.3.2 处理流2.3.2…...

规则联动引擎GoRules初探

背景说明 嵌入式设备随着物联网在生活和生产中不断渗透而渐渐多起来,数据的采集、处理、分析在设备侧的自定义配置越来越重要。一个可通过图形化配置的数据处理过程,对于加速嵌入式设备的功能开发愈发重要。作为一个嵌入式软件从业者,笔者一…...

Android开发-翻页类视图

在Android应用中,翻页类视图(Paging Views) 是一种非常直观且用户友好的方式来展示内容。无论是用于展示图片轮播、引导页还是分页加载数据列表,翻页效果都能极大地提升用户体验。本文将介绍几种实现翻页效果的常见组件和方法&…...

高能数造闪耀 CIBF 2025,以创新技术引领新能源智造新征程

在全球新能源产业加速发展的关键节点,CIBF 2025 展会成为行业技术与成果交流的重要平台。高能数造(西安)技术有限公司深度参与此次盛会,凭借在新能源电池智能制造领域的深厚积累与创新突破,为行业发展注入强劲动力&…...

数据结构与算法——栈和队列

栈和队列 栈概念与结构栈的实现栈的初始化栈的销毁判断栈是否为空入栈出栈取栈顶元素栈中有效元素个数 队列概念与结构队列的实现队列结点结构队列结构初始化队列队列判空销毁队列入队列,队尾出队列,队头取队头数据取队尾数据队列有效数据个数 栈 概念与…...

新电脑软件配置三 pycharm

快捷键放大和缩小字体 按住ctrl鼠标滚轮向上 缩小同理...

浅入ES5、ES6(ES2015)、ES2023(ES14)版本对比,及使用建议---ES6就够用(个人觉得)

JavaScript(ECMAScript)的发展经历了多个版本,每个版本都引入了新特性和改进。以下仅是对三个常用版本(ES5、ES6(ES2015) 和 ES2023)的基本对比及使用建议: 目前常见项目中还是用ES6…...

【Odoo】Pycharm导入运行Odoo15

【Odoo】Pycharm导入运行Odoo15 前置准备1. Odoo-15项目下载解压2. PsrtgreSQL数据库 项目导入运行1. 项目导入2. 设置项目内虚拟环境3. 下载项目中依赖4. 修改配置文件odoo.conf 运行Pycharm快捷运行 前置准备 1. Odoo-15项目下载解压 将下载好的项目解压到开发目录下 2. …...

【运营商查询】批量手机号码归属地和手机运营商高速查询分类,按省份城市,按运营商移动联通电信快速分类导出Excel表格,基于WPF的实现方案

WPF手机号码归属地批量查询与分类导出方案 应用场景 ​​市场营销​​:企业根据手机号码归属地进行精准营销,按城市或省份分类制定针对性推广策略​​客户管理​​:快速对客户手机号码进行归属地分类,便于后续客户关系管理​​数…...

中级统计师-统计学基础知识-第四章 假设检验

一、假设检验的基本原理 1. 基本思想 反证法:假设原假设成立,通过样本矛盾性进行反驳小概率原理:设定显著性水平 α \alpha α(通常取 0.05),若观测结果的概率 p ≤ α p \leq \alpha p≤α&#xff0c…...

等于和绝对等于的区别

1. (等于) 特点:比较时会自动进行类型转换(隐式转换),尝试将两边的值转为相同类型后再比较。规则: 如果类型相同,直接比较值。如果类型不同,按以下规则转换: …...

家庭关系处理个人总结

首先要说到前面的是,每个家庭的成员背景环境经济状况不同,原生家庭差异,导致面临具体问题是不同的。就类似软件“没有银弹”的概念,没有一种方法可以解决每个人问题。 举个例子,面对婆媳矛盾 网上父辈的人 会说 百行孝…...

【Python训练营打卡】day29 @浙大疏锦行

DAY 29 复习日 知识点回顾 1. 类的装饰器 2. 装饰器思想的进一步理解:外部修改、动态 3. 类方法的定义:内部定义和外部定义 作业:复习类和函数的知识点,写下自己过去29天的学习心得,如对函数和类的理解,…...

React 19版本refs也支持清理函数了。

文章目录 前言一、refs 支持清理函数二、案例演示1.useEffect写法2.React 19改进 的ref写法 总结 前言 React 19版本发布了ref支持清理函数了,这样就可以达到useEffect一样的效果了。为啥需要清理函数呢,这是因为节约内存。 清理事件监听(避…...

uniapp的适配方式

文章目录 前言✅ 一、核心适配方式对比📏 二、rpx 单位:uni-app 的核心适配机制🧱 三、默认设计稿适配(750宽)🔁 四、字体 & 屏幕密度适配🛠 五、特殊平台适配(底部安全区、刘海…...

Java面试场景:从音视频到AI应用的技术探讨

面试场景:音视频与AI应用技术的碰撞 在某互联网大厂的面试中,面试官王先生与求职者明哥展开了一场关于音视频技术与AI应用的对话。 第一轮提问:音视频场景 面试官:明哥,你能谈谈在音视频场景中,Spring B…...

es聚合-词条统计

es语句 ---普通结构----"tags":{"type": "keyword","index": true},GET /knowledge_test/_search {"size": 0,"aggs": {"tag_count": {"terms": {"field": "tags",&quo…...

【沉浸式求职学习day43】【Java面试题精选3】

沉浸式求职学习 1.Java中this和super的区别2.为什么返回类型不算方法重载3.方法重写时需要注意什么问题4.深克隆和浅克隆有什么区别5.如何实现深克隆6.什么是动态代理7.静态代理和动态代理的区别8.如何实现动态代理?9.JDK Proxy 和 CGLib 有什么区别?10.…...

OpenAI推出Codex — ChatGPT内置的软件工程Agents

OpenAI继续让ChatGPT对开发者更加实用。 几天前,他们增加了连接GitHub仓库的支持,可以"Deep Research"并根据你自己的代码提问。 今天,该公司在ChatGPT中推出了Codex的研究预览版,这是迄今为止最强大的AI编码Agent。 它可以编写代码、修复错误、运行测试,并在…...

Win 11开始菜单图标变成白色怎么办?

在使用windows 11的过程中,有时候开始菜单的某些程序图标变成白色的文件形式,但是程序可以正常打开,这个如何解决呢? 这通常是由于快捷方式出了问题,下面跟着操作步骤来解决吧。 1、右键有问题的软件,打开…...

中级统计师-统计学基础知识-第三章 参数估计

统计学基础知识 第三章 参数估计 第一节 统计量与抽样分布 1.1 总体参数与统计量 总体参数:描述总体特征的未知量(如均值 μ \mu μ、方差 σ 2 \sigma^2 σ2、比例 π \pi π)。统计量:由样本数据计算的量(如样本…...

学习黑客HTTP 请求头

HTTP 请求头(Request Headers)是 HTTP 请求中非常重要的一部分,它们以键值对的形式向服务器传递关于请求的附加信息、客户端的能力或上下文。 理解请求头对于 Web 开发、API 交互、网络调试和安全都至关重要。下面我将常见的 HTTP 请求头字段…...

日志参数含义

一 学习率相关 base_lr:基础学习率,初始设定的学习率 -lr:当前实际使用的学习率,通常是 base_lr 经过学习率调整策略后的值,比如lrbase_lr*(1start_factor) 时间统计 time:每次迭代总时间,单位…...

[Linux]安装吧!我的软件包管理器!

一、常见安装方式 在 Linux 中,有 3 种常见的软件安装方式: (1)yam、apt (2).rpm 安装包安装 (3)源码安装 二、什么是软件包 在 Linux 下安装软件,通常的办法是下载…...

Flink 作业提交流程

Apache Flink 的 作业提交流程(Job Submission Process) 是指从用户编写完 Flink 应用程序,到最终在 Flink 集群上运行并执行任务的整个过程。它涉及多个组件之间的交互,包括客户端、JobManager、TaskManager 和 ResourceManager。…...

牛客网NC276110题解:小红的数组重排

牛客网NC276110题解:小红的数组重排 题目解析 算法思路 对数组进行排序(非降序)检查特殊情况: 如果存在三个连续相等的元素,则无解如果前两个元素都是0,则无解 若不存在特殊情况,则排序后的数…...

从零启动 Elasticsearch

elastic 有弹力的 ElaticSearch (ES)是一个基于 Lucene 的分布式全文检索引擎。可以做到近乎实时地存储、检索数据,并且本身具有良好的扩展性,可以扩展到上百台服务器,处理PB级别(1 Petabyte 1024TB&…...

nginx服务器实验

1.实验要求 1)在Nginx服务器上搭建LNMP服务,并且能够对外提供Discuz论坛服务。 在Web1、Web2服务器上搭建Tomcat 服务。 2)为nginx服务配置虚拟主机,新增两个域名 www.kgc.com 和 www.benet.com,使用http://www.kgc.…...

王树森推荐系统公开课 排序02:Multi-gate Mixture-of-Experts (MMoE)

专家模型 与上一节相同,模型的输入是一个向量,包含用户特征、物品特征、统计特征、场景特征,把向量输入三个神经网络,三个神经网络都是由很多全连接层组成,但是并不共享参数,三个神经网络各输出一个向量&a…...

【OpenCV基础 1】几何变换、形态学处理、阈值分割、区域提取和脱敏处理

目录 一、图像几何变化 1、对图片进行放大、缩小、水平放大和垂直放大 2、旋转、缩放、控制画布大小 二、图像形态学处理 1、梯度运算 2、闭运算 3、礼帽运算 4、黑帽运算 三、图像阈值分割 1、二值化处理 2、反二值化处理 3、截断阈值处理 4、超阈值零处理 5、低…...

代码随想录算法训练营 Day49 图论Ⅰ 深度优先与广度优先

图论 基础 图的概念 图的概念 概念清单有向图 (a)无向图 (b)有向/无向如图 a 所示每条边有指向如图 b 所示每条边没有箭头指向权值每条边的权值每条边的权值度-有几条边连到该节点 (eg V 2 V_2 V2​ 度为 3)入度/出度出度:从该节点出发的边个数入度:…...

LG P9844 [ICPC 2021 Nanjing R] Paimon Segment Tree Solution

Description 给定序列 a ( a 1 , a 2 , ⋯ , a n ) a(a_1,a_2,\cdots,a_n) a(a1​,a2​,⋯,an​),有 m m m 次修改 ( l , r , v ) (l,r,v) (l,r,v): 对每个 i ∈ [ l , r ] i\in[l,r] i∈[l,r],令 a i ← a i v a_i\gets a_iv ai​←…...

PyTorch音频处理技术及应用研究:从特征提取到相似度分析

文章目录 音频处理技术及应用音频处理技术音视频摘要技术音频识别及应用 梅尔频率倒谱系数音频特征尔频率倒谱系数简介及参数提取过程音频处理快速傅里叶变换(FFT)能量谱处理离散余弦转换 练习案例:音频建模加载音频数据源波形变换的类型绘制波形频谱图波形Mu-Law 编…...

【IPMV】图像处理与机器视觉:Lec10 Edges and Lines

【IPMV】图像处理与机器视觉:Lec10 Edges and Lines 本系列为2025年同济大学自动化专业**图像处理与机器视觉**课程笔记 Lecturer: Rui Fan、Yanchao Dong Lec0 Course Description Lec3 Perspective Transformation Lec7 Image Filtering Lec8 Image Pyramid …...

Elasticsearch 初步认识

Elasticsearch 初步认识 1 索引(index) 索引是具有相同结构的文档集合。例如,可以有一个客户信息的索引,包括一个产品目录的索引,一个订单数据的索引。在系统上索引的名字全部小写,通过这个名字可以用来执…...

数据库DDL

数据库DDL(数据定义语言)全面解析 一、DDL定义 DDL(Data Definition Language,数据定义语言)是SQL语言的一个子集,专门用于定义和管理数据库结构。它允许数据库管理员和开发人员创建、修改和删除数据库对象…...

企业级小程序APP用户数据查询系统安全脆弱性分析及纵深防御体系构建

一、用户数据查询系统安全现状分析 1.1 业务场景风险建模 在企业小程序用户数据查询业务中,普遍存在以下安全风险点: ①输入验证缺失:未对姓名、身份证号等关键输入进行严格的格式校验与合法性检查 ②身份认证薄弱:仅依赖基础参数…...

互联网大厂Java面试:从Spring Boot到微服务架构的技术深挖

场景描述 在某互联网大厂的面试会议室里,严肃的面试官老王正审视着面前的程序员明哥。这场面试以业务场景为切入点,围绕Java技术栈展开。 第一轮:基础知识与Spring生态 面试官老王: 明哥,你对Spring Boot的核心功能…...

23种设计模式解释+记忆

一、创建型模式(5种)—— “怎么造对象?” 单例模式(Singleton) 场景:公司的CEO只能有一个。 核心:确保一个类只有一个实例,全局访问。 关键词:唯一、全局访问。 工厂方…...

逻辑与非逻辑的弥聚

非逻辑弥聚与逻辑弥聚是复杂系统中两种不同的信息整合方式。逻辑弥聚侧重于通过明确的规则、规律和结构化方法,将分散的信息或功能进行有序的组织和集中处理,强调理性和确定性。而非逻辑弥聚则更多地涉及情感、直觉、经验等非线性、非结构化的因素&#…...

Python 从列表中删除值的多种实用方法详解

# Python 从列表中删除值的多种实用方法详解 在Python编程中,列表(List)是一种常用的数据结构,具有动态可变的特性。当我们需要从列表中删除元素时,根据不同的场景(如按值删除、按索引删除、批量删除等&…...

C++多线程数据错乱

C多线程数据错乱(也称为线程安全问题或数据竞争)主要是由于多个线程在没有正确同步的情况下,并发访问和修改共享数据导致的。其主要原因包括以下几个方面: 一、线程交替执行导致的非原子操作 线程在执行时,可能会在中途被挂起&a…...

StarRocks Community Monthly Newsletter (Apr)

版本动态 3.4.3 版本更新 核心功能升级 Routine Load和Stream Load新增Lambda表达式支持,支持复杂的列数据提取 增强JSON数据处理能力,支持将JSON Array/Object转为ARRAY/MAP类型 优化information_schema.task_runs视图查询,新增LIMIT支持…...

延时双删-争议与我的思路-001

目录 概括大概思路目的场景思路一退货时间差 思路2思路3 最后 概括 延时双删,是指在代码中删除两次缓存. 第一次自己访问,先删除.之后直接访问数据库获得数据 第二次是指 在第一步之后,在删除一次缓存的数据 大概思路 不进行延时双删的.寻找别的解决方法 目的 主要是为了…...

Tomcat简述介绍

文章目录 Web服务器Tomcat的作用Tomcat分析目录结构 Web服务器 Web服务器的作用是接收客户端的请求,给客户端作出响应。 知名Java Web服务器 Tomcat(Apache):用来开发学习使用;免费,开源JBoss&#xff0…...

掌握版本控制从本地到分布式

一、什么是版本控制? 版本控制是一种记录文件(尤其是源代码)在“时间轴”上变更的系统,主要功能包括: 历史回溯:随时恢复到任意版本的代码或文档;差异比较:查看两个版本之间的改动…...

Linux `touch` 命令深度解析与高阶应用指南

Linux `touch` 命令深度解析与高阶应用指南 一、核心功能解析1. 基本作用2. 与类似操作对比二、选项系统详解1. 基础选项说明2. 时间格式说明三、高阶应用技巧1. 时间戳控制2. 批量文件操作3. 特殊文件处理四、企业级应用场景1. 日志系统维护2. 持续集成系统3. 安全审计跟踪五、…...

Django学习

1:在PyCharm终端: # 查看已安装的Django版本 python -m django --version # 或 pip show django # 卸载当前Django pip uninstall django# 安装指定版本(例如Django 3.2.10) pip install django3.2.10 2. 检查Python版本兼容性 …...

Java IO框架

I/O框架 流 流的分类: 按方向: 输入流:将存储设备的内容读入到内存中 输出流:将内存的内容写入到存储设备中 按单位: 字节流:以字节为单位,可以读取所有数据 字符流:以字符为单…...

Spring AI Alibaba集成阿里云百炼大模型

1.准备工作 开发环境&#xff1a;JDK17、SpringBoot3.x 2.引入maven依赖 <?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&q…...