IO(JavaEE初阶系列8)

news2024/11/18 11:40:49

目录

前言:

1.文件

1.1认识文件

1.2结构和目录

1.3文件路径

1.4文本文件vs二进制文件

2.文件系统的操作

2.1Java中操作文件

2.2File概述

2.2.1构造File对象

2.2.2File中的一些方法

3.文件内容的操作

3.1字节流

3.1.1InPutStream的使用方法

3.1.2OutPutStream的使用方法

3.2字符流

3.2.1Reader的使用方法

3.2.2Writer的使用方法

4.文件操作的案例

结束语:


前言:

在之前的博客中小编主要是与大家分享了多线程中的一些东西,在这节中小编就与大家分享一下IO方面一些知识吧!

1.文件

1.1认识文件

我们先来认识一下狭义上的文件,针对硬盘这种持久化存储的I/O设备,当我们想要进行数据保存时,往往不是保存成一个整体,而是独立成一个个的单位进行保存,这个独立的单位就被抽象成文件的概念,就类似办公桌上的一份份真实的文件一般。那么我们平时谈到的“文件”,指的都是硬盘上的文件。

硬盘(外存)与内存相比:

  • 速度:内存比硬盘快很多。
  • 空间:内存空间比硬盘小。
  • 成本:内存比硬盘贵。
  • 持久化:内存掉电后数据丢失,外存掉电后数据还在。

像我们之前学习的java代码都是围绕着内存展开的,我们的JavaSE + 数据结构里面,定义一个变量,其实就是在内存上申请空间的。MYSQL主要就是操作硬盘。文件这里的IO也就是操作硬盘了,这里我们会学习文件的系统操作文件的内容操作。在文件的系统操作里我们主要学习的是创建文件、删除文件、重命名文件、创建目录....。在文件的内容操作中我们主要学习的就是针对文件内容进行读和写的操作。 下面我们会给大家一一展开介绍的。

1.2结构和目录

计算机的目录是有层级结构的,在计算机中我们是把文件夹叫做目录。如下所示就是计算机中的一个层级目录展示,这里的目录太多了小编没有全部展示出来,大家只要明白就可以了。

 通过上图我们可以看到文件系统是以树型结构来组织文件和目录的。他是一个N叉树。

1.3文件路径

文件路径:就是从树根结点出发,沿着树杈一路往下走,到达目标文件,此时这中间经过的内容就是文件的路径。

在Windows中都是从“此电脑”起头的,表示路径的时候,可以把“此电脑”省略,直接从盘符开始表示。如下所示就是一个文件的路径。

我们实际路径的表示是通过字符串表示的,每个目录之间使用 /(反斜杠)或者是 \(斜杠)来分隔。 如下所示:

D:\Java学习代码记录\JavaGitee代码提交\java-ee-elementary

上述的反斜杠只是在Windows中适用,代码中写需要写成\\,是需要转义字符的。

在上述的路径中我们可以看到我们都是从盘符开始往下寻找的文件路径,那么这种路径就叫绝对路径。如果是从给定的目录出发,一层一层往下找,这个过程得到的路径就叫相对路径。这里我们提到的给定的目录是基准目录也叫工作目录。那么工作目录又是啥,那么下来我们来具体看一下案例。

假设我们现在的工作目录是下面这个。 

此时我们要找到的是

那么此时我们的相对路径表示就是:./JavaGitee代码提交/java-ee-elementary/JavaEE-2023.8.2

假设我们现在的工作目录是下面的这个:

 那么此时我们要找的是这个:

 那么此时我们的相对路径表示就是:./java-ee-elementary/JavaEE-2023.8.2/src/Main.java

在上述的相对路径表示法中我们看到 · 它是一个特殊符号,表示的是当前目录,还有一种是 ·· 也是一种特殊符号,表示的是目录的上级目录。

注意:

在文件系统上,任何一个文件对应的路径是唯一的,不会存在两个路径相同,但是文件不同的情况!!!在Linux中可能会存在一个文件有两个不同路径可以找到它,但是在Windows中可以认为路径和文件是一一对应的关系,路径就相当于是一个“文件”的身份标识。

1.4文本文件vs二进制文件

文本文件存储的是文本,文本都是由ASCII字符构成的,对于ASCII来说它的表示范围是0-127,由于不够表示我们所有的字符,后来就又搞了其他编码方式,例如utf-8之类的,就可以针对其他语言文字符号进行编码了。

