10.0 输入输出 I/O

news2024/9/20 14:54:57

IO操作主要是指使用Java程序完成输入(Input)、输出(Output)操作。所谓输入是指将文件内容以数据流的形式读取到内存中,输出是指通过Java程序将内存中的数据写入到文件中,输入、输出操作在实际开发中应用较为广泛。本章将针对IO的相关操作进行讲解。

1. File类

1.1. File类的构造方法

File类提供了多个构造方法用于创建File对象,具体如下表所示。

方法声明

功能描述

File(String pathname)

通过指定的一个字符串类型的文件路径来创建一个新的File对象

File(String parent,String child)

根据指定的一个字符串类型的父路径和一个字符串类型的子路径(包括文件名称)创建一个File对象

File(File parent,String child)

根据指定的File类的父路径和字符串类型的子路径(包括文件名称)创建一个File对象

下面通过一个案例演示如何使用File类的构造方法创建File对象。具体代码如下所示。

@Test
public void test1(){
    File f1 = new File("D:\\file\\hello.txt");     //使用绝对路径创建File对象
    File f2 = new File("src\\Hello.java");         //使用相对路径创建File对象
    System.out.println(f1);
    System.out.println(f2);
}

注意:案例在创建File对象时传入的路径使用了\\,这是因为Windows中的目录符号为反斜线\,但反斜线\在Java中是特殊字符,具有转义作用,所以使用反斜线\时,前面应该再添加一个反斜线,即为\\。此外,目录符号还可以用正斜线/表示,如“D:/file/hello.txt”。

1.2. File类的常用方法

File类提供了一系列方法,例如判断文件是否存在、获取文件的名称、文件的大小、文件的路径、删除文件等,用于操作File类对象内部封装的路径指向的文件或者目录。具体如下表所示。

方法声明

功能描述

boolean exists()

判断File对象对应的文件或目录是否存在,若存在则返回true,否则返回false

boolean delete()

删除File对象对应的文件或目录,若删除成功则返回true,否则返回false

boolean createNewFile()

当File对象对应的文件不存在时,该方法将新建一个文件,若创建成功则返回true,否则返回false

String getName()

返回File对象表示的文件或文件夹的名称

String getPath()

返回File对象对应的路径

String getAbsolutePath()

返回File对象对应的绝对路径(在Unix/Linux等系统上,如果路径是以正斜线/开始,则这个路径是绝对路径;在Windows等系统上,如果路径是从盘符开始,则这个路径是绝对路径)

String getParentFile()

返回File对象对应目录的父目录(即返回的目录不包含最后一级子目录)

boolean canRead()

判断File对象对应的文件或目录是否可读,若可读则返回true,反之返回false

boolean canWrite()

判断File对象对应的文件或目录是否可写,若可写则返回true,反之返回false

boolean isFile()

判断File对象对应的是否是文件(不是目录),若是文件则返回true,反之返回false

boolean isDirectory()

判断File对象对应的是否是目录(不是文件),若是目录则返回true,反之返回false

boolean isAbsolute()

判断File对象对应的文件或目录是否是绝对路径

long lastModified()

返回1970年1月1日0时0分0秒到文件最后修改时间的毫秒值

long length()

返回文件内容的长度(单位是字节)

String[] list()

递归列出指定目录的全部内容(包括子目录与文件),只是列出名称

File[] listFiles()

返回一个包含了File对象所有子文件和子目录的File数组

下面通过一个案例演示如何使用File类的常用方法。具体代码如下所示。

@Test
public void test2() {
    File file = new File("src/Hello.java");
    System.out.println("文件是否存在:" + file.exists());
    System.out.println("文件名:" + file.getName());
    System.out.println("文件大小:" + file.length() + "bytes");
    System.out.println("文件相对路径:" + file.getPath());
    System.out.println("文件绝对路径:" + file.getAbsolutePath());
    System.out.println("文件是否为文件:" + file.isFile());
    System.out.println("文件删除是否成功:" + file.delete());
}

1.3. 遍历目录下的文件

通过调用File类中的list()方法,可以遍历目录下的文件。按照调用方法的不同,目录下的文件遍历可分为以下3种方式。

  • 遍历指定目录下的所有文件。

