12 Java文件处理之写入、读取:IO流(中):高级流(缓冲流、转换流、序列化流和反序列化流、打印流)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、缓冲流
    • 1 字节缓冲流
      • (1)BufferedInputStream:字节缓冲输入流
        • 构造方法
          • ---- BufferedInputStream(InputStream in):创建一个使用默认缓冲区大小的缓冲输入流。
          • ---- BufferedInputStream(InputStream in, int size):创建一个指定缓冲区大小的缓冲输入流。
        • 输入方法
          • ---- int read(): 读取一个字节的数据。
          • ---- int read(byte[] b) : 读取多个字节的数据。
          • ---- int read(byte[] b, int off, int len) : 读取多个字节的数据。
        • 关闭资源 void close()
        • 代码演示
          • ---- 读取文件(一个一个字节读):int read()
          • ---- 读取文件(多个多个字节读):int read(byte[] b)
      • (2)BufferedOutputStream:字节缓冲输出流
        • 构造方法
          • ---- BufferedOutputStream(OutputStream out):使用默认的缓冲区大小创建一个新的缓冲输出流,out 是底层的输出流(例如 FileOutputStream)
          • ---- BufferedOutputStream(OutputStream out, int size):创建一个带有指定缓冲区大小的缓冲输出流,size 指定缓冲区的大小
        • 写入方法
          • ---- void write(int b):一个一个字节写入
          • ---- void write(byte[] b):多个多个字节写入
          • ---- void write(byte[] b, int off, int len):多个多个字节写入
        • 关闭资源 void close()
        • 代码演示
          • ---- 写入文件(单个单个字节写入void write(int b)):覆盖模式
          • ---- 写入文件(多个多个字节写入void write(byte[] b)):覆盖模式
          • ---- 写入文件(多个多个字节写入void write(byte[] b)):追加模式
      • (3)字节缓冲流拷贝文件
      • (4)字节缓冲流底层原理
    • 2 字符缓冲流
      • (1)BufferedReader:字符缓冲输入流
        • 构造方法
          • ---- BufferedReader(Reader in):创建一个使用默认大小(8192长度的字符数组)输入缓冲区的缓冲字符输入流
          • ---- BufferedReader(Reader in, int size):创建一个使用指定大小输入缓冲区的缓冲字符输入流
        • 读取方法
          • ---- int read():一个一个字符的读
          • ---- int read(char[] cbuf):多个多个字符的读,返回实际读取的字符数
          • ---- int read(char[] cbuf, int off, int len):多个多个字符的读,返回实际读取的字符数
          • ---- String readLine():一行一行的读
        • 关闭资源:void close()
        • 代码演示
          • ---- 读取文件(一个一个字符的读):int read()
          • ---- 读取文件(多个多个字符的读):int read(char[] cbuf)
          • ---- 读取文件(一行一行的读):String readLine()
          • ---- 读取文件:指定编码格式
      • (2)BufferedWriter: 字符缓冲输出流
        • 构造方法
          • ---- BufferedWriter(Writer out):使用默认缓冲区大小(8192字符数字)创建一个缓冲字符输出流
          • ---- BufferedWriter(Writer out, int size):创建一个具有指定缓冲区大小的缓冲字符输出流
        • 写入方法
          • ---- void write(int c):一个一个写入,将指定的字符写入到缓冲区。
          • ---- void write(char[] cbuf):多个多个写入
          • ---- void write(char[] cbuf, int off, int len):多个多个写入
          • ----- void write(String s):直接写入字符串
          • ----- void write(String s, int off, int len):直接写入字符串
          • ----- void newLine():写入一个跨平台换行符
        • 关闭资源:void close()
        • 代码演示
          • ---- 写入文件(一个一个字符写入void write(int c) (超笨)):覆盖写入
          • ---- 写入文件(多个多个字符写入void write(char[] cbuf) (超笨)):覆盖写入
          • ---- 写入文件(直接写入void write(String s),推荐):覆盖写入
          • ---- 写入文件(直接写入void write(String s),推荐):追加写入
          • ---- 写入文件:指定编码格式,覆盖写入
          • ---- 写入文件(跨系统换行, void newLine()):追加写入
    • 3 综合练习
      • 练习1:恢复出师表顺序
      • 练习2:软件运行次数(主要是计数器要保存到本地)
      • 易犯的错误和创建IO流的原则:输出流的覆盖模式构造方法在打开流的时候就会将文件清空,所以如果输出流和输入流是操作同一个文件,一定要考虑创建流对象的位置和顺序,不然输入流就会读入的是被输出流清空的文件然后读到一个空指针null
  • 二、转换流(转换流只有字符流,没有字节流)== 了解即可,JDK11以后基本开始要被淘汰了,我们都统一使用字符流中基本流的新特性
    • 1 InputStreamReader
      • (1)构造方法
        • ---- InputStreamReader(InputStream in):使用系统默认的字符编码来创建 InputStreamReader
        • ---- InputStreamReader(InputStream in, String charsetName):使用指定的字符编码来创建 InputStreamReader
        • ---- InputStreamReader(InputStream in, Charset cs):使用指定的字符编码对象来创建 InputStreamReader
      • (2)读取方法
        • ---- int read():读取单个字符,返回的值是字符的 Unicode 编码。如果已到达流的末尾,则返回 -1
        • ---- int read(char[] cbuf):多个多个字符读取,返回读取的字符个数,如果到达流末尾则返回 -1。
        • ---- int read(char[] cbuf, int offset, int length):多个多个字符读取,返回读取的字符个数,如果到达流末尾则返回 -1
      • (3)关闭资源
      • (4)代码演示:读取指定编码格式
    • 2 OutputStreamWriter
      • (1)构造方法
        • ---- OutputStreamWriter(OutputStream out):使用系统默认的字符编码进行构建OutputStreamWriter
        • ---- OutputStreamWriter(OutputStream out, String charsetName):使用指定字符编码构建OutputStreamWriter
        • ---- OutputStreamWriter(OutputStream out, Charset cs):使用Charset类对象指定字符编码创建OutputStreamWriter
      • (2)写入方法
        • ---- void write(int c):一个一个写入,将指定的字符写入到缓冲区。
        • ---- void write(char[] cbuf):多个多个写入
        • ---- void write(char[] cbuf, int off, int len):多个多个写入
        • ----- void write(String s):直接写入字符串
        • ----- void write(String s, int off, int len):直接写入字符串
      • (3)关闭资源
      • (4)代码演示:按照指定编码格式写入文件
    • 3 综合练习:改变文件的编码格式(建议用JDK11前后两种不同手段,今后我们统一使用jdk11后那种新特性)
  • 三、序列化流和反序列化流(都是字节流没有字符流)== 存对象,类似Python pickle库
    • 1 序列化流(写出对象):对象操作输出流
      • (1)构造方法:public ObjectOutputStream(OutputStream out):把基本流(字节流)包装成高级流(序列化流)
      • (2)写入方法:public final void writeObject(Object obj): 把对象序列化(写出)到文件中去
      • (3)释放资源
      • (4)序列化流使用细节:要写到本地的Javebean类必须要实现Serializable接口(标记型接口)
      • (5)代码演示
    • 2 反序列化流(读入对象):对象操作输入流
      • (1)构造方法:public ObjectInputStream(InputStream out):把基本输入流变量反序列化流
      • (2)读入方法:public Object readObject(): 把序列化到本地文件中的对象,读取到程序中来(注意:读进来是Object类型,还需要强转一下)
      • (3)关闭资源
      • (4)代码演示
    • 3 序列化流和反序列化流的使用细节
      • (1)JavaBean版本号 implements Serializable
      • (2)transient修饰关键字,用这个关键字修饰的属性不会被序列化到本地中,用于保密
    • 4 综合练习和总结
      • (1)总结
      • (2)综合练习:序列化多个对象到本地
  • 四、打印流(不能读,只能写,只有输出流)== 结合System.out来学习
    • 1 字节打印流:PrintStream
      • (1)构造方法
        • ---- public PrintStream(OutputStream/File/String): 关联字节输出流/文件/文件路径
        • ---- public PrintStream(File/String, Charset charset): 关联字节输出流/文件/文件路径,并且指定字符编码
        • ---- public PrintStream(OutputStream out, boolean autoFlush): 关联字节输出流, 并设置自动刷新
        • ---- public PrintStream(OutputStream out, boolean autoFlush,String encoding): 关联字节输出流, 并设置自动刷新,指定字符编码方式
      • (2)写入(常规方法)和打印(print系列)方法(特殊方法)
        • ---- public void write(int b):常规方法:规则和之前一样,将指定的字节写出
        • ---- public void println(Xxx xx):特有方法:打印任意数据,自动刷新,自动换行
        • ---- public void print(Xxx xx):特有方法:打印任意数据,自动刷新,不换行
        • ---- public void printf(String format ,Object... args):特有方法:带有占位符的打印语句(格式化打印),不换行
      • (3)关闭资源 void close()
      • (4)代码示例
      • (5)具体应用场景:模拟System.out和System.out原理解释
    • 2 字符打印流:PrintWriter
      • (1)构造方法
        • ---- public PrintWriter(Writer/File/String): 关联字符输出流/文件/文件路径
        • ---- public PrintWriter(String fileName,Charset charset): 关联字符文件路径、指定字符编码
        • ---- public PrintWriter(Writer w,boolean autoFlush): 关联字符输出流、自动刷新
        • ---- public PrintWriter(OutputStream out, boolean autoFlush, Charset charset): 指定字符编码、自动刷新
      • (2)写入方法和打印方法
        • ---- public void write(int b):常规方法:规则和之前一样,将指定的字节写出
        • ---- public void println(Xxx xx):特有方法:打印任意数据,自动刷新,自动换行
        • ---- public void print(Xxx xx):特有方法:打印任意数据,自动刷新,不换行
        • ---- public void printf(String format ,Object... args):特有方法:带有占位符的打印语句(格式化打印),不换行
      • (3)关闭资源 void close()
      • (4)代码示例
  • 五、压缩流(写)和解压缩流(读)(都是字节流)
    • 1 ZipInputStream: 解压缩流
      • (1)构造方法
        • ---- public ZipInputStream(InputStream in)
      • (2)ZipInputStream中:getNextEntry()方法:返回解压缩流中每一个ZipEntry对象,到达最后返回null
      • (3)ZipEntry(目录或者文件)中的一些方法
        • ---- isDirectory():判断是否是目录
        • ---- read():读取一个字节,到末尾返回-1
        • ---- int read(byte[] b) : 读取多个字节的数据。
        • ---- int read(byte[] b, int off, int len) : 读取多个字节的数据。
        • ---- closeEntry():每处理完一个ZipEntry对象都要关闭
      • (4)关闭资源 void close()
      • (5)代码演示
    • 2 ZipOutputStream: 压缩流
      • (1)压缩单个文件
      • (2)压缩文件夹


