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

IO 流分类

一、File

File 类(磁盘操作)可以用于表示文件和目录的信息,但是它不表示文件的内容。递归地列出一个目录下所有文件:

public static void listAllFiles(File dir) {if (dir == null || !dir.exists()) {return;}if (dir.isFile()) {System.out.println(dir.getName());return;}for (File file : dir.listFiles()) {listAllFiles(file);}
}

二、IO 概述

什么是 IO: 磁盘与内存之间的数据交互,可以看做是一种数据的流动,按照流动方向,以内存为基准,分为输入 input 和输出 output,即流向内存的是输入流,流出内存的是输出流。Java IO操作主要是指使用 java.io包下的内容,进行输入、输出操作。输入也叫读取数据,输出也叫写出数据。

IO 的分类: 根据数据的流向分为:输入流和输出流。根据数据的类型分为:字节流(以字节为单位)和字符流(以字符为单位)。

输入流输出流
字节流InputStreamOutputStream
字符流ReaderWriter

三、字节流

一切文件数据(文本、图片、视频)在存储时,都是以二进制数字的形式保存,传输时也是如此。所以,字节流可以传输任意文件数据,在操作流的时候,我们要时刻明确,无论使用什么样的流对象,底层传输始终为二进制数据。

字节输入流InputStreamjava.io.InputStream抽象类是表示字节输入流的所有类的超类,可以读取字节信息到内存。它定义了字节输入流的基本共性。

public abstract int read() 从输入流读取数据的下一个字节
public int read(byte b[] b)从输入流中读取一些字节数,并将它们存储到字节数组b中
public int read(byte b[] b, int off, int len)off 写入数据的位置,数组中的起始偏移量。从输入流读取多达len字节的数据到字节数
public void close()关闭此输入流并释放与此流相关联的任何资源
// 读取数据
public abstract int read()// 将读取到的数据放在 byte 数组中,该方法实际上是根据下面的方法实现的,off 为 0,len 为数组的长度
public int read(byte b[])// 从第 off 位置读取 len 长度字节的数据放到 byte 数组中,流是以 -1 来判断是否读取结束的
public int read(byte b[], int off, int len)// 跳过指定个数的字节不读取,想想看电影跳过片头片尾
public long skip(long n)// 返回可读的字节数量
public int available()// 读取完,关闭流,释放资源
public void close()// 标记读取位置,下次还可以从这里开始读取,使用前要看当前流是否支持,可以使用 markSupport() 方法判断
public synchronized void mark(int readlimit)// 重置读取位置为上次 mark 标记的位置
public synchronized void reset()// 判断当前流是否支持标记流,和上面两个方法配套使用
public boolean markSupported()

字节输出流OutputStreamjava.io.OutputStream抽象类是表示字节输出流的所有类的超类,它定义了字节流的基本共性功能方法。

public abstract void write(int b) 将指定的字节写入此输出流
public void write(byte b[])将 b.length字节从指定的字节数组写入此输出流
public void write(byte b[], int off, int len)从指定的字节数组写入 len字节,从偏移量 off开始输出到此输出流
public void flush()刷新此输出流并强制任何缓冲的输出字节被写出
public void close()关闭此输出流并释放此流相关联的任务系统资源
//写入一个字节,可以看到这里的参数是一个 int 类型,对应上面的读方法,int 类型的 32 位,只有低 8 位才写入,高 24 位将舍弃。
public abstract void write(int b)// 将数组中的所有字节写入,和上面对应的 read() 方法类似,实际调用的也是下面的方法。
public void write(byte b[])// 将 byte 数组从 off 位置开始,len 长度的字节写入
public void write(byte b[], int off, int len)// 强制刷新,将缓冲中的数据写入
public void flush()// 关闭输出流,流被关闭后就不能再输出数据了
public void close()

四、文件流

FileInputStream把硬盘中的数据读取到内存中