@Test
public void test3(){
    // 创建File对象
    File file = new File("D:\\workspace-java\\case05");
    if (file.isDirectory()) {               // 判断File对象对应的目录是否存在
        String[] names = file.list ();      // 获得目录下的所有文件的文件名
        for (String name : names) {
            System.out.println(name);      // 输出文件名
        }
    }
}
  • 遍历指定目录下指定扩展名的文件。

有时程序需要获取指定类型的文件,如获取指定目录下所有的“.java”文件。针对这种需求,File类提供了一个重载的list()方法,该方法接收一个FilenameFilter类型的参数。FilenameFilter是一个接口,被称作文件过滤器,其中定义了一个抽象方法accept()用于依次对指定File的所有子目录或文件进行迭代。在调用list()方法时,需要实现文件过滤器FilenameFilter,并在accept()方法中进行筛选,从而获得指定类型的文件。

@Test
public void test4() {
    // 创建File对象
    File file = new File("D:\\workspace-java\\case05\\src\\com\\wfit\\test01");
    // 创建过滤器对象
    FilenameFilter filter = new FilenameFilter() {
        // 实现accept()方法
        public boolean accept(File dir, String name) {
            File currFile = new File(dir, name);
            // 如果文件名以.java结尾返回true,否则返回false
            if (currFile.isFile() && name.endsWith(".java")) {
                return true;
            } else {
                return false;
            }
        }
    };
    if (file.exists()) { // 判断File对象对应的目录是否存在
        String[] lists = file.list(filter); // 获得过滤后的所有文件名数组
        for (String name : lists) {
            System.out.println(name);
        }
    }
}
  • 遍历包括子目录中的文件在内的所有文件。

有时候在一个目录下,除了文件还有子目录,如果想获取所有子目录下的文件,list()方法显然不能满足要求,这时可以使用File类提供的另一个方法listFiles()。listFiles()方法返回一个File对象数组,当对数组中的元素进行遍历时,如果元素中还有子目录需要遍历,则可以使用递归再次遍历子目录。

@Test
public void test5() {
    // 创建一个代表目录的File对象
    File file = new File("D:\\workspace-java\\case05\\src\\com\\wfit");
    fileDir(file);  // 调用FileDir方法
}
public void fileDir(File dir) {
    File[] files = dir.listFiles();   // 获得表示目录下所有文件的数组
    for (File file : files) {       // 遍历所有的子目录和文件
        if (file.isDirectory()) {
            fileDir(file);     // 如果是目录,递归调用fileDir()
        }
        System.out.println(file.getAbsolutePath()); // 输出文件的绝对路径
    }
}

1.4. 删除文件及目录

在操作文件时,可能会遇到需要删除一个目录下的某个文件或者删除整个目录的情况,这时可以调用File类的delete()方法。

@Test
public void test6(){
    File file = new File("D:\\test\\testdel");
    deleteDir(file);         // 调用deleteDir删除方法
    System.out.println("删除成功!");
}
public void deleteDir(File dir) {
    if (dir.exists()) {                 // 判断传入的File对象是否存在
        File[] files = dir.listFiles();    // 得到File数组
        for (File file : files) {        // 遍历所有的子目录和文件
            if (file.isDirectory()) {
                deleteDir(file);    // 如果是目录,递归调用deleteDir()
            } else {
                file.delete();      // 如果是文件,直接删除
            }
        }
        // 删除完一个目录里的所有文件后,就删除这个目录
        dir.delete();
    }
}

2. 字节流

在程序的开发中,经常需要处理设备之间的数据传输,而计算机中,无论是文本、图片、音频还是视频,所有文件都是以二进制(字节)形式存在的。对于字节的输入输出,I/O流提供了一系列的流,统称为字节流,字节流是程序中最常用的流,根据数据的传输方向可将其分为字节输入流和字节输出流。

JDK提供了两个抽象类InputStream和OutputStream,它们是字节流的顶级父类,所有的字节输入流都继承自InputStream,所有的字节输出流都继承自OutputStream。为了方便理解,可以把InputStream和OutputStream比作两根“水管”,具体如下:

在上图中,InputStream被看成一个输入管道,OutputStream被看成一个输出管道,数据通过InputStream从源设备输入到程序,通过OutputStream从程序输出到目标设备,从而实现数据的传输。由此可见,I/O流中的输入输出都是相对于程序而言的。

2.1. InputStream类

  • InputStream类的常用方法

InputStream类提供了一系列与读数据相关的方法。具体如下表所示。

方法声明

功能描述

int read()

