IO流--字节流详解
IO流
-
用于读写数据的(可以读写文件,或网络中的数据)
概述:
I指 Input,称为输入流:负责从磁盘或网络上将数据读到内存中去
O指Output,称为输出流,负责写数据出去到网络或磁盘上
因此,IO流总体来看就有四大流
-
字节输入流:以内存为基准,在管道中,以一个一个字节的形式,从外部读取数据到内存中的流。
-
字节输出流:以内存为基准,在管道中,以一个一个字节的形式,将数据从内存中读取到外部磁盘或网络中的流。
-
字符输入流:以内存为基准,在管道中,以一个一个字符的形式,从外部读取数据到内存中,只适合操作纯文本文件的流。
-
字符输出流:以内存为基准,在管道中,以一个一个字符的形式,把内存中的数据写出到磁盘文件或者网络介质中的流。
前置知识:
File
-
File是java.io.包下的类,File类的对象,用于代表当前操作系统的文件(可以是文件、或文件夹)。
-
File类提供的主要功能:
-
获取文件信息(大小,文件名,修改时间)
-
判断文件的类型
-
创建文件/文件夹
-
删除文件/文件夹
-
注:File类只能对文件本身进行操作,不能读写文件里面存储的数据
File类:对象的创建
常用方法
构造器 | 说明 |
---|---|
public File(String pathname) | 根据文件路径创建文件对象 |
public File(String parent,String child) | 根据父路径与子路径名字创建文件对象 |
public File(File parent, String child) | 根据父路径对应文件对象和子路径名字创建文件对象 |
代码展示:
package com.lyc.io;import java.io.File;//测试file类的构造器public class FileTest1 {public static void main(String[] args) {//1.创建一个File对象,指代某个具体的文件 绝对路径 带盘符File file = new File("D:\\IdeaProjects\\collectionTest\\src\\main\\java\\com\\lyc\\io\\test.txt");//也可以使用/ 来表示file = new File("D:/IdeaProjects/collectionTest/src/main/java/com/lyc/io/test.txt");//也可以使用File.separator来表示分隔符,这个分隔符是系统相关的,具有兼容性System.out.println(file.length());//返回的是文件的字节个数//2.创建一个File对象,指代某个具体的文件夹File file1 = new File("D:\\IdeaProjects\\collectionTest");System.out.println(file1.length());//4096 是指这个文件夹本身的字节数,不包括里面的文件//注意:File对象只带一个不存在的文件路径File file2 = new File("D:\\IdeaProjects\\collectionTest\\src\\main\\java\\com\\lyc\\io\\test1.txt");System.out.println(file2.length()); //为0//3.判断文件是否存在System.out.println(file2.exists());//使用相对路径创建文件对象File file3 = new File("src/main/java/com/lyc/io/test.txt");System.out.println(file3.exists());}}
注意:
-
File对象既可以代表文件,也可以代表文件夹
-
File封装的对象仅仅是一个路径名,这个路径可以是存在的,也允许是不存在的
绝对路径、相对路径
-
绝对路径:从盘符开始
-
相对路径:不带盘符,默认直接到当前工程的目录下寻找文件
File类:常用方法
方法名称 | 说明 |
---|---|
public boolean exists() | 判断当前文件对象,对应的文件路径是否存在,存在则返回true |
public boolan isFile() | 判断当前文件对象指代的是否为文件,是文件返回true,反之false |
public boolean isDirectory() | 判断当前文件对象指代的是否是文件夹,是文件夹返回true,反之false |
public String getName() | 获取文件的名称(包含后缀) |
public long length() | 获取文件的大小,返回字节个数 |
public long lastModified() | 获取文件的最后修改时间 |
public String getPath() | 获取创建文件对象时,使用的路径 |
public String getAbsolutePath() | 获取绝对路径 |
public boolean createNewFile() | 创建一个新文件(文件内容为空) |
public boolean mkdir() | 用于创建文件夹,注意:只能创建一级文件夹 |
public boolean mkdirs() | 用于创建多级文件夹 |
public boolean delete() | 删除文件 或者空文件夹 注意:不能删除非空文件夹,而且删除后的文件不会进入回收站 |
File类提供的遍历文件夹的功能
方法名称 | 说明 |
---|---|
public String[] list() | 返回一个String数组,获取当前目录下所有的“一级文件名称” |
public File[] listFiles() | 返回一个File数组,获取当前目录下所有的“一级文件对象” |
使用listFiles方法时的注意事项:
-
当主调是文件,或者路径不存在时,返回null
-
当主调是空文件夹时,返回一个长度为零的数组
-
当主调是一个有内容的文件夹时,将里面所有一级文件和文件夹的路径放在File数组中返回
-
当主调是一个文件夹,且里面有隐藏文件时,将里面所有文件和文件夹的路径放在File数组中返回,包含隐藏文件
-
当主调是一个文件夹,但是没有权限访问该文件夹时,返回null
代码展示:
package com.lyc.io;import java.io.File;import java.text.SimpleDateFormat;import java.util.logging.SimpleFormatter;//测试文件类的常用方法public class FileTest2 {public static void main(String[] args) {//1.创建文件对象File file = new File("src/main/java/com/lyc/io/test.txt");//2:判断文件是否存在 public boolean exists()System.out.println(file.exists());//3.判断文件是否是文件 public boolean isFile()System.out.println(file.isFile());//4.判断文件是否是目录 public boolean isDirectory()System.out.println(file.isDirectory());//5.获取文件或者目录的名称 public String getName()System.out.println(file.getName());//6.获取文件的绝对路径 public String getAbsolutePath()System.out.println(file.getAbsolutePath());//7.获取文件的长度 public long length()System.out.println(file.length());//8.获取文件的最后修改时间 public long lastModified() 返回的是毫秒值 需要转换为日期格式SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");long l = file.lastModified();System.out.println(simpleDateFormat.format(l));//9.获取创建文件对象时,使用的路径 public String getPath()System.out.println(file.getPath());//11.创建文件 public boolean createNewFile() 创建文件成功返回true 文件为空File file2 = new File("src/main/java/com/lyc/io/test2.txt");try {System.out.println(file2.createNewFile());} catch (Exception e) {e.printStackTrace();}//12.创建目录 public boolean mkdir()File file3 = new File("src/main/java/com/lyc/io/test3");System.out.println(file3.mkdir());//13.创建多级目录 public boolean mkdirs()File file4 = new File("src/main/java/com/lyc/io/test3/test4/test5");System.out.println(file4.mkdirs());//14.删除文件或者目录 public boolean delete()System.out.println(file2.delete());}}
案例练习:
package com.lyc.io;import java.io.File;//测试:改变某个文件夹下视频的序号public class fileTest {public static void main(String[] args) {//1.拿到所有的文件,以及对象File file = new File("E:\\桌面\\java学习");//2.拿到所有的文件对象File[] files = file.listFiles();//遍历for (File file1 : files) {String name = file1.getName();//截取开始到需要截的地方之间的文件名String index = name.substring(0, name.indexOf("的"));//截取需要截取的地方到最后的部分,最后将其拼接String lastName = name.substring(name.indexOf("的"));String newName = index + lastName;//3.修改文件名if (file1.isFile()) {file1.renameTo(new File(file,newName));}}}}
那么文件搜索需要访问不只一级文件夹,我们可以使用方法递归来遍历文件夹
前置知识:方法递归
-
递归是一种算法,在程序设计语言中广泛应用
-
从形式上讲,方法调用自身的形式称为方法递归
-
直接递归:方法自己调用自己
-
间接递归:方法调用其他方法,其他方法又回调方法自己
使用方法递归时需要注意的问题:
-
递归如果没有控制好终止条件,会出现递归死循环,导致栈内存溢出错误
案例1:计算n的阶乘
代码展示:
public static void main(String[] args) {System.out.println(f(5));}public static int f(int n){if(n==1){return 1;}else {return n * f(n-1);}}}
案例2:斐波那契数列
斐波那契数列的是这样一个数列:1、1、2、3、5、8、13、21、34…,即第一项 f(1) = 1,第二项 f(2) = 1…,第 n 项目为 f(n) = f(n-1) + f(n-2)。求第 n 项的值是多少。
代码展示:
//斐波那契数列//1、1、2、3、5、8、13、21、34public class test1 {public static void main(String[] args) {for (int i = 1; i < 10; i++) {System.out.println(fib(i));}}public static int fib(int n){if (n==1||n==2){return 1;}else{return fib(n-1)+fib(n-2);}}}
文件搜索
要求:从D:盘中,搜索”QQ.exe“这个文件,找到后直接输出其位置
分析:
-
先找出D:盘下的所有一级文件对象
-
遍历全部一级文件对象
-
如果是文件,判断是否是自己想要的
-
如果是文件夹,需要继续进入到该文件夹,重复上述过程
代码展示:
package com.lyc.io;import java.io.File;/*要求:从D:盘中,搜索”QQ.exe“这个文件,找到后直接输出其位置分析:1. 先找出D:盘下的所有一级文件对象2. 遍历全部一级文件对象3. 如果是文件,判断是否是自己想要的4. 如果是文件夹,需要继续进入到该文件夹,重复上述过程* */public class FileSearch {public static void main(String[] args) {search(new File("D:/"),"QQ.exe");}public static void search(File file,String fileName){//将非法情况拦截if (!file.exists() || file.isFile()){return;//无法搜索}//1.public File[] listFiles() 返回一个File数组,获取当前目录下所有的“一级文件对象”File[] files = file.listFiles();//判断当前目录下是否有文件,以及是否可以拿到文件if (files != null){for (File file1 : files) {//2.遍历全部一级文件对象if (file1.isFile()){//3.如果是文件,判断是否是自己想要的if (file1.getName().equals(fileName)){System.out.println("路径是:"+file1.getAbsolutePath());}}else {//3.如果当前是文件夹,需要继续进入到该文件夹,重复上述过程search(file1,fileName);}}}}}
拓展案例:
需求:删除非空文件夹
分析:
File默认不可以删除非空文件夹,需要使用递归删除
1.递归删除文件夹中的内容
2.删除文件夹
代码展示:
public static void main(String[] args) {File file = new File("E:\\桌面\\deleteDemo");System.out.println(file.exists());deleteFile(file);}public static void deleteFile(File file) {if (!file.exists()) {return;}if (file.isFile()) {file.delete();return;}File[] files = file.listFiles();if (files != null) {for (File file1 : files) {deleteFile(file1);}}// 删除文件夹本身file.delete();}
前置知识:字符集
美国人制造了计算机,并在其中存储了128个码点用来表达数字,标点符号,特殊字符,英文字母(大小写),其中'a'是97,'0'为48...
被称为ASII字符集
原理就是将这些码点直接转译成二进制,只有8位,正好是1字节,所以ASII字符集使用一个字节存储
标准ASCII字符集
-
ASII:美国信息交换标准代码,包括了英文,符号等
-
标准ASII码使用1个字节存储一个字符,首位是0,总共可以表示128个字符
GBK(汉字内码扩展规范,国标)
-
汉字编码字符集,包含2万多个汉字等字符,GBK中一个中文字符编码成两个字节的形式存储
-
注意:GBK兼容了ASCII字符集,GBK规定:汉字的第一个字节的第一位必须是1
Unicode字符集(统一码,也叫万国码)
-
Unicode是国际组织制定的,可以容纳世界上所有文字、符号的字符集
-
UTF-32 4个字节表示一个字符,容量大,但缺点:占用太多的存储空间,通信效率降低
-
UTF-8 (重点)
UTF-8
-
是Unicode字符集的一种编码方案,采取可变长编码方案,共分成四个长度区:1个字节,2个字节,3个字节,4个字节
-
英文字符、数字等只占一个字节(兼容标准ASII码),汉字字符占用3个字节
拓展:那英文与中文在一起该如何区分?
UTF-8有自己的编码规则
-
在遇见ASII码时,直接就以一个字节的形式编译成二进制,不做其他处理
-
如果是两个字节,编译时要求第一个字节的前三位为110 ,第二个字节的前两位为10,
-
如果是三个字节,编译时要求第一个字节的前四位为1110,后两个字节的前两位为10.
-
如果是四个字节,编译时要求第一个字节的前五位为11110,后三个字节的前两位为10
-
技术人员在开发时都已应该使用UTF-8编码
注意:
-
字符编码时使用的字符集,和解码时使用的字符集必须一致,否则会出现乱码
-
英文,数字一般不会乱码,因为很多字符集都兼容了ASCII编码
字符集的编码,解码
编码:把字符按照指定字符编码成字节
解码:把字节按照指定字符集解码成字符
Java代码完成对字符的编码
String提供了以下方法 | 说明 |
---|---|
byte[] getBytes() | 使用平台的默认字符集将该String编码为一系列字节,将结果存储到新的字节数组中 |
byte[] getBytes(String charsetName) | 使用指定的字符集将String编码为一系列字节,将结果存储到新的字节数组中 |
java代码完成对字符的解码
String提供了以下方法 | 说明 |
---|---|
String(byte[] bytes) | 通过使用平台的默认字符集解码指定的字节数组来构造新的String |
String(byte[] bytes,String charsetName) | 通过指定的字符集解码指定的字节数组来构造新的String |
代码展示:
package com.lyc.io;import java.io.UnsupportedEncodingException;import java.util.Arrays;//掌握如何使用Java代码完成对字符的编码与解码public class charsetTest {public static void main(String[] args) throws UnsupportedEncodingException {//1.编码String data = "a我b";byte[] bytes = data.getBytes();//默认是按照平台字符集(UTF-8)进行编码的System.out.println(Arrays.toString(bytes));//[97, -26, -120, -111, 98] a我b ASCII码 在UTF-8编码中只占一个字节,而汉字在UTF-8编码中占三个字节 负数是因为首字母为1// 2.按照指定字符集进行编码byte[] bytes1 = data.getBytes("GBK");System.out.println(Arrays.toString(bytes1));//[97, -50, -46, 98]//a我b GBK编码中,汉字占两个字节,而a占一个字节//3.解码String s = new String(bytes);//默认按照平台字符集(UTF-8)进行解码System.out.println(s);//a我bString s1 = new String(bytes1,"GBK");//按照GBK进行解码System.out.println(s1);//a我b}}
IO流--字节流
文件字节输入流(FileInputStream)
-
作用:以内存为基准,可以把磁盘文件的数据以字节的形式读入到内存中去
构造器 | 说明 |
---|---|
FileInputStream(File file) | 通过打开与实际文件的连接创建一个 FileInputStream ,该文件由文件系统中的 File 对象 file 命名。 |
FileInputStream(String name) | 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名 name 命名 |
方法名称 | 说明 |
---|---|
int read() | 从该输入流读取一个字节的数据。没有数据返回-1 |
int read(byte[] b) | 从该输入流读取最多 b.length 个字节的数据为字节数组。返回字节数组读取了多少字节,如果为空返回-1 |
注意事项:
-
使用FileInputStream每次读取一个字节,读取性能较差,并且读取汉字会有乱码
-
使用字节数组读取的话也可能出现读取汉字乱码,因为字节数组如果正好卡在汉字的字节之间,就会乱码
1.使用字节流读取中文,如何保证输出不乱码,怎么解决?
-
定义一个与文件一样大的字节数组,一次性读取完文件的全部字节
-
Java官方为Input Stream提供了如下方法,可以把文件的全部字节读取到一个字节数组中返回
问题:
-
如果文件过大,创建的字节数组也会过大,可能引出内存溢出
读写文本内容更适合用字符流 字节流更适合做数据的转移,:如文件复制
byte[]readAllBytes() throws IOException
: 直接将当前字节输入流对应的文件对象的字节数据装到一个字节数组中返回。
public static void main(String[] args) throws Exception {//一次性读取完文件的全部字节到一个字节数组中File file = new File("src/main/java/com/lyc/io/test.cpp");InputStream is = new FileInputStream(file);//1.创建一个字节数组,大小与文件的大小一致// long length = file.length();// byte[] b = new byte[(int)length];// int len;// while((len=is.read(b))!=-1){// System.out.println(new String(b,0,len));// }//第二种方法 一次性读取完文件的全部字节到一个字节数组中byte[] bytes = is.readAllBytes();System.out.println(new String(bytes));is.close();}}
代码展示:
package com.lyc.io;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.InputStream;//测试文件字节输入流public class FileInputStreamTest {public static void main(String[] args) throws Exception {//1. 创建文件字节输入流管道,与源文件绑定File file = new File("src/main/java/com/lyc/io/test.txt");InputStream fis = new FileInputStream(file);//2. 从文件字节输入流管道中读取数据//创建空字节数组byte[] buffer = new byte[1024];// int read = fis.read();// System.out.println((char)read);//读取文件字节返回一个int类型数据,读取到文件末尾返回-1//循环读取int b;while ((b = fis.read(buffer)) != -1) {if (b > 0) {//注意:字节数组buffer中,有可能有0,也有可能有数据,所以需要使用字节数组的参数构造方法,指定读取的长度//所以,offset:0,length:b,从0开始,读取b个字节System.out.print(new String(buffer, 0, b));}}fis.close();//关闭流}}
文件字节输出流(FileOutputStream)
-
作用:以内存为基准,把内存中的数据以字节的形式写出到文件中去
构造器 | 说明 |
---|---|
FileOutputStream(File file) | 创建文件输出流以写入由指定的 File 对象表示的文件。 |
FileOutputStream(File file , boolean append) | 创建字节输出流管道与源文件接通,可追加数据 |
FileOutputStream(String name) | 创建文件输出流以指定的名称写入文件。 |
FileOutputStream(String name, boolean append) | 创建文件输出流以指定的名称写入文件。 可追加数据 |
方法名称 | 说明 |
---|---|
void``write(int b) | 将指定的字节写入此文件输出流。 |
void``write(byte[] b) | 将 b.length 个字节从指定的字节数组写入此文件输出流。 |
void``write(byte[] b, int off, int len) | 将 len 字节从位于偏移量 off 的指定字节数组写入此文件输出流。 |
void``close() | 关闭此文件输出流并释放与此流相关联的任何系统资源。 |
代码展示:
package com.lyc.io;import java.io.*;//测试文件字节输出流的使用public class FileOutputStreamTest {public static void main(String[] args) throws Exception {//创建一个文件字节输出流对象OutputStream os = new FileOutputStream("D:\\IdeaProjects\\collectionTest\\src\\main\\java\\com\\lyc\\io\\test2.txt",true);//true 表示追加数据InputStream is = new FileInputStream("src/main/java/com/lyc/io/test.txt");int len;byte[] b = new byte[1024];while ((len=is.read(b))!=-1){os.write(b,0,len);}//写入数据os.write(97);os.write('b');byte[] bytes = "我爱你但...".getBytes();os.write(bytes);//写入换行符 os.write("\r\n".getBytes());os.close();//关闭流is.close();}}
案例:文件复制
代码展示:
package com.lyc.io;import java.io.*;// 文件复制public class copyTest {public static void main(String[] args) throws Exception {// 复制照片File file = new File("E:\\桌面\\3D旋转魔方相册\\001.jpg");System.out.println(file.exists());// 1,创建一个字节输入流管道与源文件接通InputStream is = new FileInputStream(file);// 2,创建一个字节输出流管道与目标文件接通// 修改:将目标路径改为有效的文件路径String targetFilePath = "src/main/java/com/lyc/io/001_copy.jpg";OutputStream os = new FileOutputStream(targetFilePath);// 3,把输入流的数据复制到输出流中,一次读写一个字节数组byte[] b = new byte[1024];int len;while ((len = is.read(b)) != -1) {os.write(b, 0, len);}os.close();is.close();}}
小结:字节流非常适合做一切文件的复制操作,任何文件的底层都是字节,字节流做复制,是一字不漏的转移完所有字节,只要复制后的文件格式一致就没问题。
释放资源的方式
-
try-catch-finally
try {......} catch (IOException e) {e.printStackTrace();}finally {}
finally代码区的特点:无论try中的程序是正常执行了,还是出现了异常,最后一定会执行finally区,除非JVM终止
代码展示:
package com.lyc.io;public class TryTest {public static void main(String[] args) {try {int a = 110/2;return;//跳出整个方法//System.exit(0);//退出虚拟机}catch (Exception e){e.printStackTrace();}finally {System.out.println("finally");//始终会执行,除非虚拟机停止}}public static int test(int a, int b) {try {return a * b;} catch (Exception e) {e.printStackTrace();return -1;} finally {System.out.println("finally");//不要再finally中返回数据,不然整个方法最终返回的finally语句块中的数据,而不是方法中的数据}}}
使用场景:一般用于程序执行完成后进行资源的释放操作。
代码优化:
package com.lyc.io;import java.io.*;// 文件复制public class copyTest {public static void main(String[] args) throws Exception {OutputStream os = null;InputStream is = null;// 复制照片try {File file = new File("E:\\桌面\\3D旋转魔方相册\\001.jpg");System.out.println(file.exists());// 1,创建一个字节输入流管道与源文件接通is = new FileInputStream(file);// 2,创建一个字节输出流管道与目标文件接通// 修改:将目标路径改为有效的文件路径String targetFilePath = "src/main/java/com/lyc/io/001_copy.jpg";os = new FileOutputStream(targetFilePath);// 3,把输入流的数据复制到输出流中,一次读写一个字节数组byte[] b = new byte[1024];int len;while ((len = is.read(b)) != -1) {os.write(b, 0, len);}} catch (Exception e) {throw new RuntimeException(e);} finally {if (os != null) {os.close();}if (is != null) {is.close();}}}}
-
try-with-resource
try-catch-finally资源释放很专业,但是代码过于臃肿,在JDK7中推出了更简单的资源释放方案:try-with-resource
该资源使用完毕后,会自动调用其close()方法,完成对资源的释放
try(定义资源1;定义资源2){可能出现的异常代码;}catch(异常类名 变量名){异常的处理代码;}
代码展示:
package com.lyc.io;import java.io.*;//测试文件字节输出流的使用public class FileOutputStreamTest {public static void main(String[] args) throws Exception {try(//创建一个文件字节输出流对象OutputStream os = new FileOutputStream("D:\\IdeaProjects\\collectionTest\\src\\main\\java\\com\\lyc\\io\\test2.txt",true);//true 表示追加数据InputStream is = new FileInputStream("src/main/java/com/lyc/io/test.txt"); ) {int len;byte[] b = new byte[1024];while ((len=is.read(b))!=-1){os.write(b,0,len);}//写入数据os.write(97);os.write('b');byte[] bytes = "我爱你但...".getBytes();os.write(bytes);//写入换行符os.write("\r\n".getBytes());} catch (IOException e) {throw new RuntimeException(e);}}}
注意事项:try后面只能放置资源对象(流对象)。
资源:
- 都是会实现AutoCloseable接口
- 资源都会有close方法
以上就是字节流的详细内容,希望能够帮助到大家
相关文章:
IO流--字节流详解
IO流 用于读写数据的(可以读写文件,或网络中的数据) 概述: I指 Input,称为输入流:负责从磁盘或网络上将数据读到内存中去 O指Output,称为输出流,负责写数据出去到网络或磁盘上 因…...
6N60-ASEMI机器人功率器件专用6N60
编辑:ll 6N60-ASEMI机器人功率器件专用6N60 型号:6N60 品牌:ASEMI 封装:TO-220F 批号:最新 最大漏源电流:6A 漏源击穿电压:600V RDS(ON)Max:1.20Ω …...
实现侧边栏点击标题列表,和中间列表区域联动效果
左侧边栏标题列表实现: -------------------html-----------------------<divclass"uav":class"{ hidden: !isVisible, visible: isVisible }"><ul id"toc"><liv-for"(item, index) in HotList":key"…...
基于MuJoCo物理引擎的机器人学习仿真框架robosuite
Robosuite 基于 MuJoCo 物理引擎,能支持多种机器人模型,提供丰富多样的任务场景,像基础的抓取、推物,精细的开门、拧瓶盖等操作。它可灵活配置多种传感器,提供本体、视觉、力 / 触觉等感知数据。因其对强化学习友好&am…...
kafka监控kafka manager(CMAK)部署配置
一、准备工作 1.1、服务器信息梳理 角色IP操作系统安装服务监控机10.45.19.20Linux CentOS 7.9CMAK3.0.0.5、ZooKeeper3.9.0、JDK11、JDK1.8被监控机 Kafka broker.id 050.50.50.101Linux CentOS 7.9Kafka、ZooKeeper(任意版本)被监控机 Kafka broker.…...
线程池的介绍
目录 一、什么是线程池 二、线程池的详细内容 三、线程池的简化 一、什么是线程池 提到线程池,我们可能想到 常量池,可以先来说说常量池: 像是字符串常量,在Java程序最初构建的时候,就已经准备好了,等程…...
day33和day34图像处理OpenCV
文章目录 一、图像预处理12 图像梯度处理12.3 Sobel算子12.4 Laplacian算子1.原理:2.语法: 13 图像边缘检测思路13.1 高斯滤波去噪点13.2 计算图像的梯度与方向13.3 非极大值抑制13.4 双阈值筛选13.5 Canny方法和使用 14 绘制图像轮廓14.1 什么是轮廓14.…...
电脑硬盘常见的几种接口类型
一、传统接口(机械硬盘为主) 1. SATA 接口(Serial ATA) 特点: 最主流的机械硬盘(HDD)接口,广泛用于台式机和笔记本电脑。传输速度较慢,理论最大带宽为 6 Gbpsÿ…...
Windows网络及服务:制作系统盘
今天我要介绍的是一个比较有意思且好玩的一个小玩意儿:关于系统盘的制作; 注明:对于系统盘的制作,以及接下来的课程,基本是作为动手课业来进行的,这也是作为程序员的必要进行的一项活动。 对于系统盘&…...
Docker Compose 使用实例
文章目录 一、Docker Compose 简介二、安装 Docker Compose三、基础配置文件示例(docker-compose.yml)四、关键配置解析五、常用命令六、完整项目示例(Node.js MySQL Nginx)七、高级功能八、最佳实践九、调试技巧 一、Docker Co…...
系统架构师2025年论文《论基于UML的需求分析》
论基于 UML 的需求分析 摘要: 2018 年 3 月 1 日至 12 月 20 日,我参加了 “某市医院预约挂号系统” 项目的开发,担任系统架构师的工作。该项目是某市医院信息化建设的重要组成部分,目标是:优化医院挂号流程,提高患者就医体验,规范医院号源管理,实现患者预约挂号、医…...
Uniapp 自定义TabBar + 动态菜单实现教程(Vuex状态管理详解)
大家好,我是一诺。今天跟大家分享一下uniapp 封装自定义底部导航栏(TabBar) 过程中的思考和实践。通过本文,你将学会如何打造一个功能完善、可自由定制的TabBar组件! 先看效果: 支持自定义图标和样式动态…...
4月21日日记
新的一周开始了,好消息是未来这两周都每周只用上3天课,因为这周四五是运动会,下周四五是五一! 非常好的周一!收到了wxx和san还有小林的礼物!! wxx的是一个定制的有小排球的蓝牙影响࿰…...
2025高频面试算法总结篇【其他】
文章目录 直接刷题链接直达LRU Cache买卖股票的最佳时机系列实现一个HashMap环形链表寻找重复数缺失的第一个正数螺旋矩阵字符串相乘分发糖果 直接刷题链接直达 LRU Cache 头尾两个伪节点(避免判断) 双向链表146. LRU 缓存 买卖股票的最佳时机系列 121…...
vue项目中使用antvX6(可拖拽,vue3)
参考 先知demons 这位大佬的这篇文章:https://blog.csdn.net/wzy_PROTEIN/article/details/136305034?utm_mediumdistribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0-136305034-blog-136032209.235v43pc_blog_bottom_relevance_ba…...
文档处理控件Aspose.Words 教程:在 Word 中删除空白页完整指南
Word 文档中的空白页总是令人烦恼。如果您想从 Word 文档中删除空白页,以获得更清晰的演示文稿或整理文件,那么您来对地方了。本指南涵盖了使用 Aspose.Words编码解决方案和在 Microsoft Word 中手动删除方案,让您可以灵活地选择最适合自己的…...
自动驾驶最新算法进展
自动驾驶技术的算法进展迅速,涵盖感知、预测、规划、端到端学习等多个领域。以下是2023年至2024年的关键进展及实例: 1. 感知与融合 BEVTransformer的进化:特斯拉的Occupancy Networks升级至支持动态场景建模,结合NeRF技术…...
OpenCV训练题
一、创建一个 PyQt 应用程序,该应用程序能够: 使用 OpenCV 加载一张图像。在 PyQt 的窗口中显示这张图像。提供四个按钮(QPushButton): 一个用于将图像转换为灰度图一个用于将图像恢复为原始彩色图一个用于将图像进行…...
34、Spark实现读取XLS文件
需求背景: 有一些xls大文件数据。使用spark-excel(spark-excel)来读取时,文件太大会oom;工具提供的流式读取参数:maxRowsInMemory 也只支持xlsx类型文件。搜索了poi流式读取xls的方案,HSSFEvent…...
为什么RPN生成的候选框,要使用rcnn来进行分类和回归操作?
一句大白话总结:RPN是广撒网捕鱼,RCNN是细化鱼的分类和具体尺寸 在目标检测任务中,RPN(区域提议网络) 生成的候选框需要经过 RCNN(如 Fast R-CNN、Faster R-CNN) 进行分类和回归,这…...
固定总价合同工程范围变更,如果规避风险
一、合同签订阶段 工程范围的锁定 清单式列举 兜底条款:在合同附件中以 “正负零以上主体结构”“XX 型号设备采够” 等具体描述界定承包范围,同时约定 “超出本附件描述的工程内容视为变更”111。 设计深度要求:对于 EPC 项目,需…...
windows传文件给mac, linux或者其他windows
如果你想把你本地windows的文件传递给mac, linux或者其他windows电脑, 你会使用什么方法呢? 方法一 经常写python的朋友, 肯定会说, 我会用 SimpleHTTPServer python -m SimpleHTTPServer 8000生成一个超链接, 然后在其他机器上直接下载这个链接. 方法二 scp命令 Use SC…...
AI音乐解决方案:1分钟可切换suno、udio、luno、kuka等多种模型,suno风控秒切换 | AI Music API
你有没有觉得,suno风控来了,就要停服了? 你有没有觉得,对接多种音乐模型,让你很疲乏? 你有没有觉得,音乐模型,中文咬字不清楚,让你很苦恼? 别怕࿰…...
LeetCode 热题100题解(Java版本)
一、哈希 1、两数之和 https://leetcode.cn/problems/two-sum/?envType=study-plan-v2&envId=top-100-liked使用HashMap,遍历数组,判断当前元素的“补数”是否存在,如果存在直接返回结果,否则在Map中记录当前元素及其下标。 时间复杂度 O(n) 空间复杂度 O(n) class …...
突破传统!SEARCH-R1如何让LLM与搜索引擎协同推理?
大语言模型(LLMs)虽强大,但在复杂推理和获取最新信息方面存在局限。本文介绍的SEARCH-R1框架,通过强化学习让LLMs能自主与搜索引擎交互,在多个问答数据集上性能大幅提升。想知道它是如何做到的吗?快来一探究…...
C语言复习笔记--字符函数和字符串函数(下)
在上篇我们了解了部分字符函数及字符串函数,下面我们来看剩下的字符串函数. strstr 的使用和模拟实现 老规矩,我们先了解一下strstr这个函数,下面看下这个函数的函数原型. char * strstr ( const char * str1, const char * str2); 如果没找到就返回NULL指针. 下面我们看下它的…...
Git SSH 密钥多个 Git 来源
1. 生成 SSH 密钥 ssh-keygen -t rsa -b 4096 -C "997959066qq.com" 2. 输入指定路径 3. 增加 config文件在.ssh文件下 # GitHub 主账户 Host github.dis.comHostName github.disney.comUser gitIdentityFile ~/.ssh/id_rsa# 其他 Git 服务器 Host github.comHost…...
华为盒式交换机堆叠配置
1. 堆叠线缆连线图(如下图) 2. 配置Swtich1: [HUAWEI] sysname Switch1 [Switch1] interface stack-port 0/1 [Switch1-stack-port0/1] port interface xgigabitethernet 0/0/3 xgigabitethernet 0/0/4 enable Warning: Enabling stack function may cause configuration l…...
map和set的使用
序列式容器和关联式容器 c标准库为我们提供了多种容器类型,可以大体分为两类:序列式容器和关联式容器。 序列式容器按照线性顺序储存数据,元素的位置取决与插入的时间和地点。关联式容器基于键值对存储元素,提供高效的键查找能力…...
VMware制作Windows虚拟机模板注意点
1 、删除右下角的热删除 这个是必须的!虚拟机的高级参照中添加devices.hotplug “FALSE”,关闭USB设备热插拔,防止用户把虚拟桌面的网卡删除掉。 2、移除CD/DVD驱动器 这个建议!移除CD/DVD驱动器,此项操作…...
公有云攻防5(云函数)
Serverless概述 无服务器(Serverless)不是表示没有服务器,而是表示当您在使用Serverless时,您无需关心底层的资源,也无需登录服务器和优化服务器,只需关注最核心的代码片段,即可跳过复杂的、繁琐的基本工作。 Serverless 拥有近乎无限的扩容能力,空闲时,不运行任何资…...
【计算机网络】第五章 局域网技术
以太网技术 以太网的诞生 网络适配器和MAC地址 单播MAC地址 广播MAC地址 CSMA/CD协议 CSMA/CD协议的基本原理 共享式以太网---广播特性 MA多址接入 CS载波监听---先听后说 CD碰撞检测---边听边说 载波监听检测到总线空闲,但总线并不一定空闲。 使用CSMA/CD协议的…...
傲来云分享,负载均衡:提升网站性能与稳定性
在网站或应用的流量不断增加时,单台服务器往往无法承载过多的并发请求,导致性能下降和响应延迟。负载均衡技术正是为了解决这个问题,它可以将流量分发到多台服务器,从而提高系统的可扩展性、处理能力和可靠性。今天,我…...
Python基础总结(九)之推导式
文章目录 一、列表推导式1.1 列表推导式的格式1.2 列表推导式的注意事项1.3 列表推导式示例 二、 字典推导式2.1 字典推导式格式2.2 字典推导式注意事项2.3 字典推导式示例 三、 元组推导式3.1 元组推导式格式3.3 元组推导式示例 Python中的推导式有列表推导式,字典…...
程序员学商务英文之Terms of Payment Packing
Dia-3: Packing 1 包装-1 1. I’m here to improve my communication skill of English. 我来这里是为了提升我的英文沟通技能。 2. What a co-incidence! Fancy meeting you here. 这么巧!真没想到在这见到你。 3. Some birds aren’t meant to be caged…...
学生管理系统项目中的相关问题总结
目录 1. 项目中哪里体现出了封装性及其好处? 2. 项目中的setter/getter模式与封装性 什么是setter/getter?有什么用?怎么自动生成? 3.项目中某些类的toString()方法 4. 项目中几个常用方法解析 5. 项目中的面向对象设计 1…...
AI驱动下的企业学习:人力资源视角下的范式重构与价值觉醒
一、传统企业学习体系的系统性失效 当企业学习市场规模突破3600亿美元,人均年投入达1400美元的历史高位时,这场看似繁荣的图景背后却暗藏结构性危机。正如一份2024年研究报告所指出的,66%的企业仍倾向于通过外部招聘而非内部培养获取AI人才&…...
工厂模式:简单工厂模式
工厂模式 简单工厂模式:子类对象较多,则引入工厂类来创建 简单工厂模式 流程: 实例: 某电视机厂为各个品牌代工生产电视机,可以使用简单工厂的模式来实现 #include <iostream> #include <vector> using…...
Java并发编程-线程池
Java并发编程-线程池 线程池运行原理线程池生命周期线程池的核心参数线程池的阻塞队列线程池的拒绝策略线程池的种类newFixedThreadPoolnewSingleThreadExecutornewCachedThreadPoolnewScheduledThreadPool 创建线程池jdk的Executors(不建议,会导致OOM)jdk的ThreadP…...
ios17 音频加载失败问题
现象: 项目中有2个MP3 格式的音频,在iOS17 下 一个可以播,一个不能播,但是在浏览器可 正常播放 原因: 不能播的mp3是因为其编码格式为mpeg-4 AAC 编码格式 正常的mpeg audio 是可以播放的 解决&am…...
HarmonyOS:Navigation实现导航之页面设置和路由操作
导读 设置标题栏模式设置菜单栏设置工具栏路由操作页面跳转页面返回页面替换页面删除移动页面参数获取路由拦截 子页面页面显示类型页面生命周期页面监听和查询 页面转场关闭转场自定义转场共享元素转场 跨包动态路由系统路由表自定义路由表 示例代码 Navigation组件适用于模块…...
ADB -> pull指令拉取手机文件到电脑上
ADB Pull命令 在Android开发中,ADB的pull命令可以帮助我们将文件从设备拷贝到电脑上。 基本语法 adb pull <设备文件路径> [本地目标路径]<设备文件路径>:必需参数,指定要拉取的设备上的文件或文件夹[本地目标路径]࿱…...
Android Studio打开xml布局文件内存会快速增加如何设置
打开xml布局文件内存快速增加的原因是预览设置问题,直接在file-setting-editor-ui tools-editor view mode-resource: 选择code 就好了...
Spring Boot集成Keycloak
前言 本文参考A Quick Guide to Using Keycloak with Spring Boot,整理实战中遇到的问题。 Docker 安装 Keycloak 下载镜像 quay下载镜像 docker pull quay.io/keycloak/keycloak 失败的话,可再次尝试。 启动keycloak docker run -p 6060:8080 -…...
实验七 shell程序设计
实验七 shell程序设计 一、实验目的 理解shell的工作原理,学会编写shell脚本。 二、实验内容 1.编写不同功能的脚本程序。 2.利用chmod修改文件权限。 3.掌握脚本文件执行的方法。 三、主要实验步骤 1.创建一个名为zs_lab7的目录,下边实验步骤都在…...
FlaskRestfulAPI接口的初步认识
FlaskRestfulAPI 介绍 记录学习 Flask Restful API 开发的过程 项目来源:【Flask Restful API教程-01.Restful API介绍】 我的代码仓库:https://gitee.com/giteechaozhi/flask-restful-api.git 后端API接口实现功能:数据库访问控制…...
自定义错误码的必要性
为什么要使用错误码,直接返回一个错误信息不好么? 下面介绍一下,在程序开发中使用错误码的必要性~ 便于排查问题 想象你开了一家奶茶店,顾客下单后可能出现各种问题: 没珍珠了(错误码:50…...
快手砍掉本地生活的门槛
一场本地商家的效率革命。 作者|景行 编辑|杨舟 “两斤鸡翅根七块九,两盒蓝莓九块钱,两公斤卫生纸十四块九一提。” 这是朝阳佳惠超市,在快手一则普通的短视频内容。 佳惠超市在辽宁省朝阳市有22家分店,打开佳惠超市的相关快手…...
Python+Word实现周报自动化的完整流程
一、技术方案概述 自动化报表解决方案基于以下技术组件: Python 作为核心编程语言python-docx 库用于处理 Word 文档pandas 库用于数据处理和分析matplotlib 或 plotly 库用于数据可视化Word 模版作为报表的基础格式 这种方案的优势在于:保留了 Word 文…...
PCIE Spec ---Base Address Registers
7.5.1.2.1 Base Address Registers (Offset 10h - 24h) 在 boot 到操作系统之前,系统软件需要生产一个内存映射的 address map ,用于告诉系统有多少内存资源,以及相应功能需要的内存空间,所以在设备的 PCI 内存空间中就有了这个 …...