【文件IO】文件系统的操作 流对象 字节流(Reader/Writer)和字符流 (InputStream/OutputStream)的用法
目录
1.文件系统的操作 (File类)
2.文件内容的读写 (Stream流对象)
2.1 字节流
2.2 字符流
2.3 如何判断输入输出?
2.4 reader读操作 (字符流)
2.5 文件描述符表
2.6 Writer写操作 (字符流)
2.7 InputStream (字节流)
2.8 OutputStream (字节流)
2.9 字节流转字符流
3.练习题
3.1 扫描指定目录
3.2 进行文件的复制
3.3 扫描指定目录
什么是文件?
文件是一个广义的概念。操作系统里会把很多的硬件设备和软件资源都抽象成"文件",统一进行管理。大部分情况下,谈到的文件都是指硬盘的文件。文件就相当于是针对"硬盘"数据的一种抽象。
硬盘大致分为:
- 机械硬盘(HDD) 适合于顺序读写,不适合随机读写。
- 固态硬盘(SSD) 现在的电脑基本都是固态硬盘。
IO
- I : input输入
- O: output输出
内存和硬盘
- 内存速度快,硬盘速度慢。
- 内存空间小,硬盘空间大。
- 内存贵,硬盘便宜。
- 内存的数据断电就会丢失,硬盘的数据断电还在。
目录:其实是一种树形结构,描述文件所在的位置。
文件系统:用来管理一台计算机上的很多文件
路径:分为绝对路径和相对路径。用来定位某一计算机资源。
- 绝对路径:指的是一个文件从根目录开始的实际存在于硬盘中的路径。
- 相对路径:指的是相对于当前目录的路径。
文本类型
从编码的角度来看,文件主要是两大类:
- 文本 (文件中保存的数据,都是字符串,保存的内容要求都是合法的字符)
- 二进制 (文件中保存的数据,是二进制数据,不要求保存的内容是合法的字符)
常见的字符集有UTF-8,GBK。 查看码表 -> 点击查看
如何判断一个文件是文本还是二进制?
一种方法是直接用记事本打开这个文件,如果打开之后出现乱码,则文件就是二进制;反之就是文本。(能用记事本打开的原因是因为记事本就是会尝试按照字符的方式来展示内容,这个过程就会自动查码表)。在我们电脑上,很多文件都是二进制的,比如docx,pptx,... 都属于二进制。同时区分文本和二进制也是很重要的。
Java中对于文件的操作 ,有两类:
(1)文件系统的操作 (File类)
- 创建文件,删除文件,判断文件是否存在,判定文件类型等。
(2)文件内容的操作 (流对象 Stream)
- 读文件/写文件(InputStream / OutputStream,Reader / Writer)
1.文件系统的操作 (File类)
一个目录中,用来分割目录的路径分隔符,“/”。由于操作系统不同,有的可能是“/”,有的可能是“\”。于是Java提供了pathSeparator()这个方法,后续使用都可以调用这个方法,可以避免在不同的操作系统上运行时出错。
构造方法:
最常用是第二个,在构造对象的时候。传入路径。相对路径或绝对路径。
常用的方法:
举个例子:我们在D盘下创建一个文件:text.txt。
public class test {public static void main(String[] args) throws IOException {File file = new File("d:/test.txt");boolean ret = file.createNewFile(); //创建一个空文件System.out.println("父目录文件路径: " + file.getParent()); //得到父目录文件路径System.out.println("文件名: " + file.getName()); //得到文件名System.out.println("文件路径: " + file.getPath()); //得到文件路径System.out.println("绝对路径: " + file.getAbsolutePath()); //得到绝对路径System.out.println("==================");System.out.println("文件是否存在: " + file.exists()); //判断文件是否存在System.out.println("文件是否是一个目录: " + file.isDirectory()); //判断该文件是否是一个目录System.out.println("文件是否是一个普通文件: " + file.isFile()); //判断该文件是否是一个普通文件}}
注意:getName方法得到的文件名是加扩展名的,文件=前缀+扩展名。扩展名类似 .txt,.java这样的。 并且在构造对象时,文件名要完整。有扩展名的要加上。
2.删除文件操作
有两种,一种是直接删除 delete() 方法,另一种是等JVM运行结束后再删除 deleteOnExit() 方法。比如有多线程执行时,等执行完后再删除。后者的使用举例:比如我们在写word还没保存时,系统就会生成一种临时文件机制。
3.查看文件名,创建,删除目录, 文件重命名
使用list方法可返回当前目录下的所有文件名。前提是该对象是目录,而不是一个类似于.txt记事本这样的文件,这种会返回null。并且在打印时不能直接打印对象,这样会打印出哈希值。要用Arrays.toString() 方法打印。
创建目录有两种,一种是只能创建一级目录 mkdir() 方法,另一种是可以创建多级目录 mkdirs() 方法。
文件重命名使用 renameTo() 方法。
public class test {public static void main(String[] args) throws IOException {File srcFile = new File("d:/aaa");File destFile = new File("d:/bbb");//File srcFile = new File("d:/test.txt");//File destFile = new File("d:/test2.txt");srcFile.renameTo(destFile); //注意是谁调用谁}
}
2.文件内容的读写 (Stream流对象)
在Java标准库中,提供的读写文件的流对象,不是一两个类,而是有很多类,虽然这里有很多的类,实际上这些类都可以归结到两个大的类别中。
2.1 字节流
- 对应着"二进制文件",每次读写的最小单位,都是"字节"。
- 读 :Reader
- 写: Writer
2.2 字符流
- 对应着文本文件,每次读写的最小单位是"字符",(一个字符对应着一个或多个字节,比如在GBK中,一个中文字符对应两个字节;UTF-8中,一个中文字符对应三个字节)。
- 字符流本质上是针对字节流进行了一层封装。
- 读:InputStream
- 写:OutputStream
2.3 如何判断输入输出?
假设我们把一个数据保存到硬盘中,如果站在硬盘的角度就是输入,如果站在CPU的角度就是输出。
而我们通常所说的输入输出就是站在CPU的角度去看的。
- 读操作就可以认为是将硬盘上的数据放到CPU中使用。(进入cpu)
- 写操作就可以认为是通过CPU往硬盘上存储数据。(远离cpu)
2.4 reader读操作 (字符流)
有下面这三种方法:
- read(); 无参数:一次只读取一个参数。返回值为整数。
- read(char[] cbuf); 一次读取若干个字符,会把参数指定的cbuf数组给填充满。
- read(char[] cbuf,int off,int len); 一次读取若干个字符,会把这个数组从off到len范围内填充。就是把数据存到这个字符数组中。
1.read();
public class test {public static void main(String[] args) throws IOException {Reader reader = new FileReader("d:/test.txt");while(true) {int n = reader.read(); //无参if(n==-1) break;char ch = (char)n;System.out.println(ch);}}
}
至于为什么要返回整数而不应该是char型?源码:
翻译为:读取的字符,取值范围为0到65535 (0x00-0xffff)的整数(两个字节的范围),如果已经到达流的结尾,则为-1。即就是每次读取一个两个字节的数据,当读取到-1则表示读取结束。
使用整形一方面是表示-1这样的特殊情况。
还有就是到0到65535是两个字节的范围,我们知道在unicode编码中是一个中文字符对应两个字节,而在UTF-8中,一个中文字符对应三个字节。那要是使用UTF-8不会范围不够吗?
其实在Java标准库内部,对于字符集编码进行了很多的处理工作,如果只使用char,此时使用的字符集固定就是unicode;如果是使用String,就会自动的把每个字符的unicode转换成UTF-8。
2. read(char[] cbuf); 往read里传入一个空的数组,数组用来存储数据。这里的返回值表示实际读取到的字符的个数,与无参的不同,读到末尾,还是返回-1。
public class test {public static void main(String[] args) throws IOException {//一次readr读多个字符 Reader reader = new FileReader("d:/test.txt");while(true) {char[] cbuf = new char[1024]; //创建一个空的字符数组int n = reader.read(cbuf); //传入空字符数组if(n==-1) { //-1表示读取结束break;}System.out.println("字符个数为:"+n); //此处这个带参的 n 表示读取的字符个数for(int i=0;i<n;i++) {System.out.println(cbuf[i]); //打印独读到的数据}}//一个文件使用完后,一定要记得close !!!reader.close();}}
这里还有一个重要的细节:如果使用Java的Reader方法读取文件后,一定要使用close()方法。主要目的是为了释放空间,更深的来说是释放文件描述符。
2.5 文件描述符表
是PCB中的一个属性,其本质上是一个顺序表(数组),一个进程每次打开一个文件,操作系统会为其在这个表里分配一个文件描述符(元素),而这个数组的长度是存在上限的。如果我们编写的代码一直去打开文件,而不去关闭的话,就会使这个表里的元素越来越多,直到把这个数组给占满,后续再尝试打开文件就会出错。会造成文件泄露,类似内存泄漏。
但内存泄漏,Java不用担心,Java中有GC(Garbage Collection)垃圾收集机制。但是文件还是要手动释放关闭的。所以用完文件后一定要记得 手动 close。
不过上面代码的代码还是存在一些问题,有可能close方法执行不到,万一代码还没执行到close时抛出个啥异常,就会导致不能close。
解决办法:使用try...finally... 将close方法写到fianlly里,这样无论抛出异常与否,fianlly语句都会执行。
public class test{public static void main(String[] args) throws IOException {Reader reader = new FileReader("d:/test.txt");try{while(true) {char[] cbuf = new char[1024]; //创建一个空的字符数组int n = reader.read(cbuf); //传入空字符数组if(n==-1) { //-1表示读取结束break;}System.out.println("字符个数为:"+n); //此处这个带参的 n 表示读取的字符个数for(int i=0;i<n;i++) {System.out.println(cbuf[i]); //打印独读到的数据}}}finally {//一个文件使用完后,一定要记得close !!!reader.close();}}}
上面这样写也可以,但是代码不够优雅,改进一下。
public static void main(String[] args) throws IOException {try(Reader reader = new FileReader("d:/test.txt")) {while(true) {char[] arr = new char[1024];int n = reader.read(arr);if(n==-1) break;System.out.println(n); //n为实际读到的字符个数for(int i=0;i<n;i++){System.out.println(arr[i]);}}}}
这次我们在try后跟了括号,一种新奇的写法,为啥能跟小括号呢?
这是Java7所提供的try-with-resources机制,会将实现了AutoCloseable接口(或者Closeable接口)的资源定义在try块无论是正常结束或是异常结束,这个资源都会被自动关闭。try小括号里面的部分称为try-with-resources块。虽然我们既没有fianlly,也没有调动close方法。但是只要你使用了这样的语法,编译器在背后就会自动帮我们去生成finally块,并且在里面也会调用关闭资源的close方法。
try的括号中所有实现Closeable的类声明都可以写在里面,流操作都可以这样写。这个语法的目的是()里定义的变量,会在try代码块结束的时候(无论是正常结束还是异常结束),自动调用其中的方法。前提是()里的对象必须要实现Closeable接口。所以我们以后在操作流对象时基本都这样写了。
2.6 Writer写操作 (字符流)
同Reader一样,Writer也有多种重载方法。
- write(int c); 一次写一个字符
- write(String str); 一次写一个字符串
- write(char[ ] cbuf); 一次写多个字符 字符数组
- 后两个值的是从数组/字符串的第offset个字开始写。
- 上面这些方法最常用的还是write(String str),一次写一个字符串。
public static void main(String[] args) throws IOException {try(Writer writer = new FileWriter("d:/test.txt")) {writer.write("你好!");}}
这样写默认情况是每次会覆盖掉之前文件中的内容。如果不想覆盖,而是想写到原来文件内容的末尾,就要在创建对象参数列表里加参数true。
public static void main(String[] args) throws IOException {try(Writer writer = new FileWriter("d:/test.txt",true)) {writer.write("你好!");}}
2.7 InputStream (字节流)
用法跟Reader差不多,都是读操作,不过这里是字节流,以字节为单位。只能传入字节byte数组。这里的返回值为实际读到的字节数。
public static void main(String[] args) {try(InputStream inputStream = new FileInputStream("d:/test.txt")) {byte[] bytes = new byte[1024]; //创建空的byte数组int n = inputStream.read(bytes); //传入byte数组System.out.println(n);for(int i=0;i<n;i++) {System.out.printf("%x\n",bytes[i]); //以十六制形式打印}} catch (IOException e) {e.printStackTrace();}}
2.8 OutputStream (字节流)
用法也是跟Writer差不多,都是写操作。不过这里是字节流,以字节为单位。只能传入字节byte数组。
虽然只能传入byte数组,但是我们可以通过字符串转byte数组。使用getBytes()方法。
public static void main(String[] args) {try (OutputStream outputStream = new FileOutputStream("d:/test.txt")) {String str = "你好!";outputStream.write(str.getBytes());} catch (IOException e) {e.printStackTrace();}
}
同样,默认情况下,这种写操作是会覆盖掉之前文件里的内容,要想不覆盖掉,创建对象的参数中加true。
public static void main(String[] args) {try (OutputStream outputStream = new FileOutputStream("d:/test.txt",true)) {String str = "你好!";outputStream.write(str.getBytes());} catch (IOException e) {e.printStackTrace();}
}
2.9 字节流转字符流
读操作使用Scanner。将InputStream实例对象传入Scanner中。就可以使用Scanner提供的一些方法 (例如.next()等) 读取数据了。
public static void main(String[] args) {try (InputStream inputStream = new FileInputStream("d:/test.txt")) {//将实例对象传入ScannerScanner sc = new Scanner(inputStream);//使用Scanner提供的一些方法读取文件中的数据String s = sc.next();System.out.println(s);} catch (IOException e) {e.printStackTrace();}
}
写操作使用PrintWriter。也是和Scanner一样,将OutputStream实例对象传入PrintWriter中。
public static void main(String[] args) {try (OutputStream outputStream = new FileOutputStream("d:/test.txt")) {PrintWriter printWriter = new PrintWriter(outputStream);printWriter.println("Hello");} catch (IOException e) {e.printStackTrace();}}
不过上面这样写,我们会发现最终并没有写成功。原因是存在"缓冲区"。我们这里的写文件实际上是写入硬盘。
PritWriter这样的类,在进行写入的时候不一定是直接写入硬盘,而是先把数据写入到一个由内存构成的"缓冲区"(buffer)。引入缓冲区目的还是为了提高效率。因为把数据写入内存是非常快的,而写入硬盘却是非常慢的。为了提高效率,就会减少写硬盘的操作。这样就会使数据还未写入硬盘,进程就结束了。
解决办法:手动添加一行代码:printWriter.flush(); 作用刷新缓冲区
public static void main(String[] args) {try (OutputStream outputStream = new FileOutputStream("d:/test.txt")) {PrintWriter printWriter = new PrintWriter(outputStream);printWriter.println("Hello");printWriter.flush(); //加这段代码很重要 不能忽略} catch (IOException e) {e.printStackTrace();}}
3.练习题
3.1 扫描指定目录
扫描指定目录,并找到名称中包含指定字符的所有普通文件(不包含目录),并且后续询问用户是否要删除该文件。
public class test {public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("请输入一个要扫描的路径:");String path = sc.next();File file = new File(path);//判断路径是否合法if(!file.isDirectory()) {System.out.println("您输入的路径有误!");return;}//让用户输入一个目标文件名的关键词System.out.println("请输入文件的关键词:");String key = sc.next();//让这个方法进行递归扫描scanDir(file,key);}private static void scanDir(File rootPath, String key) {//当前文件的所有子文件File[] files = rootPath.listFiles();// 判断文件(文件夹)是否为空if(files==null) {return;}else{//判断是否是普通文件for(File f:files) {//输出当前扫描文件的进度System.out.println(f.getAbsolutePath());if(f.isFile()) {//是普通文件 判断并删除isDel(f,key);}else{//不是普通文件(文件夹) 继续递归遍历scanDir(f,key);}}}}//对普通文件进行删除操作private static void isDel(File file,String key) {if(file.getName().contains(key)) {System.out.println("是否要删除?Y/N");Scanner sc = new Scanner(System.in);String choice = sc.next();if(choice.equals("Y") || choice.equals("y")) {boolean bool = file.delete();if(bool) {System.out.println("删除成功!");}}else{return;}}}}
3.2 进行文件的复制
文件内容的复制。
首先会检查源文件是否是一个普通文件,再检查目的路径是否是一个目录。目的路径目录下有重名文件时是否覆盖功能。无重名文件时创建原空文件,并读写数据。
public class test {public static void main(String[] args) throws IOException {//先让用户输入要复制的源文件地址(仅输入目录)Scanner sc = new Scanner(System.in);System.out.println("请输入要复制源文件的路径:");String sources = sc.next();File file = new File(sources);//判断文件是否是一个目录(即文件夹)if(!file.isFile()) {System.out.println("不是一个有效的普通文件!");return;}//让用户输入复制文件的目的地(不包含文件本身,只包含目录)System.out.println("请输入要复制文件的目的路径:");String destDir = sc.next();File file1 = new File(destDir);if(!file1.isDirectory()) {System.out.println("目的路径有误!");return;}//得到源文件的文件名String yuan = file.getName();//创建完整的目的文件File file2 = new File(destDir+"/"+yuan);if(!file.getName().equals(file2.getName())) {System.out.println("请检查目的路径输入是否正确:"+file2.getAbsolutePath());return;}//判断目的路径是否有和源文件同名的文件if(file2.exists()) {// 是否覆盖System.out.println(file2.getAbsolutePath());System.out.println("该路径下已有重名文件,是否覆盖? Y/N");String choice = sc.next();if(choice.equals("Y") || choice.equals("y")) {//不用创建普通文件 进行覆盖copyFile(file,file2);}return;}file2.createNewFile();//进入复制操作copyFile(file,file2);}private static void copyFile(File sourDir, File destDir) throws IOException {//先将目标文件数据读出来,再写入新的文件try(OutputStream os = new FileOutputStream(destDir)) {try(InputStream is = new FileInputStream(sourDir)) {//字节流读 先创建字节数组 再将源文件的数据读到一个临时的数组中 再把这个临时数组中的内容写入新复制的文件中while(true) {byte[] bytes = new byte[1024];int n = is.read(bytes);if(n==-1) {break;}//将数据写入新复制的文件中os.write(bytes,0,n);}}os.flush();}System.out.println("文件复制完成!");}
}
3.3 扫描指定目录
扫描指定目录,并找到名称或者内容中包含指定字符的所有普通文件(不包含目录)。
和3.1差不多,再判断普通文件名是否包含关键词的基础上加了一个普通文件内容是否包含关键词。
public class test03 {public static void main(String[] args) throws IOException {Scanner sc = new Scanner(System.in);System.out.println("请输入一个要扫描的路径:");String path = sc.next();File file = new File(path);//判断路径是否合法if(!file.isDirectory()) {System.out.println("您输入的路径有误!");return;}//让用户输入一个目标文件名的关键词System.out.println("请输入文件的关键词:");String key = sc.next();//让这个方法进行递归扫描scanDir(file,key);}private static void scanDir(File rootPath, String key) throws IOException {//当前文件的所有子文件File[] files = rootPath.listFiles();// 判断文件(文件夹)是否为空if(files==null) {return;}else{//判断是否是普通文件for(File f:files) {//输出当前扫描文件的进度//System.out.println(f.getAbsolutePath());if(f.isFile()) {//是普通文件 进行判断isContains(f,key);}else{//不是普通文件(文件夹) 继续递归遍历scanDir(f,key);}}}}private static void isContains(File f, String key) throws IOException {String str = null;//字节流转字符流 Scannertry (InputStream is = new FileInputStream(f)) {//读内容 字节流//将InputStream对象传入Scanner中Scanner sc = new Scanner(is);str = sc.next();}if(f.getName().contains(key) || str.contains(key)) {System.out.println(f.getAbsolutePath());}}}
相关文章:
【文件IO】文件系统的操作 流对象 字节流(Reader/Writer)和字符流 (InputStream/OutputStream)的用法
目录 1.文件系统的操作 (File类) 2.文件内容的读写 (Stream流对象) 2.1 字节流 2.2 字符流 2.3 如何判断输入输出? 2.4 reader读操作 (字符流) 2.5 文件描述符表 2.6 Writer写操作 (字符流) 2.7 InputStream (字节流) 2.8 OutputStream (字节流) 2.9 字节…...
计算机网络 | 数据链路层
计算机网络 | 数据链路层 计算机网络 | 数据链路层基本概念功能概述封装成帧与透明传输封装成帧透明传输字符计数法字符填充法零比特填充法违规编码法小结 差错控制差错是什么?差错从何而来?为什么要在数据链路层进行差错控制?检错编码奇偶校…...
C#,数值计算——分类与推理Gaumixmod的计算方法与源程序
1 文本格式 using System; using System.Collections.Generic; namespace Legalsoft.Truffer { public class Gaumixmod { private int nn { get; set; } private int kk { get; set; } private int mm { get; set; } private double…...
【Android】Intel HAXM installation failed!
Android Studio虚拟机配置出现Intel HAXM installation failed 如果方案一解决没有作用,就用方案二再试一遍 解决方案一: 1.打开控制面板 2.点击左侧下面最后一个程序 3.点击启用或关闭Windows功能 4.勾选Windows虚拟机监控程序平台 5.接下来重启电脑…...
2023年中国自动驾驶卡车市场发展趋势分析:自动驾驶渗透率快速增长[图]
自动驾驶卡车的技术原理是通过电脑算法控制车辆行驶,辅助驾驶员完成任务。其实现方式主要是基于传感器和计算处理技术。自动驾驶卡车可以随时感知周围环境,灵活避障,自适应调整行驶路径,相比之下传统卡车需要驾驶员进行手动操作&a…...
力扣第17题 电话号码的字母组合 c++ 回溯 经典提升题
题目 17. 电话号码的字母组合 中等 相关标签 哈希表 字符串 回溯 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。…...
华纳云:怎么判断VPS的ip是不是公网ip
要判断一个VPS的IP地址是否为公网IP,您可以执行以下步骤: 查看IP地址: 首先,获取您的VPS的IP地址。您可以使用以下命令来查看VPS的IP地址: curl ifconfig.me 或 curl ipinfo.io/ip 这些命令将显示VPS的公网IP地址。 检…...
QT学习笔记1-Hello, QT
1. QT环境 1.1 QT_CREATOR QT的集成开发工具,可以进行项目的创建运行。有一些实例可以运行之。 1.2 QT_ASSISTANT QT的工具书 2. 核心的概念 2.1 windows 窗口 2.2 widget 组件放置在窗口上的 2.3 bar 栏 2.4 icon 图标 3. Hello, QT 3.1 main.cpp …...
水滴卡片效果实现
效果展示 CSS 知识点 border-radius 属性运用 FANCY-BORDER-RADIUS 工具 此工具主要是实现不规则的图形。 FANCY-BORDER-RADIUS 工具地址 页面整体布局实现 <div class"container"><div class"drop" style"--clr: #ff0f5b">&l…...
【算法题】2899. 上一个遍历的整数
插: 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 坚持不懈,越努力越幸运,大家一起学习鸭~~~ 题目: 给你一个下标从 0 开始的字符串数组…...
Python+unittest+requests接口自动化测试框架搭建 完整的框架搭建过程
首先配置好开发环境,下载安装Python并下载安装pycharm,在pycharm中创建项目功能目录。如果不会的可以百度Google一下,该内容网上的讲解还是比较多比较全的! 大家可以先简单了解下该项目的目录结构介绍,后面会针对每个文…...
系统架构设计:19 论数据挖掘技术的应用
目录 一 数据挖掘技术 1 数据挖掘的分类 2 数据挖掘的主要方法 一 数据挖掘技术 从技术角度看,数据挖掘可以定义为从大量的、不完全的、有噪声的、模糊的、随机的实际数据中提取隐含在其中的、人们不知道的、但又潜在有用的信息和知识的过程。</...
如何选择高防CDN和高防IP?
目录 前言 一、对高防CDN的选择 1. 加速性能 2. 抗攻击能力 3. 全球覆盖能力 4. 可靠性和稳定性 二、对高防IP的选择 1. 防御能力 2. 服务质量 3. 安全性 4. 价格 三、高防CDN和高防IP的优缺点对比 1. 高防CDN的优缺点 2. 高防IP的优缺点 总结 前言 随着互联网…...
【html】利用生成器函数和video元素,取出指定时间的视频画面
简言 有的时候想截取视频某一秒的视频画面。 手动截取操作麻烦,还得时刻关注视频播放时间。 于是,我搞出来了一个根据视频自动截取特定时间描述的页面。 效果 实现步骤 获取视频对象根据视频时长生成时间选择表单根据表单选择的时间和视频地址&#x…...
第五十九章 学习常用技能 - 将数据从一个数据库移动到另一个数据库
文章目录 第五十九章 学习常用技能 - 将数据从一个数据库移动到另一个数据库 第五十九章 学习常用技能 - 将数据从一个数据库移动到另一个数据库 如果需要将数据从一个数据库移动到另一个数据库,请执行以下操作: 识别包含数据及其索引的Global。 如果…...
虚拟示波器的设计与实现
摘 要 针对传统示波器功能单一、不方便更新升级的缺陷,本文基于虚拟仪器软件LabVIEW和NI PCI-6221数据采集卡设计并实现了一种多功能虚拟示波器,该虚拟示波器不仅具有采集和显示实际信号时域波形的功能,还具有信号产生、波形存储等功能。 测试…...
ImgPlus:基于CodeFormer的图片增强
背景 最近参与了华为云开发者大会AI赛道,做了一个AI图片增强作品,本片文章来简单介绍一下。 正文 作品名称:ImgPlus 赛题技术领域选择: AI,图片增强 使用技术名称: CodeFormer,ECS࿰…...
2024华为校招面试真题汇总及其解答(二)
6.【算法题】三步问题 题目: 三步问题。有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模1000000007。 示例1: 输入:n = 3 输出:4说明: 有四种走法示例2: 输入:n = 5输出:1…...
编译链接(Compile Link)
文章目录 前言一、翻译环境1、概念2、翻译环境的组成3、什么是编译链接? 二、编译1、编译的阶段2、预编译3、编译1、什么是语法分析?2、什么是词法分析?3、什么是语义分析?4、什么是符号汇总? 4、汇编1、符号表展示 三…...
14 幂等生产者和事务生产者
kafka消息交付可靠性保障和精确一次语义处理 消息交付可靠性保障,指的kafka对Producer和Consumer要处理的消息提供什么样的承诺。总共就三种:at most once 、at least once、axactly once kafka默认提供的是 at least once。原因是只有Broker提交消息并…...
zabbix部署与监控
目录 一、什么是zabbix? 二、zabbix 监控原理 三、Zabbix 新特性 三、Zabbix 功能组件 四、部署 zabbix zabbix的服务端部署 zabbix的客户端部署 zabbix的服务端部署 一、什么是zabbix? zabbix 是一个基于 Web 界面的提供分布式系统监视以及网络…...
Python 编程基础 | 第五章-类 | 5.8、运算符重载
一、运算符重载 1、Python类内置方法 Python常用内置方法,如下: __init__: 构造函数,在生成对象时调用__del__: 析构函数,释放对象时使用__repr__: 打印,转换__setitem__࿱…...
【前端设计模式】之解释器模式
解释器模式是一种行为设计模式,它用于解释特定语言或规则的表达式。在前端开发中,解释器模式可以用于处理复杂的逻辑或规则,并将其转化为可执行的代码。 解释器模式特性 定义语言规则:解释器模式通过定义语言规则来解析和执行表…...
TiDB 7.4 发版:正式兼容 MySQL 8.0
MySQL 是全球最受欢迎的开源数据库,长期位于 DB-Engines Ranking 排行榜第二名,在世界范围内拥有数量庞大的企业用户和开发者。然而,随着时间的推移,MySQL 用户正面临新挑战。Oracle 官宣将在 2023 年 10 月终止 MySQL 5.7 版本的…...
QT 网络编程 服务端 客户端 QTcpServer
服务端的创建 //创建服务端QTcpServer对象 server new QTcpServer(this);//设置服务端,端口,这里绑定的是主机的所有网卡, server->listen(QHostAddress::Any, 8080);//绑定连接信号与槽 connect(this->server, &QTcpServer::new…...
Stm32_标准库_16_串口蓝牙模块_手机与蓝牙模块通信_手机传入信息能对芯片时间日期进行更改
实现了手机发送信息给蓝牙模块,程序对数据进行分析拆解,并更新自身数据 main.c: #include "stm32f10x.h" // Device header #include "Delay.h" #include "OLED.h" #include "Serial.h" #include "Ti…...
137.【SpringCloud-快速搭建】
微服务框架搭建 (一)、SpringCloud-Parent1.创建一个SpringBoot项目2.导入我们的依赖 (二)、SpringCloud-API (实体类)1.创建一个SpringBoot项目2.导入我们的依赖3.创建我们的实体类 (三)、SpringCloud-dept (业务A)1.创建一个SpringBoot项目2.导入我们的依赖3.配置我们的配置信…...
计算机网络第2章-CDN(4)
视频流和内容分发网 HTTP流和DASH 在HTTP流中,视频只是存储在HTTP服务器中作为一个普通的文件,每个文件有有一个特定的URL。当用户要看视频时,客户与服务器之间创建一个TCP连接并发送HTTP GET请求。 HTTP流具有严重缺陷,即所有…...
Linux常见的指令合集
Linux指令合集 认识linuxlinux基础指令1.pwd 命令2. ls 命令3.cd 命令4. man 命令5. grep 命令6. ps 命令7. kill 命令8. netstat 命令9. date 查看当前系统时间10. echo 打印选项 -e linux文件操作指令1. mkdir 命令2. rmdir 命令3. touch 命令4. rm 命令5. mv 命令6. cp 命令…...
字符串_哈希
参考文章: E. Compress Words(字符串hash)_z听歌的小孩z的博客-CSDN博客 字符串哈希 - OI Wiki (oi-wiki.org) 板子: #include<bits/stdc.h> using namespace std; const int N2e450; typedef long long ll; const int mod1e97; typedef unsig…...
山乙建设公司网站/百度舆情
设置vscode为中文ctrshiftp 输入 configure language 进 en更改为zh-cn , 重启vscode即可 , 如果还不行,就安装插件 转载于:https://www.cnblogs.com/enych/p/10550095.html...
教人做家具的网站/seo关键词平台
手机拍照反差对焦、相位对焦和激光对焦系统解析 参考网址:https://jingyan.baidu.com/article/22a299b5c882a29e19376aad.html 手机拍照三大对焦系统解析#资料课代表 | 讲窍门# 你最常使用的拍照工具是什么?很多人的第一直觉可能就是手机,而对于专业从事影视相关工作的人来…...
厦门做网站的公司/重庆百度竞价推广
细心的朋友会注意到,当你在linux下频繁存取文件后,物理内存会很快被用光,当程序结束后,内存不会被正常释放,而是一直作为caching.这个问题,貌似有不少人在问,不过都没有看到有什么很好解决的办法.那么我来谈谈这个问题.先来说说free命令[rootserver ~]# free -mtotal use…...
苏州快速建设网站公司/免费好用的网站
建立Empty Application,新建Storyboard并添加View Controller 控件后运行为空白,并报错 控制台显示: 2012-07-18 15:21:57.338 apress-8[664:f803] Application windows are expected to have a root view controller at the end of applicat…...
网站定制化价格/网络平台推广有哪些渠道
今天我将要为大家讲解一个不同于我们日常用的Windows系统,它就是Linux。Linux是一套免费使用和自由传播的类UNIX操作系统,它不受任何商品化版权的制约,全世界都能自由使用。它不像Windows那样通过傻瓜式操作用户很容易上手。Linux要想实现强大…...
app模板/海淀区seo全面优化
一、timeit包(上接连载9)1.我们对于timeit函数,可采取如下例子:h def doTt(num1):for i in range(num1):print(i)t6 timeit.timeit("doTt(2)",setuph,number3)print(t6)释义:setup负责把环境变量准备好,实际上相当于在…...