从输入流读取一个8位的字节,把它转换为0~255之间的整数,并返回这一整数

int read(byte[] b)

从输入流读取若干字节,把它们保存到参数b指定的字节数组中,返回的整数表示读取字节的数目

int read(byte[] b,int off,int len)

从输入流读取若干字节,把它们保存到参数b指定的字节数组中,off指定字节数组开始保存数据的起始索引,len表示读取的字节数目

void close()

关闭此输入流并释放与该流关联的所有系统资源

  • InputStream体系结构

InputStream类虽然提供了一系列和读数据有关的方法,但是InputStream类是抽象类,不能被实例化,因此针对不同的功能,InputStream类提供了不同的子类,这些子类形成了一个体系结构。如下图所示。

  • 字节流FileInputStream

InputStream就是JDK提供的基本输入流,它是所有输入流的父类,FileInputStream是InputStream的子类,它是操作文件的字节输入流,专门用于读取文件中的数据。

@Test
public void test1(){
    File file = new File("d:\\filetest\\hello.txt");
    //从文件中读取数据
    try{
        FileInputStream in = new FileInputStream(file);
        int len = in.read();
        while(len != -1){
            System.out.print((char)len);
            len = in.read();
        }
        in.close();
    }catch (Exception e){
        System.out.println(e.toString());
    }
}

2.2. OutputStream类

  • OutputStream类的常用方法

OutputStream类提供了一系列与写数据相关的方法。具体如下表所示。

方法声明

功能描述

void write(int b)

向输出流写入一个字节

void write(byte[] b)

把参数b指定的字节数组的所有字节写到输出流

void write(byte[] b,int off,int len)

将指定byte数组中从偏移量off开始的len个字节写入输出流

void flush()

刷新此输出流并强制写出所有缓冲的输出字节

void close()

关闭此输出流并释放与此流相关的所有系统资源

  • OutputStream体系结构

OutputStream类虽然提供了一系列和写数据有关的方法,但是OutputStream类是抽象类,不能被实例化,因此针对不同的功能,OutputStream类提供了不同的子类,这些子类形成了一个体系结构。如下图所示。

  • 字节流FileOutputStream

OutputStream是JDK提供的最基本的输出流,与InputStream类似,OutputStream也是抽象类,它是所有输出流的父类。OutputStream是一个抽象类,如果使用此类,则必须先通过子类实例化对象。OutputStream类有多个子类,其中FileOutputStream子类是操作文件的字节输出流,专门用于把数据写入文件。

@Test
public void test2(){
    File file = new File("d:\\filetest\\hello.txt");
    //向文件中写入数据
    FileOutputStream out = null;
    try{
        out = new FileOutputStream(file);
        String str = "hello wfit";
        out.write(str.getBytes());
        out.close();
    }catch (Exception e){
        System.out.println(e.toString());
    }
}

2.3. 文件的复制

在应用程序中,I/O流通常都是成对出现的,即输入流和输出流一起使用。例如,文件的复制就需要通过输入流读取文件中的数据,再通过输出流将数据写入文件。

编写程序,使用FileInputStream和FileOutputStream将文件helloA.txt 的内容复制到helloB.txt文件中。

@Test
public void test3(){
    File helloA = new File("d:\\filetest\\helloA.txt");
    File helloB = new File("d:\\filetest\\helloB.txt");
    try{
        FileInputStream in = new FileInputStream(helloA);
        FileOutputStream out = new FileOutputStream(helloB);
        int len = in.read();
        while(len != -1){
            out.write(len);
            len = in.read();
        }
        in.close();
        out.close();
    }catch (Exception e){
        System.out.println(e.toString());
    }
}

3. 字符流

前面讲解内容都是通过字节流直接对文件进行读写,如果读写的文件内容是字符,考虑到使用字节流读写字符可能存在传输效率以及数据编码问题,此时建议使用字符流。同字节流一样,字符流也有两个抽象的顶级父类,分别是Reader类和Writer类。其中Reader类是字符输入流,用于从某个源设备读取字符。Writer类是字符输出流,用于向某个目标设备写入字符。

3.1. Reader类

  • Reader类的常用方法

Reader类提供了一系列与读数据相关的方法。具体如下表所示。

方法声明

功能描述

int read()

以字符为单位读数据

int read(char cbuf[])

将数据读入char类型数组,并返回数据长度

int read(char cbuf[],int off,int len)