/*** java.io.InputStream: 字节输入流。 此抽象类是表示字节输入流的所有类的超类。* java.io.FileInputStream extends InputStream: 文件输入流* 作用:把硬盘文件中的数据,读取到内存中** 构造方法:public FileInputStream(String name)   文件路径*          public FileInputStream(File file)    文件* 构造方法的作用:*      1、创建一个 FileInputStream 对象;*      2、会把 FileInputStream对象指向构造方法中创建的文件*  java程序--JVM--OS读取方法--读取文件*  1个中文 GBK占两个字节 UTF-8占3个字节*/
public class MyInputStream {public static void main(String[] args) {FileInputStream fis = null;/*** JDK7 新特性【了解】  在 try 后边可以增加一个() ,在括号中定义流对象,那么这个流对象的作用域就在 try中有效,* try 中的代码执行完毕,会自动把流对象释放,不用写 finally。多个流用 ;号隔开* 例如:  try(FileInputStream fis = new FileInputStream("test.txt");*            FileOutputStream fos = new FileOutputStream("test.txt");){}** JDK9 新特性【了解】*      在 try前边定义流对象*      在 try 括号中引入流对象名称 ,不用写 finally* 例如:*       FileInputStream fis = new FileInputStream("test.txt");*       FileOutputStream fos = new FileOutputStream("test.txt");*      try(fis ; fos){}*/try {//1、创建 FileInputStream对象,参数为绑定的数据源fis = new FileInputStream("D:/test.txt");//2、读取文件 read ,当读到结尾的时候返回 -1 , 注意需要用一个变量来接收 read返回值,不要读两次/*int len = 0;while((len = fis.read())!= -1){System.out.println((char)len);};*//***  一次读取多个字节的方法,byte[] 起到缓冲作用,存储每次读取到的字节个数。数组的长度一般定义为1024(1kb)或整数倍*/byte[] bytes = new byte[2];int lens = fis.read(bytes);System.out.println(lens);//2 每次读取字节的个数System.out.println(Arrays.toString(bytes)); //[97, 98]System.out.println(new String(bytes));//ab} catch (IOException e) {e.printStackTrace();}finally {if(fis != null){//3、关闭流try {fis.close();} catch (IOException e) {e.printStackTrace();}}}}
}

​FileOutputStream把内存中的数据写入到硬盘的文件中

/*** FileOutputStream: 文件输出流,将内存数据写入到文件中* 构造方法: FileOutputStream(String name) 传入一个文件的路径*           FileOutputStream(File file)  传入一个文件*           FileOutputStream(String name,boolean append) 当 append为true 的时候,就不会覆盖文件,继续在文件的末尾追加写数据* 构造方法的作用:*     1、创建一个 FileOutputStream 对象*     2、会根据构造方法中传递的文件/文件路径,创建一个空的文件*     3、会把 FileOutputStream 对象指向创建好的文件* 写数据的原理*      java程序---JVM--- OS(操作系统)---将数据写入文件中*  写换行:换行符*      windows \r\n*      linux /n*      max /r*/
public class MyOutputStream {public static void main(String[] args) {FileOutputStream  fos = null;{try {//1、创建一个 FileOutputStream对象fos = new FileOutputStream("D:/test.txt");/*** 2、调用 FileOutputStream对象的 writer方法,将数据写入文件*  会把十进制的整数,转为二进制存入硬盘.任意的记事本,打开时都会查询编码表,把字节转为字符表示。查询 ASKII码*  所以 test.txt中存的是 d*/fos.write(100);//写出多个字节byte[] b = "你好".getBytes();fos.write(b);} catch (IOException e) {e.printStackTrace();}finally {if(fos != null){//3、释放资源,流使用会占用一定的内存,因此需要释放try {fos.close();} catch (IOException e) {e.printStackTrace();}}}}}
}

五、字符流

当使用字节流读取文本时,可能会有一个问题。就是遇到中文字符时,可能不会显示完整的字符,因为一个中文字符可能占用多个字节存储。所以 Java提供一些字符流,以字符为单位读写数据,专门用于处理文本文件。

字符输入流【Reader】:java.io.Reader 抽象类是读取字符流所有类的超类,可以读取字符信息到内存中。它定义了字符输入流的基本共性功能方法:

public int read() 从输入流读取一个字符
public int read(char cbuf[])从输入流中读取一些字符,并将它们存储到字符数组 cbuf中
abstract public void close()关闭此流并释放与此流相关联的任何系统资源

FileReader 文件字符输入流,继承 InputStreamReader 。

/*** 字符输入流 Reader 输入流的最顶层父类* FileReader 构造方法:*      FileReader(String fileName)*      FileReader(File file)* 作用:*      1、创建一个 FileReader 对象*      2、会把 FileReader 对象指向要读取的文件***/
public class MyReader {public static void main(String[] args) {FileReader fr = null;try {//1、创建 FileReader对象,参数中绑定读取的资源fr = new FileReader("test.txt");//2、使用 read读取当个字符并返回int len = 0;/*while((len = fr.read()) != -1){System.out.print((char)len); //你好!}*///读取多个字符char[] cs = new char[1024];while((len = fr.read(cs)) != -1){System.out.printf(new String(cs,0,len));}} catch (IOException e) {e.printStackTrace();}finally {if(fr != null){//3、释放资源try {fr.close();} catch (IOException e) {e.printStackTrace();}}}}
}

字符输出流【Writer】:java.io.Writer 抽象类是所有输出字符流的最顶层父类。它定义了字符输入流的基本共性功能方法:

public void write(int c) 写入单个字符
public void write(char cbuf[])写入字符数组
abstract public void write(char cbuf[], int off, int len) 写入字符数组的某一部分
public void write(String str) 写入字符串
public void write(String str, int off, int len)写入字符串的某一部分
abstract public void flush() 刷新流的缓冲
abstract public void close() 关闭此流,但先要刷新它
FileWriter 文件字符输出流,继承 OutputStreamReader ```java /** * FileWriter 文件字符输出流 * 作用:把内存中的数据写入到文件中 * 构造方法: * public FileWriter(String fileName) 传入文件的路径 * public FileWriter(File file) 传入一个文件 * public FileWriter(String fileName , boolean append) 传入文件的路径 append=true 的时候不覆盖文件,在文件后面 append的输出 * * public FileWriter(File file , boolean append) 传入一个文件 * 构造方法的作用: * 1、会创建一个 FileWriter对象; * 2、会创建一个文件,根据传入的参数 * 3、将 FileWriter对象指向创建好的文件 */ public class MyWriter { public static void main(String[] args) { FileWriter fw = null; try { //1、创建 FileWriter对象,绑定要写入数据的目的地 fw = new FileWriter("test.txt"); //2、使用 writer 将数据写入到内存缓冲区中(字符转化为字节的过程) char[] cs = {'a','b','c'}; fw.write(cs); fw.write("你好!"); //3、使用 flush 将缓冲区中的数据刷新到文件中 //fw.flush(); } catch (IOException e) { e.printStackTrace(); }finally { if(fw != null){ //4、关闭流,会触发 flush方法 try { fw.close(); } catch (IOException e) { e.printStackTrace(); } } } } } ```

六、Properties 集合

/*** java.util.Properties 集合 extends Hashtable<k,v>*     Properties 类表示一个持久的属性集。Properties 可保存在流中或从流中加载。*     Properties 集合是一个唯一和 IO流相结合的集合,*          可以使用集合中的方法 store() ,把集合中的临时数据,持久化到硬盘中*                             load(), 把硬盘中的数据读取到集合中*     Properties 集合是一个双列集合,key 和 value 都是字符串**/
public class MyProperties {public static void main(String[] args) {// 使用 Properties 集合存储数据,遍历取出数据//1、创建 Properties 对象Properties prop = new Properties();//2、添加数据prop.setProperty("you","小三");prop.setProperty("mine","正房");prop.setProperty("she","小四");/*** 3、将数据写入到磁盘中保存* store(OutputStream out, String comments)* store(Writer writer, String comments)   可以写中文*/FileReader fr = null;FileWriter fw = null;try {fw = new FileWriter("test.txt");fr = new FileReader("test.txt");/*** 文件中的内容如下:* #save data* #Sun Nov 01 16:26:13 CST 2020* you=小三* she=小四* mine=正房*/prop.store(fw, "save data");  //第二个参数是注释/*** load 将文件中的数据读取:*     存储键值对的文件中,键与值默认的连接符号可以是 =,空格(其它符号)*     # 表示注释*     键和值默认都是字符串*/Properties propRead = new Properties();propRead.load(fr);//将在数据到 PropertiesSet<String> strings = propRead.stringPropertyNames();//获取 key列表/*** 输入为:*      you = 小三*      she = 小四*      mine = 正房*/for(String key: strings){System.out.println(key + " = " + propRead.get(key));}} catch (IOException e) {e.printStackTrace();}finally {if(fw != null && fr != null){try {fw.close();fr.close();} catch (IOException e) {e.printStackTrace();}}}}
}

七、缓冲流

缓冲流也叫高效流,是对 4个基本的 Filexxx流的增强,所以也是4个流,按照数据类型分为:
【1】字节缓冲流:BufferedInputStream,BufferedOutputStream
【2】字符缓冲流:BufferedReader,BufferedWriter
缓冲流的基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲数组,通过缓冲区读写,减少系统 IO次数,从而提高效率。

字节缓冲输出流:BufferedOutputStream

/***  继承 OutputStream 提高写入效率*  构造方法:*      BufferedOutputStream(OutputStream out) 创建一个新的缓冲区输出流,以将数据写入指定的底层输出流,默认缓冲区大小= 8192*      BufferedOutputStream(OutputStream out, int size)  创建一个新的缓冲区输出流,以将具体指定缓冲区大小的数据写入底层输出流*/
public class MyBufferedOutputStream {public static void main(String[] args) {FileOutputStream fos = null;BufferedOutputStream bos = null;try {//1、创建字节输出流 FileOutputStreamfos = new FileOutputStream("test.txt");//2、创建缓冲流 BufferedOutputStreambos = new BufferedOutputStream(fos);//3、使用 writer 方法写入内部缓冲区中bos.write("使用内部缓冲区".getBytes());//4、flush 将内部缓冲区的数据刷新到文件中bos.flush();} catch (IOException e) {e.printStackTrace();}finally {if(bos != null){//5、close 关闭流,会先执行 flush后关闭try {bos.close(); //会自动关闭 fos.close();} catch (IOException e) {e.printStackTrace();}}}}
}

字节缓冲输入流:BufferedInputStream

/*** 继承 InputStream 称为 字节缓冲输入流* 构造方法:*      BufferedInputStream(InputStream in)*      public BufferedInputStream(InputStream in, int size)*/
public class MyBufferedInputStream {public static void main(String[] args) {//1、创建 FileInputStream对象FileInputStream fis = null;BufferedInputStream bis = null;try {fis = new FileInputStream("test.txt");//2、创建 BufferedInputStream 对象,提高 FileInputStream对象读取的效率bis = new BufferedInputStream(fis);//3、使用 read方法读取数据int len = 0;byte[] bytes = new byte[1024];while((len = bis.read(bytes)) != -1){System.out.println(new String(bytes,0,len));}} catch (IOException e) {e.printStackTrace();}finally {//4、关闭流if(bis != null){try {bis.close(); //自动关闭 fis} catch (IOException e) {e.printStackTrace();}}}}
}

BufferedWriter :新方法 newLine() 表示换行,替换了 “\r\n" BufferedReader:新方法 readLine() 读取一个文本行,读取一行数据。如果到达流末尾,则返回 null。

八、转换流

字符编码 Character Encoding:就是一套自然语言的字符与二进制数之间的对应规则;
字符集 Charset:也叫编码表。是一个系统支持的所有字符的集合,包括各国家文字、标点符号、图形符号、数字等。常见字符集有 ASCII、GBK、Unicode字符集。

在 IDEA中,使用 FileReader读取项目中的文本文件,由于 IDEA 默认使用 UTF-8编码,所有没有任何问题。但是当读取 Windows系统中创建的文本文件时,由于 Windows系统的默认是 GBK编码,就会出现乱码。

转化流 InputStreamReader:是 Reader的子类,是从字节流到字符流的桥梁,他读取字节,并使用指定的字符集将其解码为字符,它的字符集可以由名称指定,也可以接收平台默认的字符集。

/*** InputStreamReader:是 Reader的子类,是从字节流到字符流的桥梁,他读取字节,并使用指定的字符集将其解码为字符,它的字符集可以由名称指定,也可以接收平台默认的字符集。* 构造方法:*      InputStreamReader(InputStream in)*      InputStreamReader(InputStream in, String charsetName)*/
public class MyInputStreamReader {public static void main(String[] args) {//1、创建 InputStreamReader对象,构造方法中传入字节输入流和指定的编码表名称  指定的编码要与文件的编码相同,否则会发生乱码;InputStreamReader isr = null;try {isr = new InputStreamReader(new FileInputStream("text.txt"), "GBK");//2、使用 read 方法读取文件int len = 0;while((len = isr.read()) != -1){System.out.println((char)len);}} catch (IOException e) {e.printStackTrace();}finally {if(isr != null){//3、释放资源try {isr.close();} catch (IOException e) {e.printStackTrace();}}}}
}

OutputStreamWriter:是 Writer的子类,是从字符流到字节流的桥梁,他写入数据,并使用指定的字符集将其编码为字符,它的字符集可以由名称指定,也可以接收平台默认的字符集。

/*** java.io.OutputStreamWriter 继承了 Writer* OutputStreamWriter 是字符流通向字节流的桥梁,可使用指定的 charset 将要写入流中的字符编码成字节。* 构造方法:*      OutputStreamWriter(OutputStream out) 使用默认的字符编码*      OutputStreamWriter(OutputStream out, Charset cs)  可以指定字符编码,不区分大小写**/
class MyOutputStreamWriter {public static void main(String[] args) {//1、创建一个 OutputStreamWriter 对象OutputStreamWriter osw = null;try {osw = new OutputStreamWriter(new FileOutputStream("text.txt"), "GBK");//2、使用 writer 写出数据osw.write("你好");//3、flush 刷新数据osw.flush();} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally {//4、关闭流if(osw != null){try {osw.close();} catch (IOException e) {e.printStackTrace();}}}}
}

九、序列化流

把对象以流的方式写入到文件中保存,对象中不仅仅是字符,也有字节。就有了 ObjectOutputStream[对象的序列化 writeObject§] 和 ObjectInputStream[对象的反序列化 readObject()]

ObjectOutputStream 对象序列化流:

/*** java.io.ObjectOutputStream extends OutputStream* 构造器:*      ObjectOutputStream(OutputStream out) 创建写入指定 OutputStream 的 ObjectOutputStream*      特有的成员方法:writeObject*/
public class MyObjectOutputStream {public static void main(String[] args) {//1、创建 ObjectOutputStream 对象,构造方法中传递字节输出流ObjectOutputStream oos = null;try {oos = new ObjectOutputStream(new FileOutputStream("text.txt"));//2、通过 writeObject 把对象写入到文件中oos.writeObject(new Person("张三",1));//通过二进制序列化流存储的,无法打开查看。} catch (IOException e) {e.printStackTrace();}finally {//3、关闭流try {oos.close();} catch (IOException e) {e.printStackTrace();}}}
}

ObjectInputStream 对象反序列化流:

/*** java.io.ObjectInputStream 继承了 InputStream 将对象从文件中读取使用* 构造方法:*      ObjectInputStream(InputStream in) 创建从指定 InputStream 读取的 ObjectInputStream* 特有的方法:*      readObject() 返回一个 object对象** transient 关键字:*       static 关键字:静态关键字,被 static修饰的成员变量不能被序列化的,序列化的都是对象的默认值。transient 与 static的作用是一样的,但却没有 static的含义* Person对象需要实现 Serializable 并且要定义序列化ID* 集合类的存储和对象相同*/
public class MyObjectInputStream {public static void main(String[] args) {//1、创建 ObjectInputStream对象,构造方法中传递字节输入流ObjectInputStream ois = null;try {ois = new ObjectInputStream(new FileInputStream("text.txt"));//2、使用 readObject 方法读取对象Person o = (Person)ois.readObject();//4、对象使用} catch (Exception e) {e.printStackTrace();}finally {if(ois != null){//3、释放资源try {ois.close();} catch (IOException e) {e.printStackTrace();}}}}
}

十、打印流

PrintStream:我们常用的 System.out.println 就是打印流。

/*** 可以打印各种数据值表示形式,不会抛出 IOException,有特有的方法 print println* 构造方法:*      PrintStream(File file) 输出的是一个文件*      PrintStream(OutputStream out) 输出的是一个字节输出流*      PrintStream(String fileName) 输出的是一个文件路径* 继承了 OutputStream 拥有该成员中的方法* 注意事项:如果使用继承自父类中的 write方法写数据,那么会查询编码表。如果使用 print 就会原样使用。* 可以改变输出语句的目的地:System.setOut() 目的地通过参数传递*/
public class MyPrintStream {public static void main(String[] args) throws FileNotFoundException {//创建打印流,绑定要输出的目的地PrintStream ps = new PrintStream("text.txt");//使用 write 和 print写数据ps.write(97);//文件中为 aps.print(97);//文件中为 97//设置输出流打印的目的地System.setOut(ps);System.out.println("此打印信息会在 text.txt文件中显示");//释放资源ps.close();}
}

十一、网络通信

【1】InetAddress:用于表示网络上的硬件资源,即 IP地址。没有公有的构造函数,只能通过静态方法来创建实例。

InetAddress.getByName(String host);
InetAddress.getByAddress(byte[] address);

【2】URL:统一资源定位符。可以直接从 URL中读取字节流数据。

public static void main(String[] args) throws IOException {URL url = new URL("http://www.baidu.com");/* 字节流 */InputStream is = url.openStream();/* 字符流 */InputStreamReader isr = new InputStreamReader(is, "utf-8");/* 提供缓存功能 */BufferedReader br = new BufferedReader(isr);String line;while ((line = br.readLine()) != null) {System.out.println(line);}br.close();
}

【3】Sockets:使用 TCP协议实现网络通信;ServerSocket:服务器端类,Socket:客户端类。服务器和客户端通过 InputStream 和 OutputStream 进行输入输出。

【4】Datagram:使用 UDP协议实现网络通信。DatagramSocket:通信类。DatagramPacket:数据包类。

思考: Java 字节读取流的 read方法返回 int的原因?
读取二进制数据按字节读取,每次读一个字节(byte)。read()的底层是由 C++实现的,返回的是 unsigned byte,取值范围为[0~255],在 java中 byte只能表示 [-128,127]的无符号数,所以只能用 int类型接收,Java接收得到的就是 int[0~255]。

相关文章:

IO 流分类

一、File File 类&#xff08;磁盘操作&#xff09;可以用于表示文件和目录的信息&#xff0c;但是它不表示文件的内容。递归地列出一个目录下所有文件&#xff1a; public static void listAllFiles(File dir) {if (dir null || !dir.exists()) {return;}if (dir.isFile())…...

JVM的主要组成部分,以及它们的作用。JVM中的内存区域有哪些,它们各自的作用是什么?什么是Java的堆内存,它如何影响程序的性能?

JVM的主要组成部分&#xff0c;以及它们的作用 JVM&#xff08;Java虚拟机&#xff09;的主要组成部分包括类加载器&#xff08;Class Loader&#xff09;、运行时数据区&#xff08;Runtime Data Area&#xff09;、执行引擎&#xff08;Execution Engine&#xff09;、本地库…...

Qt QWidget以及各种控件、布局 核心属性(适合入门使用时查询)

目录 1. QWidget核心属性 2. 按钮类控件 2.1 PushButton 核心属性 2.2 RadioButton 核心属性 2.3 CheckBox 和 Tool Button 核心属性 3. 显示类控件 3.1 Label 核心属性 3.2 LCDNumber 核心属性 3.3 ProgressBar 核心属性 3.4 Calendar Widget 核心属性 4. 输入类控…...

svg图片构造QGraphicsSvgItem对象耗时很长的问题解决

目录 1. 问题的提出 2. 问题解决 1. 问题的提出 今天通过一张像素为141 * 214&#xff0c;大小为426KB的svg格式的图片构造QGraphicsSvgItem对象&#xff0c;再通过Qt的Graphics View Framework框架&#xff0c;将QGraphicsSvgItem对象显示到场景视图上&#xff0c;代码如下&…...

边坡位移监测设备:守护工程安全的前沿科技

随着现代工程建设的飞速发展&#xff0c;边坡位移监测作为预防山体滑坡、泥石流等自然灾害的重要手段&#xff0c;日益受到人们的关注。边坡位移监测设备作为这一领域的关键技术&#xff0c;以其高精度、实时监测的特点&#xff0c;成为守护工程安全的重要武器。 一、边坡位移…...

Qt使用单例模式读取xml文件

Qt使用单例模式读取xml文件 一、单例模式介绍1、什么是单例模式2、为什么使用单例模式3、什么情况下使用单例模式4、使用单例模式需要注意哪些问题线程安全 5、单例模式的类型6、单例类的特点 2、单例模式的实现2.1懒汉式2.2饿汉式 一、单例模式介绍 1、什么是单例模式 单例模…...

备战蓝桥杯 Day6(学习动态规划)

引入 支付问题 假设有无限多的硬币&#xff0c;硬币面值为1,5,11。现在需要支付15元&#xff0c;问最少使用的硬币数&#xff1f; 贪心策略&#xff1a;1511*11*4&#xff0c;145 真正的答案153*5 3 dp的两个性质 最优子结构无后效性 dp的两大要素 1.状态2.状态转移方程 思路…...

【uniapp】自定义步骤条样式

代码实现 <view class"steps-wrap"><view class"flex-box"><view class"number active-number">1</view><view class"desc active-desc">步骤1</view><view :class"[line, activeStep …...

UE5 C++ UObject实例化

一.创建UObject C类 在MyObject中声明结构体FMyDataTableStruct 在MyPawn里面&#xff0c;先将头文件里包含 MyObject.h 在MyPawn中声明一个UMyObject类型的指针 TSubclassOf 是提供 UClass 类型安全性的模板类。例如您在创建一个投射物类&#xff0c;允许设计者指定伤害类型…...

Appium环境安装与架构介绍

Appium架构 Appium 设计哲学 不需要为了自动化而重新编译或修改被测应用不应该让移动端自动化测试限定在某种语言或者某个具体的框架不要为了移动端的自动化测试而重新造轮子移动端自动化测试应该是开源的 Appium 架构 Appium 架构图如下&#xff1a; Appium 的核心是一个 …...

Vue+Vite项目初建(axios+Unocss+iconify)

一. 创建项目 npx --package vue/cli vue 项目成功启动后&#xff0c;进入http://localhost:3200&#xff0c;即可进入创建好的页面(假设启动端口为3200) 二. 测试网络通讯模块 假设有本地服务器地址localhost:8000提供接口服务&#xff0c;接口为localhost:8000/token&#…...

ASUS华硕枪神8笔记本电脑G614JIR,G814JVR,G634JYR,G834JZR工厂模式出厂Windows11系统 带重置还原功能

适用ROG枪神8系列笔记本型号&#xff1a; G614JIR、G614JVR、G634JYR、G634JZR G814JIR、G814JVR、G834JYR、G834JZR 链接&#xff1a;https://pan.baidu.com/s/1tYZt6XFNC2d6YmwTbtFN7A?pwd3kp8 提取码&#xff1a;3kp8 带有ASUS RECOVERY恢复功能、自带所有驱动、出厂主…...

Python入门:常用模块—xml模块

xml是实现不同语言或程序之间进行数据交换的协议&#xff0c;跟json差不多&#xff0c;但json使用起来更简单 xml的格式如下&#xff0c;就是通过<>节点来区别数据结构的: <data> <country name"Liechtenstein"> <rank updated"yes"…...

蓝队应急响应工具箱v2024.1​

1 蓝队工具箱 v2024.1 2 简介 蓝队工具箱是为打造一款专业级应急响应的集成多种工具的工具集&#xff0c;由真实应急响应环境所用到的工具进行总结打包而来&#xff0c;由 ChinaRan404,W 啥都学,清辉等开发者编写.把项目现场中所用到的工具连同环境一同打包&#xff0c;并实…...

Linux中获取字符串长度与获取子字符串

一、 获取字符串长度 #!/bin/bash string"jobs" echo ${string} # 输出结果: jobs echo ${#string} # 输出结果: 4 二、提取子字符串 以下实例从字符串第 2 个字符开始截取 4 个字符&#xff1a; #!/bin/bash str"敢于亮剑决不后退" echo ${str:2:…...

Rust语言之sha-256爆破

文章目录 一、实现Sha-256加密1.创建项目2.编写Cargo.toml文件3.编写程序代码 二、sha256爆破1.获取命令行参数2.读取文件3.校验输入参数4.暴力破解 一、实现Sha-256加密 SHA-256是一种安全哈希算法&#xff0c;主要特点是将输入的数据&#xff08;无论长度&#xff09;通过特定…...

Rust中的字符串处理及相关方法详解

在Rust中&#xff0c;字符串是一种非常重要的数据类型&#xff0c;而String类型则提供了对动态可变字符串的支持。本文将介绍一些常见的字符串处理方法以及相关示例代码。 创建字符串 在Rust中&#xff0c;有多种方式创建字符串&#xff0c;以下是一些常见的例子&#xff1a;…...

NS安装-CentOS服务器安装Nightscout CGM

NS CGM 安装必要条件 有自己的云服务器好像没有2&#xff0c;有云服务器就行了 安装顺序 先安装数据库&#xff0c;目前支持的是 MongoDB &#xff0c;官方推荐4&#xff0c;其实目前最新版本就行。可以用宝塔安装&#xff0c;比较简单克隆代码&#xff0c;我是放到 /opt/ns…...

利用ChatGPT提升工作效率

随着科技的飞速发展&#xff0c;人工智能逐渐成为我们生活的一部分。ChatGPT作为一种先进的自然语言处理技术&#xff0c;已经在各个领域取得了显著的成果。本文将探讨如何利用ChatGPT提升工作效率&#xff0c;让我们的生活变得更加便捷。 一、什么是ChatGPT&#xff1f; ChatG…...

django admin页面美化

美化 Django Admin 页面可以通过多种方式实现&#xff0c;从简单的 CSS 样式调整到完全自定义模板。以下是一些建议和步骤来美化 Django Admin 页面&#xff1a; 1. 使用 CSS 覆盖默认样式 这是最简单的方法&#xff0c;你可以通过添加自定义 CSS 文件来覆盖 Django Admin 的…...

Git 操作以及Git 常见问题

Git 操作 git 教程&#xff1a;https://www.runoob.com/git/git-tutorial.html 基本概念 工作区&#xff1a;克隆项目到本地后&#xff0c;项目所在的文件夹&#xff1b; 暂存区&#xff1a;从工作区添加上来的变更&#xff08;新增&#xff0c;修改&#xff0c;删除&#xff…...

如何学习和规划类似ChatGPT这种人工智能(AI)相关技术

学习和规划类似ChatGPT这种人工智能&#xff08;AI&#xff09;相关技术的路径通常包括以下步骤&#xff1a; 学习基础知识&#xff1a; 学习编程&#xff1a;首先&#xff0c;你需要学习一种编程语言&#xff0c;例如Python&#xff0c;这是大多数人工智能项目的首选语言。数学…...

4 月 9 日至 4 月 10 日,Hack.Summit() 2024 首聚香江

Hack.Summit() 是一系列 Web3 开发者大会。2024 年的活动将于 2024 年 4 月 9 日至 4 月 10 日在香港数码港举行。自十年前首次举办以来&#xff0c;此次会议标志着 Hack.Summit() 首次在亚洲举办&#xff0c;香港被选为首次亚洲主办城市&#xff0c;这对 Hack VC 和该地区都具…...

[力扣 Hot100]Day29 删除链表的倒数第 N 个结点

题目描述 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 出处 思路 两个指针间隔n&#xff0c;一趟遍历解决。 代码 class Solution { public:ListNode* removeNthFromEnd(ListNode* head, int n) {ListNode* phead;ListNode* …...

探索设计模式的魅力:掌握命令模式-解锁软件设计的‘遥控器’

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;并且坚持默默的做事。 引言&#xff1a;探索命令模式的奥秘 软件设计领域充满挑战与机遇&#xff0c;命令模式…...

LNMP搭建discuz论坛

discuz论坛是一种网络论坛软件&#xff0c;也称bbs&#xff0c;它是一种用于在互联网上建立论坛社区的程序系统。只哟中功能强大的论坛软件&#xff0c;可以帮助用户建立一个专业、完善的论坛社区&#xff0c;并且可以实现多种功能&#xff0c;如搭建用户注册、登录、查看主题、…...

257.【华为OD机试真题】幼儿园篮球游戏(贪心算法-JavaPythonC++JS实现)

🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目二.解题思路三.题解代码Python题解代码JAVA题解…...

[计算机网络]深度学习传输层TCP协议

&#x1f493; 博客主页&#xff1a;从零开始的-CodeNinja之路 ⏩ 收录专栏&#xff1a;深度学习传输层TCP协议 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 [计算机网络]深度学习传输层TCP协议 前提概括一: TCP协议段格式二:确认应答三:超时重传四:…...

动态头部:统一目标检测头部与注意力

摘要 在目标检测中&#xff0c;定位与分类相结合的复杂性导致了各种方法的蓬勃发展。以前的工作试图提高在不同的目标检测头的性能&#xff0c;但未能呈现一个统一的视图。在本文中&#xff0c;我们提出了一种新的动态头部框架来统一目标检测头部和注意力。通过在尺度感知的特…...

【状态估计】深度传感器与深度估计算法(1/3)

深度传感器与深度估计算法 深度传感器概念 获得空间中目标位置或距离的传感器&#xff0c;按接收的媒介波来源可分为主动式和被动式两大范畴&#xff0c;主动式包括激光雷达、雷达、超声波传感器等&#xff0c;被动式主要为单目、多目相机等&#xff0c;同时两大类可组合为混…...

ClickHouse从入门到精通(高级)

第1章 Explain查看执行计划 第2章 建表优化 第3章 ClickHouse语法优化规则 第4章 查询优化 第5章 数据一致性(重点) 第6章 物化视图 第7章 MaterializeMySQL引擎 第8章 常见问题排查...

什么是Docker的容器编排工具,它们之间有何不同?

随着Docker容器技术的广泛应用&#xff0c;容器编排工具成为了自动化部署、扩展和管理容器化应用程序的关键组件。这些工具提供了一种抽象层&#xff0c;帮助开发者和管理员更高效地管理大量的Docker容器&#xff0c;确保它们在不同的主机和环境中能够可靠地运行。目前&#xf…...

qml之Control类型布局讲解,padding属性和Inset属性细讲

1、Control布局图 2、如何理解&#xff1f; *padding和*Inset参数如何理解呢&#xff1f; //main.qml import QtQuick 2.0 import QtQuick.Controls 2.12 import QtQuick.Layouts 1.12 import QtQuick.Controls 1.4 import QtQml 2.12ApplicationWindow {id: windowvisible: …...

【Jvm】性能调优(拓展)Jprofiler如何监控和解决死锁、内存泄露问题

文章目录 Jprofiler简介1.安装及IDEA集成Jprofiler2.如何监控并解决死锁3.如何监控及解决内存泄露(重点)4.总结5.后话 Jprofiler简介 Jprofilers是针对Java开发的性能分析工具(免费试用10天), 可以对Java程序的内存,CPU,线程,GC,锁等进行监控和分析, 1.安装及IDEA集成Jprofil…...

运行错误(竞赛遇到的问题)

在代码提交时会遇见这样的错误&#xff1a; 此处运行错误不同于编译错误和答案错误&#xff0c;运行错误是指是由于在代码运行时发生错误&#xff0c;运行错误可能是由于逻辑错误、数据问题、资源问题等原因引起的。这些错误可能导致程序在运行时出现异常、崩溃。 导致不会显示…...

nodename nor servname provided, or not known

异常信息 在 Maven 打包过程中出现的 nodename nor servname provided, or not known 异常通常是由于 Maven 无法解析某个域名&#xff0c;这可能是因为网络问题、DNS 解析失败或者 Maven 配置中指定的仓库地址错误导致的。这个问题通常出现在 Maven 试图从远程仓库下载依赖时 …...

前端vue金额用逗号分隔

实现效果 代码 template部分 <el-input v-model"state.val"></el-input><div>{{ priceFor(state.val) }}</div> js部分 const state reactive({ val: });const priceFor (val)> {if(!val){return }else if(val.length<4){return…...

vulvhub-----Hacker-KID靶机

打靶详细教程 1.网段探测2.端口服务扫描3.目录扫描4.收集信息burp suite抓包 5.dig命令6.XXE漏洞读取.bashrc文件 7.SSTI漏洞8.提权1.查看python是否具备这个能力2.使用python执行exp.py脚本&#xff0c;如果提权成功&#xff0c;靶机则会开放5600端口 1.网段探测 ┌──(root…...

遨博I20协作臂关节逆解组Matlab可视化

AUBO I20协作臂关节逆解组Matlab可视化 前言1、RTB使用注意点2、代码与效果2.1、完整代码2.2、运行效果 总结 前言 注意&#xff1a;请预先配置好Matlab和RTB机器人工具箱环境&#xff0c;本文使用matlab2022b和RTB10.04版本 工作需要&#xff0c;使用matlab实现对六轴机械臂…...

力扣题目训练(15)

2024年2月8日力扣题目训练 2024年2月8日力扣题目训练507. 完美数520. 检测大写字母521. 最长特殊序列 Ⅰ221. 最大正方形237. 删除链表中的节点115. 不同的子序列 2024年2月8日力扣题目训练 2024年2月8日第十五天编程训练&#xff0c;今天主要是进行一些题训练&#xff0c;包括…...

PCB差模辐射是如何产生的

在电路应用中,高频时钟信号往往会采用差分线传输模式,其优点是在提高速率的同时减小功耗和提高抗扰度,因此,差模辐射就成为电路正常工作的结果,是电流流过导体形成的环路所产生,差模辐射模型可以被模拟为一个小环形天线,对于一个面积为A的小环路,载有电流Idm,在远场中…...

车载诊断协议DoIP系列 —— 协议中术语解释和定义

车载诊断协议DoIP系列 —— 协议中术语解释和定义 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师(Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎么看自己。江湖一碗茶,…...

【退役之重学前端】关于在控制台得到undefined的事

在浏览器控制台中&#xff0c;undefined 会时不时地&#xff0c;在我不想看到的地方出现。如果你遇到相同的问题&#xff0c;在这篇博客中你会得到答案。 先来看代码块 function test(){} test()//undefined再看下一个代码块 function test(){return 1; } test()//1再来看一个…...

指数和估计六大问题

1955年英国著名数学家R.A.Rankin在牛津大学出版的数学刊物Quart.J.Math.发表了论文&#xff08;现 FRS D.R.Heath-Brown为主编&#xff09;&#xff0c;专门讲van der Corput方法产生的指数对理论&#xff08;1933年E.Phillips提出的精彩理论&#xff0c;好友曲阜师范大学毕业中…...

【软件相关】基于Alist挂载云盘到本地文件资源管理器

文章目录 0 前言1 Alist挂载云盘2 RaiDrive配置3 rclone配置 0 前言 因为最近在研究各种云盘存储影视资源的方法&#xff0c;无意间看到一个教程是利用软件将云盘挂载到本地的资源管理器&#xff0c;这样就能实现类似本地文件操作的方式来操作云盘文件&#xff0c;还是有点意思…...

Java多线程系列——锁

0.引言 在并发编程中&#xff0c;锁是一种重要的同步机制&#xff0c;用于控制对共享资源的访问。Java 提供了多种锁的实现&#xff0c;每种锁都有不同的特性和适用场景。本文将深入介绍 Java 中常见的锁类型&#xff0c;包括内置锁、显式锁、读写锁等&#xff0c;并讨论它们的…...

蓝牙BLE学习-GAP

1.概述 GAP层&#xff08;Generic access profile-通用访问配置文件&#xff09;。GAP是对LL层payload&#xff08;有效数据包&#xff09;如何进行解析的两种方式的一种&#xff0c;而且也是最简单的一种。GAP简单的对LL payload进行一些规范和定义&#xff0c;因此GAP能实现的…...

算法训练营day28(补), 贪心算法2

//122. 买卖股票的最佳时机 II func maxProfit(prices []int) int { result : 0 //利润总和 for i : 1; i < len(prices); i { if prices[i]-prices[i-1] > 0 { result result (prices[i] - prices[i-1]) } } return result } //55. 跳跃游戏 func canJump(nums []…...

Vue核心基础4:绑定样式、条件渲染、列表渲染

1 绑定样式 【代码】 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>绑定样式</title><s…...

go-zero读取mysql部分字段

读取部分字段&#xff0c;使用函数 QueryRowPartialCtx 。 假设有如下一张表&#xff1a; CREATE TABLE test (id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, ctime DATETIME);要读取字段 ctime 值。 定义一结构体&#xff1a; type X struct {state int db:"…...