前言

前面学FileReader和FileWriter字符流:对于中文只能处理当前平台的编码方式进行编码和解码,不能指定编码格式进行编码解码。

这个指定编码的功能,在本节的高级流(转换流)上就会得到处理。

另外,高级流都是在上节的四中基本流上面进一步封装而来的,可以说前面基本流是他们的爸爸。

缓冲流(提供缓冲区,加快读取写入速度,减少和硬盘交互次数)
转换流(可以指定编码格式)

基本流—>缓冲流
转换流(都是字符流)
序列化流和反序列化流(都是字节流)
打印流(不能读,只能写,只有输出流)

在这里插入图片描述

在这里插入图片描述

一、缓冲流

在这里插入图片描述
缓冲流就是在之前基本流的基础上加了一个缓冲区(缓冲数组,减少和磁盘交互的次数),可以加快读写的效率。
其实基本流中的字符流本身底层原理就是有缓冲区的参考博客,所以缓冲流的对于字符流的加快读写效率并没有快很多。主要是其中有几个非常好用的方法需要我们学习一下。

1 字节缓冲流

  • 原理:底层自带了长度为8192的缓冲区(缓冲数组)提高性能
    这样每次和硬盘交互我都可以直接将8192个字节放进内存,就是是一个字节一个字节的读8193个字节才和硬盘交互一次,不然一个字节就和硬盘交互一次太浪费时间了。