将数据读入char类型数组的指定区间,并返回数据长度

void close()

关闭数据流

long transferTo(Writer out)

将数据直接读入字符输出流

  • Reader体系结构

Reader类作为字符流的顶级父类,也有许多子类,下面通过一张继承关系图列举Reader类的常用子类。如下图所示。

  • 字符流FileReader

在程序开发中,经常需要对文本文件的内容进行读取,如果想从文件中直接读取字符便可以使用字符输入流FileReader,通过此流可以从关联的文件中读取一个或一组字符。

编写程序,使用FileReader对象从hello.txt文件中读出字符并输出。

@Test
public void test1(){
    File file = new File("d:\\filetest\\hello.txt");
    try{
        FileReader in = new FileReader(file);
        BufferedReader ins = new BufferedReader(in);
        String line;
        while ((line = ins.readLine()) != null){
            System.out.println(line);
        }
        ins.close();
        in.close();
    }catch (Exception e){
        System.out.println(e.toString());
    }
}

3.2. Writer类

  • Writer类的常用方法

Writer类提供了一系列与写数据相关的方法。具体如下表所示。

方法声明

功能描述

void write(int c)

以字符为单位写数据

void write(char cbuf[])

将char类型数组中的数据写出

void write(char cbuf[],int off,int len)

将char类型数组中指定区间的数据写出

void write(String str)

将String类型的数据写出

void wirte(String str,int off,int len)

将String类型指定区间的数据写出

void flush()

可以强制将缓冲区的数据同步到输出流中

void close()

关闭数据流

  • Writer体系结构

Writer类作为字符流的顶级父类,也有许多子类,下面通过一张继承关系图列举Writer类的常用子类。如下图所示。

  • 字符流FileWriter

在程序开发中,有时需要向文本文件写入内容,通过字符流向文本文件写入内容需要使用FileWriter类,FileWriter类可以一次向文件中写入一个或一组字符。

下面通过一个案例学习如何使用FileWriter字符流将字符写入文件。具体代码如下所示。

@Test
public void test2(){
    File file = new File("d:\\filetest\\hello.txt");
    try{
        FileWriter out = new FileWriter(file);
        String str = "hello wfit";
        out.write(str);
        out.close();
    }catch (Exception e){
        System.out.println(e.toString());
    }
}

4. 转换流

I/O流分为字节流和字符流,字节流和字符流之间可以进行转换。JDK提供了两个类用于将字节流转换为字符流,它们分别是InputStreamReader和OutputStreamWriter,也称为转换流,其作用如下所示。

(1)InputStreamReader是Reader的子类,它可以将一个字节输入流转换成字符输入流,方便直接读取字符。

(2)OutputStreamWriter是Writer的子类,它可以将一个字节输出流转换成字符输出流,方便直接写入字符。

@Test
public void test(){
    File file = new File("d:\\filetest\\hello.txt");
    try{
        // 创建一个字节输入流in
        FileInputStream in = new FileInputStream(file);
        // 将字节输入流in转换成字符输入流isr
        InputStreamReader isr = new InputStreamReader(in);
        int len = isr.read();
        while(len != -1){
            System.out.print((char)len);
            len = isr.read();
        }
        isr.close();
        in.close();
    }catch (Exception e){
        System.out.println(e.getMessage());
    }
}

5. 序列化和反序列化

程序在运行过程中,数据都保存在Java中的对象中(内存),但很多情况下我们都需要将一些数据永久保存到磁盘上。为此,Java提供了对象序列化,对象序列化可以将对象中的数据保存到磁盘。

5.1. 序列化和反序列化

对象序列化(Serializable)是指将一个Java对象转换成一个I/O流的字节序列的过程。

反序列化(Deserialize)是指将I/O流中的字节序列恢复为Java对象的过程。

5.2. Serializable接口和Externalizable接口

对象实现支持序列化机制,这个对象所属的类必须是可序列化的。在Java中可序列化的类可通过实现Serializable或Externalizable两个接口之一。

Serializable接口

Externalizable接口

系统自动存储必要的信息

由程序员决定所存储的信息

Java内部支持,易于实现,只需实现该接口即可,不需要其他代码支持

接口中只提供了两个抽象方法,实现该接口必须要实现这两个抽象方法

性能较差

性能较好

5.3. 实现序列化方法