二进制文件存储的是二进制数据,它是没有任何字符集的限制,存啥都行。

那么我们又该怎么判断存储的文本还是二进制呢?

一个简单的判定方式就是直接按照记事本的方式打开文件,如果可以看懂就说明是文本存储,如果看不懂就说明是二进制存储。如下例子所示:

下面的这种就是二进制文本:

下面这种能看懂的就是文本文件:

 

2.文件系统的操作

2.1Java中操作文件

在Java中通过java.io.File类来对一个文件(包括目录)进行抽象的描述。在Java标准库中给我们提供了一个类叫File类,File对象是硬盘上的一个文件的“抽象”表示。

这里的文件是存储在硬盘上的如果直接通过代码来操作硬盘,不太方便,就在内存中创建一个对应的对象,操作这个内存中对象,就可以间接的影响到硬盘的文件情况了。这就相当于是电视机和遥控器一样,这里的File就是遥控器可以操作硬盘。下面我们来具体看一下吧。

2.2File概述

2.2.1构造File对象

在我们构造的过程中可以使用绝对路径也可以使用相对路径进行初始化,这个路径指向的文件,可以是真实存在的,也可以是不存在的,下面我们用代码来具体给大家来演示一下。

 

2.2.2File中的一些方法

在File中给我们提供了很多方法,如下所示:

修饰符及返回值类型方法签名说明
StringgetParent()返回File对象的父目录文件路径
StringgetName()返回File对象的纯文件名称
StringgetPath()返回File对象的文件路径
StringgetAbsolutePath()返回File对象的绝对路径
Stringexists()判断File对象描述的文件是否真实存在
booleanisDirctory()判断File对象代表的文件是否是一个目录
booleanisFile()判断File对象代表的文件是否是一个普通文件
booleancreateNewFile()根据File对象,自动创建一个空文件,成功创建后返回true
booleandelete()根据File对象,删除该文件,成功删除后返回true
voiddeleteOnExit()根据File对象,标注文件将被删除,删除动作会到JVM运行结束时才会进行
String[]list()返回File对象代表的目录下的所有文件名
File[]listFiles()返回File对象代表的目录下的所有文件,以File对象表示
booleanmkdir()创建File对象代表的目录
booleanmkdirs()创建File对象代表的目录,如果必要,会创建中间目录
booleanrenameTo(Filedest)进行文件改名,也可视为我们平时的剪切、粘贴操作
booleancanRead()判断用户是否对文件有可读权限
booleancanWrite()判断用户是否对文件有可写权限

下面就给大家来演示一下个别操作:
代码展示:

package io;

import java.io.File;
import java.io.IOException;

public class IODemo1 {
    public static void main(String[] args) throws IOException {
        //就可以通过File对象进行操作了
        File file = new File("./cat.jpg");
        //返回File对象的父目录文件路径
        System.out.println(file.getParent());
        //返回File对象的纯文件名称
        System.out.println(file.getName());
        //返回File对象的文件路径
        System.out.println(file.getPath());
        //返回File对象的绝对路径
        System.out.println(file.getAbsolutePath());
        //返回File对象的修饰过的绝对路径
        System.out.println(file.getCanonicalPath());
    }
}

结果展示:

 

由于idea的工作目录就是项目所在目录,所以当我们在新创建的时候就会在该项目的目录下。如下所示,在执行完代码之后我们就可看到在项目中多了一个“hello_world.txt”。

代码展示:

package io;

import java.io.File;
import java.io.IOException;

public class IODemo2 {
    public static void main(String[] args) throws IOException {
        //在相对路径中,./通常可以省略
        File file = new File("./hello_world.txt");
        System.out.println("创建文件之前:");
        //判断File文件是否存在
        System.out.println(file.exists());
        //判断File对象代表的文件是否是一个目录
        System.out.println(file.isDirectory());
        //判断File对象代表的文件是是否是一个普通文件
        System.out.println(file.isFile());

        System.out.println("创建文件之后:");
        //创建文件
        file.createNewFile();
        //判断File文件是否存在
        System.out.println(file.exists());
        //判断File对象代表的文件是否是一个目录
        System.out.println(file.isDirectory());
        //判断File对象代表的文件是是否是一个普通文件
        System.out.println(file.isFile());

    }
}

结果展示:

 

如果我们要删除目录呢?我们就可以使用delete操作来进行删除,如下所示。

代码展示:

package io;

import java.io.File;
import java.io.IOException;