(1)BufferedInputStream:字节缓冲输入流

【注】:其实基本流学好了,这个没有什么区别。

构造方法
---- BufferedInputStream(InputStream in):创建一个使用默认缓冲区大小的缓冲输入流。

默认缓冲区是 8192 的字节数组

---- BufferedInputStream(InputStream in, int size):创建一个指定缓冲区大小的缓冲输入流。
输入方法
---- int read(): 读取一个字节的数据。

返回值是读取的字节(0 到 255 之间的整数),如果已经到达流的末尾,返回 -1
如果是处理文本文件通常要结合char强转使用。

---- int read(byte[] b) : 读取多个字节的数据。

一次读取多个字节(返回值表示本次读取到的字节的个数,不是值),从文件中读取字节并将其存储到字节数组 b 中(每次读取会尽可能把数组装满),返回读取的字节数,如果到达文件末尾返回 -1。
如果是处理文本文件通常结合String(字节数组,start,end)构造方法来使用,start、end分别是字节数组起始索引

---- int read(byte[] b, int off, int len) : 读取多个字节的数据。

从输入流中读取最多 len 个字节的数据,并将其存储到字节数组 b 的从 off 位置开始的部分,返回实际读取的字节数,或者在流结束时返回 -1。

关闭资源 void close()

关闭缓冲流就行,在底层关闭缓冲流里面已经封装了关闭基本流的代码。所以关闭缓冲流就直接将基本流一起关闭了。