与实现Serializable接口相比,虽然实现Externalizable接口可以带来一定性能上的提升,但由于实现Externalizable接口,需要实现两个抽象方法,所以实现Externalizable接口也将导致编程的复杂度增加。在实际开发时,大部分都采用实现Serializable接口的方式来实现对象序列化。使用Serializable接口实现对象序列化非常简单,只需要让目标类实现Serializable接口即可,无需实现任何方法。

  • Student类

public class Student implements Serializable {

    private static final long serialVersionUID = 1L;

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                '}';
    }
}
  • 测试类

public class TestDemo3 {

    @Test
    public void test1(){
        Student student = new Student();
        student.setName("张三");
        File file = new File("d:\\filetest\\hello.txt");
        //向文件中写入数据
        try{
            ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(file));
            out.writeObject(student);
            out.close();
        }catch (Exception e){
            System.out.println(e.toString());
        }
    }
    @Test
    public void test2(){
        File file = new File("d:\\filetest\\hello.txt");
        //向文件中写入数据
        try{
            ObjectInputStream in = new ObjectInputStream(new FileInputStream(file));
            Student student = (Student) in.readObject();
            System.out.println(student);
            in.close();
        }catch (Exception e){
            System.out.println(e.toString());
        }
    }
}

serialVersionUID适用于Java的对象序列化机制。简单来说,Java的对象序列化机制是通过判断类的serialVersionUID来验证版本一致性。在进行反序列化时,JVM会把字节流中的serialVersionUID与本地相应实体类的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会抛出序列化版本不一致的异常。因此,为了在反序列化时确保序列化版本的兼容性,最好在每一个要序列化的类中加入private static final long serialVersionUID的变量值,具体数值可自定义,默认是1L。

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

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

相关文章

键盘打字盲打练习系列之指法练习——2

一.欢迎来到我的酒馆 盲打,指法练习! 目录 一.欢迎来到我的酒馆二.指法练习 二.指法练习 前面一个章节简单地介绍了基准键位、字母键位和数字符号键位指法,在这个章节详细介绍指法。有了前面的章节的基础练习,相信大家对盲打也有了…

构建智能预约体验:深度解析预约系统源码的代码精髓

随着数字化时代的发展,预约系统在各行业中扮演着越来越重要的角色。本文将深入研究预约系统源码,通过代码示例分析其技术要点,为开发者提供实用的指导,助力构建智能、高效的预约体验。 技术栈综述 预约系统源码采用了现代化的技…

【JUC】十八、happens-before先行发生原则

文章目录 1、先行发生原则happens-before2、happens-before总原则3、8条happens-before规则4、案例 1、先行发生原则happens-before 在Java中,Happends-Before本质上是规定了一种可见性, A Happends-Before B,则A发生过的事情对B来说是可见的…

大模型fine-tune 微调

大模型的 Fine-tune 我们对技术的理解,要比技术本身更加重要。 正如我在《大模型时代的应用创新范式》一文中所说,大模型会成为AI时代的一项基础设施。 作为像水、电一样的基础设施,预训练大模型这样的艰巨任务,只会有少数技术…

滚珠丝杆在各种自动化设备中的作用

滚珠丝杆因其具有高精度、高刚度和长寿命等特性,成为许多设备中的重要组成部分,在许多行业中都有广泛的应用,接下来我们看看滚珠丝杆的具体应用有哪些? 1、打孔机:提供精确的导向,使打孔机的滑块能够沿固定…

数据库管理-第119期 记一次迁移和性能优化(202301130)

数据库管理-第119期 记一次迁移和性能优化(202301130) 1 迁移 之前因为DV组件没有迁移成功的那个PDB,后来想着在目标端安装DV组件迁移,结果目标端装不上,而且开了SR也没看出个所以然来。只能换一个方向,尝…

优化-查询数据接口太慢

有一个查询接口,主业务表有几万多条数据,没超过十万,由于没有使用分页,所以每次查询都要返回大几万的数据,然后问题是前端页面查询数据显示数据要转很久。 压缩响应体大小 我发现查询的时间是1秒多,但是浏…

Android中在google Map 上绘制历史路径

很多的App都会有这种需求,需要把自己的轨迹绘制在地图上来加标一段行踪,使得自己的行程展现出来,通过地图的展示,自己的行程也就一目了然了。 这里利用Google Map 把自己的行程展现出来,注意这里用到了上一章的基础&a…

关于最近Facebook的未经用户同意收集使用个人信息,