public class IODemo2 {
    public static void main(String[] args) throws IOException {
        //在相对路径中,./通常可以省略
        File file = new File("./hello_world.txt");
        System.out.println("创建文件之前:");
        //判断File文件是否存在
        System.out.println(file.exists());
        //判断File对象代表的文件是否是一个目录
        System.out.println(file.isDirectory());
        //判断File对象代表的文件是是否是一个普通文件
        System.out.println(file.isFile());

        System.out.println("创建文件之后:");
        //创建文件
        file.createNewFile();
        //判断File文件是否存在
        System.out.println(file.exists());
        //判断File对象代表的文件是否是一个目录
        System.out.println(file.isDirectory());
        //判断File对象代表的文件是是否是一个普通文件
        System.out.println(file.isFile());

        //删除文件
        file.delete();
        System.out.println("删除文件之后:");
        System.out.println(file.exists());
    }
}


结果展示:

 

 

 

我们可以看到在工作目录中就不存在该文件了。 

我们还可以通过File来创建目录。

代码展示:

package io;

import java.io.File;

public class IODemo3 {
    public static void main(String[] args) {
        File file = new File("test-dir/aaa/bbb");
        //只创建一级目录
//        file.mkdir();
        //创建多级目录
        file.mkdirs();
    }
}


结果展示:

也可以使用File里的方法来返回目录下的文件名。

代码展示:

package io;

import java.io.File;
import java.util.Arrays;

public class IODemo4 {
    public static void main(String[] args) {
        File file = new File("test-dir");
        //返回File对象代表的目录下的所有文件名
        String[] results = file.list();
        System.out.println(Arrays.toString(results));
        //返回File对象代表的目录下的所有文件,以File对象表示
        File[] results2 = file.listFiles();
        System.out.println(Arrays.toString(results2));
    }
}


结果展示:

还可以个对象重命名。

代码展示:

package io;

import java.io.File;

public class IODemo5 {
    public static void main(String[] args) {
        //重命名
        File src = new File("./test-dir");
        File dest = new File("./test222");
        src.renameTo(dest);
    }
}

结果展示:

3.文件内容的操作

针对文本文件,提供了一组类,统称为“字符流”(典型的代表是:Reader,Writer),它基本的读写单位是字符

针对二进制文件,提供了一组类,统称为“字节流”(典型代表:InputSteam,OutputStream),它基本的读写单位是字节

针对于上述“流”这个概念在英文中写作“Steam”,如果让你从文件中读取100个字节的数据,你的读法就会有很多种,可能一次读取一个字节,分100次读完,也可能会读取2个字节分50次读完,就这样像水流一样不断地读取数据。

针对于流对象,又分成两种:

  • 输入的:Reader,InputSteam
  • 输出的:Writer,OutPutSteam

这里就需要我们分清楚从哪里是输入,从哪里到哪里又是输出。下面我们可以画图来理解一下。

 

下面我们就来分别给大家讲解一下字符流和字节流中的几个重要的用法。 

3.1字节流

3.1.1InPutStream的使用方法

InputStream是用来IO操作的,IO不仅仅是读写硬盘的文件,它还可以用来读写别的,这个后面在学习网络编程的时候会给大家交代。

在后面的括号中我们要指定一个要读的文件的路径。

这里可能就有同学好奇了,为什么在实例化的时候不是直接new 一个 InputStream呢?这里给大家解释一下,我们可以看到在InputStream的原码中是一个抽象类,抽象类是不能够实例化的。所以就出现了上述代码new了一个FileInputStream的情况。 

 

这里我们在D盘中先新建一个文件命名为test.txt,并在里面编写一些文字。

 

下面我们就来使用一下InputStream。

这里的意思就是让这个变量能够和硬盘上的文件关联起来,此时就相当于有了遥控器。

但是此时读取完毕之后一定要记得关闭资源。

注意:这个关闭操作非常重要,这个操作如果忘记的话,可能就会导致文件资源泄漏。

所以为了保证一定可以执行到关闭操作,我们可以借助finally来做。如下所示:

package io;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class IODemo7 {
    public static void main(String[] args) throws IOException {
        InputStream inputStream = null;
        try {
            inputStream = new FileInputStream("d:/Java学习代码记录/JavaGitee代码提交/java-ee-elementary/test.txt");
        } finally {
            inputStream.close();
        }
    }
}