代码演示
---- 读取文件(一个一个字节读):int read()

int read()

public class Test {public static void main(String[] args) throws IOException {// a.txt文件内容:abcdefdghiuihhjBufferedInputStream bis = new BufferedInputStream(new FileInputStream(".\\a.txt"));StringBuilder sb = new StringBuilder();int b;while((b = bis.read()) != -1){sb.append((char)b);}bis.close();  // 关闭流,关闭缓冲流,基本流也会关闭System.out.println(sb.toString());   // abcdefdghiuihhj}}
---- 读取文件(多个多个字节读):int read(byte[] b)

int read(byte[] b)

public class Test {public static void main(String[] args) throws IOException {// a.txt文件内容:abcdefdghiuihhjBufferedInputStream bis = new BufferedInputStream(new FileInputStream(".\\a.txt"));try(bis){StringBuilder sb = new StringBuilder();byte[] bytes = new byte[2];int len;while ((len = bis.read(bytes)) != -1) {sb.append(new String(bytes, 0, len));}System.out.println(sb.toString());   // abcdefdghiuihhj}}
}

(2)BufferedOutputStream:字节缓冲输出流

构造方法

【注】:覆盖模式还是追加模式还是在基本流的构造方法里面传入就可以了

---- BufferedOutputStream(OutputStream out):使用默认的缓冲区大小创建一个新的缓冲输出流,out 是底层的输出流(例如 FileOutputStream)
---- BufferedOutputStream(OutputStream out, int size):创建一个带有指定缓冲区大小的缓冲输出流,size 指定缓冲区的大小
写入方法
---- void write(int b):一个一个字节写入

将指定的字节写入到缓冲区。如果缓冲区满了,则会将缓冲区中的内容写入到底层输出流。

---- void write(byte[] b):多个多个字节写入
---- void write(byte[] b, int off, int len):多个多个字节写入

将 b 数组中从 off 位置开始的 len 个字节写入到缓冲区中。如果缓冲区满了,也会将缓冲区的内容写入到底层输出流。

关闭资源 void close()

关闭缓冲流就行,在底层关闭缓冲流里面已经封装了关闭基本流的代码。所以关闭缓冲流就直接将基本流一起关闭了。

代码演示
---- 写入文件(单个单个字节写入void write(int b)):覆盖模式

void write(int b)

public class Test {public static void main(String[] args) throws IOException {// a.txt文件  写入 abcBufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("a.txt"));try (bos) {bos.write(97);bos.write(98);bos.write(99);}}
}
---- 写入文件(多个多个字节写入void write(byte[] b)):覆盖模式

void write(byte[] b)

public class Test {public static void main(String[] args) throws IOException {// a.txt文件  写入 abc你好BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("a.txt"));try (bos) {bos.write("abc你好".getBytes());  // 默认是平台的utf-8编码写入字节,也可以指定编码写入}}
}

在这里插入图片描述

---- 写入文件(多个多个字节写入void write(byte[] b)):追加模式
public class Test {public static void main(String[] args) throws IOException {// a.txt文件内容:abc你好  追加写入 \n曹潇潇我爱你BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("a.txt", true));try (bos) {bos.write("\n曹潇潇我爱你".getBytes());}}
}

在这里插入图片描述

(3)字节缓冲流拷贝文件

同样是拷贝视频文件

public class Test {public static void main(String[] args) throws IOException {// 拷贝 D:\GraduateStudent\研一\taobao_项目\【深度学习理论基础】\13-13 - 2.6更多导数示例.mp4 到 IDEA当前工作路径 video.mp4BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\GraduateStudent\\研一\\taobao_项目\\【深度学习理论基础】\\13-13 - 2.6更多导数示例.mp4"));BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(".\\video.mp4"));try(bis; bos) {byte[] bytes = new byte[1024*1024*5];int len;while ((len = bis.read(bytes)) != -1) {bos.write(bytes, 0, len);}}}
}

(4)字节缓冲流底层原理

参考视频

2 字符缓冲流

(1)BufferedReader:字符缓冲输入流

构造方法
---- BufferedReader(Reader in):创建一个使用默认大小(8192长度的字符数组)输入缓冲区的缓冲字符输入流
---- BufferedReader(Reader in, int size):创建一个使用指定大小输入缓冲区的缓冲字符输入流
读取方法
---- int read():一个一个字符的读

读取一个字符。返回值是读取的字符的对应字符集对应的十进制数字(作为 int 返回),如果已经到达流的末尾,返回 -1。

---- int read(char[] cbuf):多个多个字符的读,返回实际读取的字符数
---- int read(char[] cbuf, int off, int len):多个多个字符的读,返回实际读取的字符数

从字符输入流中最多读取 len 个字符,存储到 cbuf 数组中,从 off 位置开始。返回实际读取的字符数,流结束时返回 -1。

---- String readLine():一行一行的读

读取一行文本。当到达流末尾时,返回 null。通常用于逐行读取文件内容。
【注】:虽然是一行一行读。但是并不会将换行符也读到内存,也就是说每行结尾的换行符不会读进内存。

关闭资源:void close()
代码演示
---- 读取文件(一个一个字符的读):int read()
public class Test {public static void main(String[] args) throws IOException {// 读取 a.txt 里面内容为: abc你好\r\n曹潇潇我爱你BufferedReader br = new BufferedReader(new FileReader(".\\a.txt"));StringBuilder sb = new StringBuilder();int ch;while ((ch = br.read()) != -1) {sb.append((char) ch);}br.close();System.out.println(sb.toString());/*abc你好曹潇潇我爱你*/}
}
---- 读取文件(多个多个字符的读):int read(char[] cbuf)
public class Test {public static void main(String[] args) throws IOException {// 读取 a.txt 里面内容为: abc你好\r\n曹潇潇我爱你BufferedReader br = new BufferedReader(new FileReader(".\\a.txt"));try(br){StringBuilder sb = new StringBuilder();char[] buf = new char[2];int len;while ((len = br.read(buf)) != -1) {sb.append(new String(buf, 0, len));}System.out.println(sb.toString());}/*abc你好曹潇潇我爱你*/}
}
---- 读取文件(一行一行的读):String readLine()
public class Test {public static void main(String[] args) throws IOException {// 读取 a.txt 里面内容为: abc你好\r\n曹潇潇我爱你BufferedReader br = new BufferedReader(new FileReader(".\\a.txt"));try(br){String line;while ((line = br.readLine()) != null) {System.out.println(line);}}/*abc你好曹潇潇我爱你*/}
}

通常我们喜欢将每一行的String放进一个List再进行进一步的处理加工

public class Test {public static void main(String[] args) throws IOException {// 读取 a.txt 里面内容为: abc你好\r\n曹潇潇我爱你BufferedReader br = new BufferedReader(new FileReader(".\\a.txt"));ArrayList<String> list = new ArrayList<>();try(br){String line;while ((line = br.readLine()) != null) {list.add(line);}}System.out.println(list);  // [abc你好, 曹潇潇我爱你]}
}
---- 读取文件:指定编码格式
public class Test {public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new FileReader(".\\gbk.txt",Charset.forName("GBK")));StringBuilder sb = new StringBuilder();try(br){String line;while ((line = br.readLine()) != null) {sb.append(line).append("\n");}}System.out.println(sb.toString());}
}

(2)BufferedWriter: 字符缓冲输出流

构造方法
---- BufferedWriter(Writer out):使用默认缓冲区大小(8192字符数字)创建一个缓冲字符输出流
---- BufferedWriter(Writer out, int size):创建一个具有指定缓冲区大小的缓冲字符输出流
写入方法
---- void write(int c):一个一个写入,将指定的字符写入到缓冲区。
---- void write(char[] cbuf):多个多个写入
---- void write(char[] cbuf, int off, int len):多个多个写入

将字符数组的 len 个字符,从偏移量 off 开始,写入到缓冲区。

----- void write(String s):直接写入字符串
----- void write(String s, int off, int len):直接写入字符串

将字符串的 len 个字符,从偏移量 off 开始,写入到缓冲区。

----- void newLine():写入一个跨平台换行符

写入一个行分隔符。BufferedWriter 会根据操作系统自动使用适当的换行符,例如 Windows 使用 \r\n,Unix 使用 \n。
原因是,不可能每换个平台我们都去修改源码,我们调用这个方法写入就可以解决这个问题了。

关闭资源:void close()
代码演示
---- 写入文件(一个一个字符写入void write(int c) (超笨)):覆盖写入
public class Test {public static void main(String[] args) throws IOException {// 往a.txt中覆盖写入 abc我   a -> 97  b -> 98  c -> 99  我 -> 25105BufferedWriter bw = new BufferedWriter(new FileWriter("a.txt"));try(bw) {bw.write(97);bw.write(98);bw.write(99);bw.write(25105);}}
}

在这里插入图片描述

----

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1537492.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【浅水模型MATLAB】尝试复刻SCI论文中的溃坝流算例

【浅水模型MATLAB】尝试复刻SCI论文中的溃坝流算例 前言问题描述控制方程及数值方法浅水方程及其数值计算方法边界条件的实现 代码框架与关键代码模拟结果 更新于2024年9月17日 前言 这篇博客算是学习浅水方程&#xff0c;并利用MATLAB复刻Liang (2004)1中溃坝流算例的一个记录…

特殊文本文件日志技术重点笔记。

特殊文本文件&#xff0c;日志技术(黑马 一套入门 3h) 特殊文件 日志技术 把程序运行的信息&#xff0c;记录到文件中&#xff0c;方便程序员定位bug&#xff0c;并了解程序的执行情况等。 1.为什么要用这些特殊文件 1.1存储单个用户的: 用户名,密码 1.2存储多个用户的&…

数据清洗-缺失值填充-XGboost算法填充

目录 一、安装所需的python包二、采用XGboost算法进行缺失值填充2.1可直接运行代码2.2以某个缺失值数据进行实战2.2.1 代码运行过程截屏&#xff1a;2.2.2 填充后的数据截屏&#xff1a; 三、XGBoost算法原理介绍3.1 XGBoost 的定义3.2 XGBoost 的核心思想3.3 XGBoost 的特点3.…

2024 批量下载知乎回答/文章/想法/专栏/视频/收藏夹,导出 excel 和 pdf

之前分享过文章 2024批量下载知乎回答文章想法专栏收藏夹&#xff0c;公众号文章内容图片封面视频音频&#xff0c;微博内容图片视频评论转发数据&#xff0c;导出excel和pdf &#xff0c;今天再整理分享下知乎知乎回答/文章/想法/专栏/视频/收藏夹下载。 苏生不惑 这个账号已…

Jenkins基于tag的构建

文章目录 Jenkins参数化构建设置设置gitlab tag在工程中维护构建的版本按指定tag的版本启动服务 Jenkins参数化构建设置 选择参数化构建&#xff1a; 在gradle构建之前&#xff0c;增加执行shell的步骤&#xff1a; 把新增的shell框挪到gradle构建之前&#xff0c; 最后保存 …

驱动器磁盘未格式化难题:深度剖析与恢复实践

驱动器磁盘未格式化的深层探索 在数据存储与管理的日常中&#xff0c;驱动器作为我们数字生活的基石&#xff0c;其稳定性直接关系到数据的安全与可用性。然而&#xff0c;当屏幕上赫然出现“驱动器中的磁盘未被格式化”的提示时&#xff0c;许多用户往往感到手足无措&#xf…

Linux 文件与目录操作命令详解

文章目录 前言创建文件1. touch2. vim 文件内容显示3. cat4. more5. less6. head7. tail 文件&#xff08;目录&#xff09;复制、删除和移动8. cp9. rm10. mv 压缩文件与解压缩11. gzip12. zip 和 unzip 创建目录13. mkdir 删除目录14. rmdir 改变工作目录15. cd16. pwd 显示目…

【C语言】联合体枚举的讲解

目录 ✨声明&#xff01;&#xff01;&#xff01;&#xff1a; 联合体与结构体只有一个区别&#xff0c;那就是内存存储方式不同 &#x1f495;1.联合体的声明 &#x1f495;2.联合体内存的存储 &#x1f495;3.联合体字节大小的计算 例题2&#xff1a; ✨4.枚举的声明…

全面掌握 Jest:从零开始的测试指南(下篇)

在上一篇测试指南中&#xff0c;我们介绍了Jest 的背景、如何初始化项目、常用的匹配器语法以及钩子函数的使用。这一篇篇将继续深入探讨 Jest 的高级特性&#xff0c;包括 Mock 函数、异步请求的处理、Mock 请求的模拟、类的模拟以及定时器的模拟、snapshot 的使用。通过这些技…

list从0到1的突破

目录 前言 1.list的介绍 2.list的常见接口 2.1 构造函数&#xff08; (constructor)&#xff09; 接口说明 2.2 list iterator 的使用 2.3 list capacity 2.4 list element access 2.5 list modifiers 3.list的迭代器失效 附整套练习源码 结束语 前言 前面我们学习…

一款源码阅读的插件

文章目录 进度汇报功能预览添加高亮标记高亮风格设置笔记颜色设置数据概览高亮数据详情 结尾 进度汇报 之前提到最近有在开发一个源码阅读的IDEA插件&#xff0c;第一版已经开发完上传插件市场了&#xff0c;等官方审批通过就可以尝鲜了。插件名称&#xff1a;Mark source cod…

防火墙——NAT

目录 NAT NAT分类 旧分类 新分类 NAT配置 源NAT​编辑 配置源NAT地址池​编辑 关于源NAT环路问题 环境如下​编辑 防火墙nat​编辑​编辑 路由器要配置指向11.0.0.0 网段的静态路由​编辑 测试​编辑 如果此时有外网用户直接pingNAT地址&#xff0c;则环路出现。​…

PAT甲级-1016 Phone Bills

题目 题目大意 顾客打长途电话计费&#xff0c;输出每月的账单。输入一行给出一天24小时的计费钱数&#xff0c;注意单位是美分&#xff0c;还要乘以0.01。接下来给出n条记录&#xff0c;每条记录都包括客户名&#xff0c;时间&#xff0c;状态。“on-line”是开始打电话的时间…

专题四_位运算( >> , << , , | , ^ )_算法详细总结

目录 位运算 常见位运算总结 1.基础位运算 2.给一个数 n ,确定它的二进制表示中的第 x 位是 0 还是 1 3.运算符的优先级 4.将一个数 n 的二进制表示的第 x 位修改成 1 5.将一个数n的二进制表示的第x位修改成0 6.位图的思想 7.提取一个数&#xff08;n&#xff09;二进…

如何优雅地处理返回值

我们已经知道了如何优雅的校验传入的参数了&#xff0c;那么后端服务器如何实现把数据返回给前端呢&#xff1f; 返回格式 后端返回给前端我们一般用 JSON 体方式&#xff0c;定义如下&#xff1a; {#返回状态码code:string, #返回信息描述message:string,#返回值data…

算法设计与分析(线性时间选择算法

目录 线性时间选择算法&#xff08;QuickSelect&#xff09;实现注意事项有可能出现的特殊情况&#xff1a;小结&#xff1a; 线性时间选择算法&#xff08;QuickSelect&#xff09;实现 线性时间选择算法 是快速排序算法的一个变种&#xff0c;用于在未完全排序的数组中找到第…

Next-ViT: 下一代视觉Transformer,用于现实工业场景中的高效部署

摘要 由于复杂的注意力机制和模型设计&#xff0c;大多数现有的视觉Transformer&#xff08;ViTs&#xff09;在实际的工业部署场景中&#xff0c;如TensorRT和CoreML&#xff0c;无法像卷积神经网络&#xff08;CNNs&#xff09;那样高效运行。这提出了一个明显的挑战&#x…

[Redis] Redis中的set和zset类型

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

微信,手机文件管理,通过自己软件打开——手机平板电脑编程———未来之窗行业应用跨平台架构

一、手机平板IT人员编程编辑器 专为 IT 和运维人员设计的手机和平板编程编辑器&#xff0c;具有便携灵活、即时响应、适应多场景、触控便捷、资源丰富、成本较低、激发创意和数据同步方便等优点。 二、手机平板现状 目前手机和平板的现状是缺乏专门针对 IT 人员的编辑工具&a…

避免服务器安装多个mysql引起冲突的安装方法

最近工作中涉及到了数据迁移的工作. 需要升级mysql版本到8.4.2为了避免升级后服务出现异常, 因此需要保留原来的mysql,所以会出现一台服务器上运行两个mysql的情况 mysql并不陌生, 但是安装不当很容易引起服务配置文件的冲突,导致服务不可用, 今天就来介绍一种可以完美避免冲突…