最近收到深圳市通信管理局的违法违规APP处置通知大概如下: 并且详细列举了 facebook sdk 在未经用户允许前调用的 TelephonyManager.getNetworkOperatorName(); 方法,获取运营商名称. 解决方法, 首先 在用户没有点击允许隐私条款前 不要调用任何Facebook sdk 方法,比如: Fac…

量子力学:探索微观世界的奇妙之旅

量子力学:探索微观世界的奇妙之旅 引言 在21世纪初,我们逐渐进入了一个以信息技术为主导的新时代。在这个时代,量子力学作为一门研究物质世界微观结构、粒子间相互作用以及能量与信息转换的基础科学,对我们的生活产生了深远的影响…

【Linux】:信号(一)产生

信号 一.前台进程和后台进程1.前台进程2。后台进程3.总结 二.自定义信号动作接口三.信号的产生1.键盘组合键2.kill信号进程pid3.系统调用1.kill函数2.raise函数3.abort函数 四.异常五.软件条件六.core文件 一.前台进程和后台进程 1.前台进程 一个简单的代码演示 像这种程序在…

求臻医学满分通过EMQN室间质评,检测实力再获国际权威机构认可

近日,欧洲分子基因诊断质量联盟(European Molecular Genetics Quality Network,EMQN)公布了2023年Oncogene panel 项目能力验证考核结果,求臻医学旗下北京和杭州检验实验室,使用自主研发的ChosenOne大Panel…

【目标检测】进行实时检测计数时,在摄像头窗口显示实时计数个数

这里我是用我本地训练的基于yolov8环境的竹签计数模型,在打开摄像头窗口增加了实时计数显示的代码,可以直接运行,大家可以根据此代码进行修改,其底层原理时将检测出来的目标的个数显示了出来。 该项目链接:【目标检测…

制造业如何做生产设备管理、分析生产数据?

本文将为大家讲解:1、设备管理的现状与问题;2、设备管理系统功能;3、制造业企业如何做生产设备管理、分析生产数据?4、制造业设备管理的价值。 想要管理好设备,设备档案管理、巡检、报修、保养、分析预警等问题都是必须…

探索H5的神秘世界:测试点解析

Html5 app实际上是Web app的一种,在测试过程中可以延续Web App测试的部分方法,同时兼顾手机端的一些特性即可,下面帮大家总结下Html5 app 相关测试方法! app内部H5测试点总结 1、业务逻辑 除基本功能测试外,需要关注的…

设计模式详解(三):工厂方法

目录导航 抽象工厂及其作用工厂方法的好处工厂方法的实现关系图实现步骤 工厂方法的适用场景工厂方法举例 抽象工厂及其作用 工厂方法是一种创建型设计模式。所谓创建型设计模式是说针对创建对象方面的设计模式。在面向对象的编程语言里,我们通过对象间的相互协作&…

Pytorch进阶教学——训练一个图像分类模型(GPU)

目录 1、前言 2、数据集介绍 3、获取数据 4、创建网络 5、训练模型 6、测试模型 6.1、测试整个模型准确率 6.2、测试单张图片 1、前言 编写一个可以分类蚂蚁和蜜蜂图片的模型,使用数据集对卷积神经网络进行训练。训练后的模型可以对蚂蚁或蜜蜂的图片进行…

单片机学习12——电容

电容的作用: 1)降压作用: 容抗: Xc 1/2fc 串联分压原理。2100Ω的容量,50Hz的频率,可以得到1.5uF。断电之后,需要串联一个1MΩ的电阻放电。 那是不是可以使用2100欧姆的电阻来代替电容呢&am…

单宁对葡萄酒可饮用性和陈酿潜力会有影响吗?

当在酿酒过程中葡萄酒中的单宁过量时,酿酒师可以使用白蛋白、酪蛋白和明胶等各种细化剂,这些药物可以与单宁分子结合,并将其作为沉淀物沉淀出来。随着葡萄酒的老化,单宁将形成长长的聚合链,氧气可以与单宁分子结合&…

安全技术与防火墙

目录 安全技术 防火墙 按保护范围划分: 按实现方式划分: 按网络协议划分. 数据包 四表五链 规则链 默认包括5种规则链 规则表 默认包括4个规则表 四表 查询 格式: 规则 面试题 NFS常见故障解决方法 安全技术 入侵检测系统 (Intrusion Detection Sy…