虽然这样也可以实现,并且可以保证一定可以执行到关闭操作的代码,但是我们并不提倡这样写,因为代码风格不太好,那么我们可以使用下面的这个操作来写。写好创建实例代码之后,然后按住Ctrl+Alt+T,然后选中下面的带有资源的try操作即可。在try结束之后就会自动执行close操作,这样就可以保证代码会执行close操作了。

下面我们就可以读取test.txt文件里面的内容了。

代码展示:

package io;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

public class IODemo8 {
    public static void main(String[] args) throws IOException {
        try (InputStream inputStream = new FileInputStream("d:/Java学习代码记录/JavaGitee代码提交/java-ee-elementary/test.txt")) {
            //读文件
            //read一次返回的是一个字节,但是此处的返回类型是int
            while (true) {
                int b = inputStream.read();
                if (b == -1) {
                    //读到末尾了,结束循环即可
                    break;
                }
                System.out.printf("%x\n",b);
            }
        }

    }
}

结果展示:

 

3.1.2OutPutStream的使用方法

代码展示:

package io;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class IODemo9 {
    public static void main(String[] args) throws IOException {
        try (OutputStream outputStream = new FileOutputStream("d:/Java学习代码记录/JavaGitee代码提交/java-ee-elementary/test.txt")) {
            outputStream.write(97);
            outputStream.write(98);
            outputStream.write(99);
        }
    }
}

结果展示:

3.2字符流

3.2.1Reader的使用方法

我们和上述的操作是一样的,首先先创建对象然后打开指定的路径。然后再进行读文件的操作,最后在关闭文件,这里的同样使用的是资源的try操作来进行关闭资源。这里我们从test.txt文件读取数据。

代码展示:

package io;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

public class IODemo10 {
    public static void main(String[] args) throws FileNotFoundException {
        try (Reader reader = new FileReader("d:/Java学习代码记录/JavaGitee代码提交/java-ee-elementary/test.txt")) {
            while (true) {
                int c = reader.read();
                if (c == -1) {
                    break;
                }
                char ch = (char)c;
                System.out.println(ch);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


结果展示: 

 

3.2.2Writer的使用方法

与上述几个的使用方式都是一样的,这里小编就直接给大家来展示一下代码的实现吧。

代码展示:

package io;

import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

public class IODemo11 {
    public static void main(String[] args) throws IOException {
        try (Writer writer = new FileWriter("d:/Java学习代码记录/JavaGitee代码提交/java-ee-elementary/test.txt")) {
            writer.write(65);
            writer.write(66);
            writer.write(67);
        }
    }
}

结果展示:

 

4.文件操作的案例

案例1:扫描指定目录,并找到名称或者内容中包含指定字符的所有普通文件(不包含目录)。

这个就相当于是遍历目录,在里面的文件内容中查找。类似于检索操作。

这里我们直接写一个简单粗暴的办法:

  1. 先去递归的遍历目录,比如给定一个d:/去递归的把这里包含的所有文件都列出来。
  2. 每次找到一个文件,都打开,并读取文件内容(得到String)。
  3. 在判断要查找的词,是否在上述文件内容中存在,如果存在,结果即为所求。

代码展示:

package io;

import java.io.*;
import java.util.Scanner;

public class IODemo12 {
    public static void main(String[] args) throws FileNotFoundException {
        Scanner scanner = new Scanner(System.in);
        //1.先让用户指定一个要搜索的根目录
        System.out.println("请输入要扫描的根目录:");
        File rootDir = new File(scanner.next());
        if (!rootDir.isDirectory()){
            System.out.println("输入有误,您输入的目录不存在!");
            return;
        }
        //2.让用户输入一个要查找的词
        System.out.println("请输入要查找的词:");
        String word = scanner.next();

        //3.递归的进行目录/文件的遍历
        scanDir(rootDir,word);
    }

    private static void scanDir(File rootDir, String word) throws FileNotFoundException {
        //列出当前的rootDir中的内容,没有内容,直接递归结束
        File[] files = rootDir.listFiles();
        if (files == null) {
            //当前rootDir是一个空目录,这里啥都没有
            //没必要在进行递归了
            return;
        }
        //目录里有内容,就遍历目录中的每个元素
        for (File f : files) {
            System.out.println("当前搜索到的结果是:" + f.getAbsolutePath());
            if (f.isFile()) {
                //是普通文件
                //打开文件,读取内容,比较看是否包含上述的关键字
                String content = readFile(f);
                if (content.contains(word)){
                    System.out.println(f.getAbsolutePath() + "包含要查找的关键字!");
                }
            } else if (f.isDirectory()) {
                //是目录
                //进行递归操作
                scanDir(f,word);
            }else {
                //不是普通文件,也不是目录文件,直接跳过
                continue;
            }
        }
    }

    private static String readFile(File f) throws FileNotFoundException {
        //读取文件的整个内容,返回出来
        //使用字符流来读取,由于咱们匹配的是字符串,此处只能按照字符流处理,才是有意义的
        StringBuilder stringBuilder = new StringBuilder();
        try (Reader reader = new FileReader(f)) {
            //一次读取一个字符,把读到的结果给拼装到stringBuilder中,同一转换成String
            while (true) {
                int c = reader.read();
                if (c == -1){
                    break;
                }
                stringBuilder.append((char) c);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return stringBuilder.toString();
    }
}


结果展示:

结束语:

这节中小编主要是与大家介绍了文件中的IO操作,希望这节对大家了解文件的IO操作有一定帮助,想要学习的同学记得关注小编和小编一起学习吧!如果文章中有任何错误也欢迎各位大佬及时为小编指点迷津(在此小编先谢过各位大佬啦!)

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

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

相关文章

【java】【面对对象高级7】阶段实战 医院挂号系统

目录 1 要求 2 创建项目与模块 2.1 创建项目 2.2 创建模块 2.3 创建包 3 新增实体类 3.1 看诊排班信息Schedule类 3.2 医生Doctor类 3.3 科室Department类 3.4 预约信息Appointment类 4 新增实现HospitalManager类 4.1 新增欢迎信息 4.2 添加科室addDepartment方…

Vue3实现6位验证码输入框,用户可以连续输入和删除

实现代码 可以随意填写删除 <template><div class"verification-container"><inputv-for"(code, index) in verificationCodes":key"index"v-model"verificationCodes[index]"input"handleInput(index, $event…

Linux系统控制文件和目录权限

0.前言 并非操作系统的每个用户都应具有相同级别的文件和目录访问权限&#xff0c;与任何专业操作系统一样&#xff0c;Linux具有保护文件和目录访问的方法。系统允许系统管理员(root用户或文件所属用户)通过赋予用户读取&#xff0c;写入或执行文件的权限来保护其文件免受不必…

生成对抗网络DCGAN学习

在AI内容生成领域&#xff0c;有三种常见的AI模型技术&#xff1a;GAN、VAE、Diffusion。其中&#xff0c;Diffusion是较新的技术&#xff0c;相关资料较为稀缺。VAE通常更多用于压缩任务&#xff0c;而GAN由于其问世较早&#xff0c;相关的开源项目和科普文章也更加全面&#…

如何在 Ubuntu 上部署 ONLYOFFICE 协作空间社区版?

ONLYOFFICE 协作空间是一个在线协作平台&#xff0c;帮助您更好地与客户、业务合作伙伴、承包商及第三方进行文档协作。今天我们来介绍一下&#xff0c;如何在 Ubuntu 上安装协作空间的自托管版。 ONLYOFFICE 协作空间主要功能 使用 ONLYOFFICE 协作空间&#xff0c;您可以&am…

Golang 函数参数的传递方式 值传递,引用传递

基本介绍 我们在讲解函数注意事项和使用细节时&#xff0c;已经讲过值类型和引用类型了&#xff0c;这里我们再系统总结一下&#xff0c;因为这是重难点&#xff0c;值类型参数默认就是值传递&#xff0c;而引用类型参数默认就是引用传递。 两种传递方式&#xff08;函数默认都…

MySQL数据库备份

目录 一、概述 二、数据备份的重要性 三、造成数据丢失的原因 四、备份类型 五、常见的备份方法 六、备份 一、概述 数据库备份是指将数据库中的数据、表格、视图、存储过程、触发器等信息备份到另一个地方&#xff0c;以便在数据库丢失或损坏时进行恢复。数据库备份是数…

以CS32F031为例浅说国产32位MCU的内核处理器

芯片内核又称CPU内核&#xff0c;它是CPU中间的核心芯片&#xff0c;是CPU最重要的组成部分。由单晶硅制成&#xff0c;CPU所有的计算、接受/存储命令、处理数据都由核心执行。各种CPU核心都具有固定的逻辑结构&#xff0c;一级缓存、二级缓存、执行单元、指令级单元和总线接口…

【C++】string类

目录 &#x1f31e;专栏导读 &#x1f31b;为什么学习string类&#xff1f; ⭐C语言中的字符串 &#x1f31b;标准库中的string类 ⭐基本使用string ⭐string类的常用接口 ⭐总结&#xff1a; &#x1f31b;范围for的使用 &#x1f31e;专栏导读 &#x1f31f;作者简介…

docker更换数据存储路径

1. 先停掉docker服务 sudo systemctl stop docker 可能会出现的问题&#xff1a; 这样会导致docker关闭失败,解决办法&#xff1a;systemctl stop docker.socket 确保docker关闭: 2.备份现在的 Docker 数据存储目录 /var/lib/docker(默认路径) mv /var/lib/docker /var/lib/…

高斯函数的傅里叶变换与离散化频谱分析

1 高斯函数的傅里叶变换 主要参考自 http://www.cse.yorku.ca/~kosta/CompVis_Notes/fourier_transform_Gaussian.pdf 对于中心化的高斯函数&#xff0c;即 g ( x ) 1 2 π σ e − x 2 2 σ 2 , (1.1) g\left( x \right) \frac{1}{{\sqrt {2\pi } \sigma }}{e^{ - \frac{{{x…

【有趣的】关于Map的一些小测试

Map在代码中用到得非常多&#xff0c;它是无序的、key-value结构的&#xff0c;其读取会非常快。 今天看了个小文章Map判空 、空字符串、空key值等各种判断方法&#xff0c;你都掌握了吗&#xff1f;便自己也玩一下。 一、判空 因为对象已经new出来了&#xff0c;所以map指向的…

【洁洁送书第三期】人性的光辉,python之光

这里写目录标题 python学习现状python之光亮点python学习配套视频python之光目录强力推荐 python学习现状 作为生产力工具&#xff0c;Python是当今极为流行的编程语言。Python编程逐渐成为一项通用能力&#xff0c;从小学生到各个行业的从业人员都在学Python。Python确实能够…

高忆管理:多重利好共振 外资加码布局A股

资本商场活泼信号正在继续开释&#xff0c;内外资决心取得有力提振。以北向资金为代表的外资近来表现活泼&#xff0c;近六个买卖日已连续净买入超500亿元。多家外资组织近期表态称&#xff0c;伴跟着方针力度加强&#xff0c;我国经济有望继续复苏&#xff0c;活泼看好我国权益…

优思学院|质量工程师应具备什么能力?

质量工程师是一个需要耐心、细心、坚持态度、沟通能力、协调能力的工作&#xff0c;更需要持续学习强化自身的专业知识。 质量工程师负责审核、客户投诉的调查、过程的改进以达到质量之提升&#xff0c;他們也必须要预警生产线风险、质量异常&#xff0c;并且协调不同的部門一…

【雕爷学编程】Arduino动手做(181)---Maixduino AI开发板2

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

[语义分割] ASPP不同版本对比(DeepLab、DeepLab v1、DeepLab v2、DeepLab v3、DeepLab v3+、LR-ASPP)

1. 引言 1.1 本文目的 本文主要对前段时间学习的 ASPP 模块进行对比&#xff0c;涉及到的 ASPP 有&#xff1a; ASPP in DeepLab v2&#xff0c;简称 ASPP v2ASPP in DeepLab v3&#xff0c;简称 ASPP v3ASPP in DeepLab v3&#xff0c;简称 ASPP v3ASPP in MobileNet v3&am…

开发提测?

前言 开发提测是正式开始测试的重要关卡&#xff0c;提测质量的好坏会直接影响测试阶段的效率&#xff0c;进而影响项目进度。较好的提测质量&#xff0c;对提高测试效率和优化项目进度有着事半功倍的作用。如何更好的推进开发提高提测质量呢&#xff1f;下面小编结合自己项目…

攻防世界-web-lottery

题目描述&#xff1a;里面有个附件&#xff0c;是网站的源代码&#xff0c;还有一个链接&#xff0c;是线上的网站 主页告诉了我们规则&#xff1a; 1. 每个人的初始金额为20美元 2. 一支彩票2美元&#xff0c;挑选7个数字&#xff0c;根据匹配上的数字有不同的奖励 我们先体…

基于dynamorio自制反汇编小工具 instr_trace安装

目录 概述一、下载源码二、安装dynamorio1、安装依赖2、编译3、测试安装是否成功参考截图 三、安装instr_trace工具1、文件说明2、编译3、运行 四、生成的文件格式说明&#xff08;1&#xff09;mov指令&#xff08;寄存器->寄存器&#xff09;&#xff08;2&#xff09;mov…