26--字符流与字节流

1、IO流概述

1.1 什么是IO流

Java中I/O操作主要是指使用java.io包下的内容,进行输入、输出操作。输入也叫做读取数据,输出也叫做作写出数据。我们把这种数据的传输,可以看做是一种数据的流动,按照流动的方向,以内存为基准,分为输入input 和输出output ,即流向内存是输入流,流出内存的输出流。

1.2 Java IO原理

Java程序中,对于数据的输入/输出操作以“流(stream)” 的方式进行,可以看做是一种数据的流动。

I/O流中的I/O是Input/Output的缩写, I/O技术是非常实用的技术,用于处理设备之间的数据传输。如读/写文件,网络通讯等。

输入input:读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中。

输出output:将程序(内存)数据输出到磁盘、光盘等存储设备中。

1.3 IO的分类

java.io包下提供了各种“流”类和接口,用以获取不同种类的数据,并通过标准的方法输入或输出数据。

按数据的流向不同分为:输入流输出流

  • 输入流 :把数据从其他设备上读取到内存中的流。 以InputStream、Reader结尾
  • 输出流 :把数据从内存 中写出到其他设备上的流。以OutputStream、Writer结尾

按操作数据单位的不同分为:字节流(8bit)字符流(16bit)

  • 字节流 :以字节为单位,读写数据的流。以InputStream、OutputStream结尾
  • 字符流 :以字符为单位,读写数据的流。以Reader、Writer结尾

根据IO流的角色不同分为:节点流处理流

  • 节点流:直接从数据源或目的地读写数据

  • 处理流:不直接连接到数据源或目的地,而是“连接”在已存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更为强大的读写功能。

小结:图解

1.4 流的API

Java的IO流共涉及40多个类,实际上非常规则,都是从如下4个抽象基类派生的。

(抽象基类)

输入流

输出流

字节流

InputStream

OutputStream

字符流

Reader

Writer

由这四个类派生出来的子类名称都是以其父类名作为子类名后缀。

常用的节点流:

文件流: FileInputStream、FileOutputStrean、FileReader、FileWriter

字节/字符数组流: ByteArrayInputStream、ByteArrayOutputStream、CharArrayReader、CharArrayWriter

        对数组进行处理的节点流(对应的不再是文件,而是内存中的一个数组)。

常用处理流:

缓冲流:BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter

        作用:增加缓冲功能,避免频繁读写硬盘,进而提升读写效率。

转换流:InputStreamReader、OutputStreamReader

        作用:实现字节流和字符流之间的转换。

对象流:ObjectInputStream、ObjectOutputStream

        作用:提供直接读写Java对象功能

2、字符流 FileReader\FileWriter

2.1 Reader与Writer

Java提供一些字符流类,以字符为单位读写数据,专门用于处理文本文件。不能操作图片,视频等非文本文件。

常见的文本文件有如下的格式:.txt、.java、.c、.cpp、.py等

注意:.doc、.xls、.ppt这些都不是文本文件。

2.1.1 字符输入流:Reader

java.io.Reader抽象类是表示用于读取字符流的所有类的父类,可以读取字符信息到内存中。它定义了字符输入流的基本共性功能方法。

  • public int read(): 从输入流读取一个字符。 虽然读取了一个字符,但是会自动提升为int类型。返回该字符的Unicode编码值。如果已经到达流末尾了,则返回-1。
  • public int read(char[] cbuf): 从输入流中读取一些字符,并将它们存储到字符数组 cbuf中 。每次最多读取cbuf.length个字符。返回实际读取的字符个数。如果已经到达流末尾,没有数据可读,则返回-1。
  • public int read(char[] cbuf,int off,int len):从输入流中读取一些字符,并将它们存储到字符数组 cbuf中,从cbuf[off]开始的位置存储。每次最多读取len个字符。返回实际读取的字符个数。如果已经到达流末尾,没有数据可读,则返回-1。
  • public void close() :关闭此流并释放与此流相关联的任何系统资源。

注意:当完成流的操作时,必须调用close()方法,释放系统资源,否则会造成内存泄漏。

2.1.2 字符输出流:Writer

java.io.Writer抽象类是表示用于写出字符流的所有类的超类,将指定的字符信息写出到目的地。它定义了字节输出流的基本共性功能方法。

  • public void write(int c) :写出单个字符。
  • public void write(char[] cbuf):写出字符数组。
  • public void write(char[] cbuf, int off, int len):写出字符数组的某一部分。off:数组的开始索引;len:写出的字符个数。
  • public void write(String str):写出字符串。
  • public void write(String str, int off, int len) :写出字符串的某一部分。off:字符串的开始索引;len:写出的字符个数。
  • public void flush():刷新该流的缓冲。
  • public void close() :关闭此流。

注意:当完成流的操作时,必须调用close()方法,释放系统资源,否则会造成内存泄漏。

2.2 FileReader 与 FileWriter

2.2.1 FileReader

java.io.FileReader类用于读取字符文件,构造时使用系统默认的字符编码和默认字节缓冲区。

  • FileReader(File file): 创建一个新的 FileReader ,给定要读取的File对象。
  • FileReader(String fileName): 创建一个新的 FileReader ,给定要读取的文件的名称。

举例:读取hello.txt文件中的字符数据,并显示在控制台上

package com.suyv.test01;

import org.junit.Test;

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

/**
*@Author: 憨憨浩浩
*@CreateTime: 2023-12-19 20:13
*@Description: 读取hello.txt文件中的字符数据,并显示在控制台上
*/
public class FileReader01 {

    //1. 创建File类的对象,对应着物理磁盘上的某个文件
    //2. 创建FileReader流对象,将File类的对象作为参数传递到FileReader的构造器中
    //3. 通过相关流的方法,读取文件中的数据
    //4. 关闭相关的流资源,避免出现内存泄漏


    @Test
    public void Test01() throws IOException {
        //1. 创建File类的对象,对应着物理磁盘上的某个文件
        File file = new File("file\\hello.txt");
        //2. 创建FileReader流对象,将File类的对象作为参数传递到FileReader的构造器中
        FileReader fr = new FileReader(file);
        //3. 通过相关流的方法,读取文件中的数据
        // int data = fr.read(); //每调用一次读取一个字符
        // while (data != -1) {
        //     System.out.print((char) data);
        //     data = fr.read();
        // }
        int data;
        while ((data = fr.read()) != -1) {
            System.out.print((char) data);
        }
        //4. 关闭相关的流资源,避免出现内存泄漏
        fr.close();
    }

    /*
     * 需求:读取hello.txt中的内容,显示在控制台上。
     * 使用try-catch-finally的方式处理异常。确保流一定可以关闭,避免内存泄漏
     * */
    @Test
    public void Test02() {
        FileReader fr = null;
        try {
            //1.创建File类的对象,对应着hello.txt文件
            File file = new File("file\\hello.txt");

            //2.创建输入型的字符流,用于读取数据
            fr = new FileReader(file);

            //3.读取数据,并显示在控制台上
            int data;
            while ((data = fr.read()) != -1) {
                System.out.print((char) data);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //4. 流资源的关闭操作(必须要关闭,否则会内存泄漏)
            try {
                if (fr != null)
                    fr.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    @Test
    public void test3() throws IOException {
        //1.创建File类的对象,对应着hello.txt文件
        File file = new File("file\\hello.txt");
        //2.创建输入型的字符流,用于读取数据
        FileReader fr = new FileReader(file);

        //3.读取数据,并显示在控制台上
        char[] cbuffer = new char[5];
        int len;
        while ((len = fr.read(cbuffer)) != -1) {
            //遍历数组
            for (int i = 0; i < len; i++) {
                System.out.print(cbuffer[i]);
            }
        }
        //4. 流资源的关闭操作(必须要关闭,否则会内存泄漏)
        fr.close();
    }


}

2.2.2 FileWriter

java.io.FileWriter类用于写出字符到文件,构造时使用系统默认的字符编码和默认字节缓冲区。

  • FileWriter(File file): 创建一个新的 FileWriter,给定要读取的File对象。
  • FileWriter(String fileName): 创建一个新的 FileWriter,给定要读取的文件的名称。
  • FileWriter(File file,boolean append): 创建一个新的 FileWriter,指明是否在现有文件末尾追加内容。

举例:将内存中的数据写出到指定的文件中

package com.suyv.test01;

import org.junit.Test;

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

/**
 * @Author: 憨憨浩浩
 * @CreateTime: 2023-12-20 13:54
 * @Description: FileWriter的使用--需求:将内存中的数据写出到指定的文件中
 */
public class FileWriter01 {

    //1. 创建File类的对象,对应着物理磁盘上的某个文件
    //2. 创建FileWriter流对象,将File类的对象作为参数传递到FileWriter的构造器中
    //3. 通过相关流的方法,读取文件中的数据
    //4. 关闭相关的流资源,避免出现内存泄漏

    @Test
    public void Test01() throws IOException {

        //1. 创建File类的对象,对应着物理磁盘上的某个文件
        File file = new File("file\\info.txt");

        //2. 创建FileWriter流对象,将File类的对象作为参数传递到FileWriter的构造器中
        FileWriter fw = new FileWriter(file);
        //3. 通过相关流的方法,读取文件中的数据
        fw.write("HelloWorld\n");
        fw.write("中国");
        System.out.println("写入成功");
        //4. 关闭相关的流资源,避免出现内存泄漏
        fw.close();

    }

}

2.2.3 复制文件

package com.suyv.test01;

import org.junit.Test;

import java.io.*;

/**
 * @Author: 憨憨浩浩
 * @CreateTime: 2023-12-20 14:23
 * @Description: 复制一份hello.txt文件,命名为hello_copy.txt
 */
public class FileReaderWriter {
    
    @Test
    public void Test01() throws IOException {
        //1. 创建File类的对象,对应着物理磁盘上的某个文件
        File file1 = new File("file\\hello.txt");
        File file2 = new File("file\\hello_copy.txt");

        //2. 创建FileWriter流和FileReader流对象,将File类的对象作为参数传递到FileWriter的构造器中
        FileReader fr = new FileReader(file1);
        FileWriter fw = new FileWriter(file2);

        //3. 通过相关流的方法,读取文件中的数据
        int len;        // 记录每次读入到cbuffer中的字符的个数
        char[] cbuffer = new char[5];
        while ((len = fr.read(cbuffer)) != -1){
            fw.write(cbuffer,0,len);
        }

        //4. 关闭相关的流资源,避免出现内存泄漏
        fw.close();
        fr.close();

    }
}

2.2.4 小结

① 因为出现流资源的调用,为了避免内存泄漏,需要使用try-catch-finally处理异常

② 对于输入流来说,File类的对象必须在物理磁盘上存在,否则执行就会报FileNotFoundException。如果传入的是一个目录,则会报IOException异常。

对于输出流来说,File类的对象是可以不存在的。

如果File类的对象不存在,则可以在输出的过程中,自动创建File类的对象

如果File类的对象存在,

        如果调用FileWriter(File file)或FileWriter(File file,false),输出时会新建File文件覆盖已有的文件

        如果调用FileWriter(File file,true)构造器,则在现有的文件末尾追加写出内容。

2.3 关于flush(刷新)

因为内置缓冲区的原因,如果FileWriter不关闭输出流,无法写出字符到文件中。但是关闭的流对象,是无法继续写出数据的。如果我们既想写出数据,又想继续使用流,就需要flush() 方法了。

  • flush() :刷新缓冲区,流对象可以继续使用。
  • close():先刷新缓冲区,然后通知系统释放资源。流对象不可以再被使用了。

注意:即便是flush()方法写出了数据,操作的最后还是要调用close方法,释放系统资源。

举例:

package com.suyv.test01;

import org.junit.Test;

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

/**
 * @Author: 憨憨浩浩
 * @CreateTime: 2023-12-20 14:36
 * @Description: flush的使用
 */
public class FileReaderFlush {

    @Test
    public void Test01() throws IOException {
        // 使用文件名称创建流对象
        FileWriter fw = new FileWriter("file\\fw.txt");
        // 写出数据,通过flush
        fw.write('刷'); // 写出第1个字符
        fw.flush();
        fw.write('新'); // 继续写出第2个字符,写出成功
        fw.flush();

        // 写出数据,通过close
        fw.write('关'); // 写出第1个字符
        fw.close();
        fw.write('闭'); // 继续写出第2个字符,【报错】java.io.IOException: Stream closed
        fw.close();
    }
}

3、字节流 FileInputStream\FileOutputStream

如果我们读取或写出的数据是非文本文件,则Reader、Writer就无能为力了,必须使用字节流。

3.1 InputStream和OutputStream

3.1.1 字节输入流:InputStream

java.io.InputStream抽象类是表示字节输入流的所有类的超类,可以读取字节信息到内存中。它定义了字节输入流的基本共性功能方法。

  • public int read(): 从输入流读取一个字节。返回读取的字节值。虽然读取了一个字节,但是会自动提升为int类型。如果已经到达流末尾,没有数据可读,则返回-1。
  • public int read(byte[] b): 从输入流中读取一些字节数,并将它们存储到字节数组 b中 。每次最多读取b.length个字节。返回实际读取的字节个数。如果已经到达流末尾,没有数据可读,则返回-1。
  • public int read(byte[] b,int off,int len):从输入流中读取一些字节数,并将它们存储到字节数组 b中,从b[off]开始存储,每次最多读取len个字节 。返回实际读取的字节个数。如果已经到达流末尾,没有数据可读,则返回-1。
  • public void close() :关闭此输入流并释放与此流相关联的任何系统资源。

说明:close()方法,当完成流的操作时,必须调用此方法,释放系统资源。

3.1.2 字节输出流:OutputStream

java.io.OutputStream抽象类是表示字节输出流的所有类的超类,将指定的字节信息写出到目的地。它定义了字节输出流的基本共性功能方法。

  • public void write(int b) :将指定的字节输出流。虽然参数为int类型四个字节,但是只会保留一个字节的信息写出。
  • public void write(byte[] b):将 b.length字节从指定的字节数组写入此输出流。
  • public void write(byte[] b, int off, int len) :从指定的字节数组写入 len字节,从偏移量 off开始输出到此输出流。
  • public void flush() :刷新此输出流并强制任何缓冲的输出字节被写出。
  • public void close() :关闭此输出流并释放与此流相关联的任何系统资源。

说明:close()方法,当完成流的操作时,必须调用此方法,释放系统资源。

3.2 FileInputStream 与 FileOutputStream

3.2.1 FileInputStream

java.io.FileInputStream类是文件输入流,从文件中读取字节。

  • FileInputStream(File file): 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的 File对象 file命名。
  • FileInputStream(String name): 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名 name命名。

读取操作:

package com.suyv.test02;

import org.junit.Test;

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

/**
 * @Author: 憨憨浩浩
 * @CreateTime: 2023-12-20 15:51
 * @Description: FileInputStream--字节输入流的使用
 */
public class FileInputStream01 {

    // 单个接收--无汉字
    @Test
    public void Test01() throws IOException {
        //1. 创建File类的对象,对应着物理磁盘上的某个文件
        File file = new File("file\\hello.txt");

        //2. 创建FileInputStream流对象
        FileInputStream fis = new FileInputStream(file);

        //3. 通过相关流的方法,读取文件中的数据
        int i;
        while ((i = fis.read()) != -1){
            System.out.print((char) i);     // helloworld111
        }

        //4. 关闭相关的流资源,避免出现内存泄漏
        fis.close();
    }

    // 单个接收--有汉字utf8
    @Test
    public void Test02() throws IOException {
        //1. 创建File类的对象,对应着物理磁盘上的某个文件
        File file = new File("file\\hello1.txt");

        //2. 创建FileInputStream流对象
        FileInputStream fis = new FileInputStream(file);

        //3. 通过相关流的方法,读取文件中的数据
        int i;
        while ((i = fis.read()) != -1){
            // 出现乱码,汉字在gbk中占2个字节,在utf8中占三个字节
            System.out.print((char) i);     // helloworld111中å½
        }

        //4. 关闭相关的流资源,避免出现内存泄漏
        fis.close();
    }

    // 使用byte数组接收
    @Test
    public void Test03() throws IOException {
        // 1.   2. 创建fileInputStream对象
        FileInputStream fis = new FileInputStream("file\\hello.txt");

        // 3. 读取数据
        byte[] buffer = new byte[5];
        int len;
        while ((len = fis.read(buffer)) != -1){
            String str = new String(buffer,0,len);
            System.out.print(str + "\t");       // hello	world	111

            // 错误写法
            // String str = new String(buffer);
            // System.out.print(str + "\t");       // hello	world	111ld
        }

        // 4. 关闭资源
        fis.close();
    }

    // skip(long n) 跳过几个字节
    @Test
    public void Test04() throws IOException {
        // 1.   2. 创建fileInputStream对象
        FileInputStream fis = new FileInputStream("file\\hello.txt");

        // 3. 读取数据
        fis.skip(4);
        System.out.println((char) fis.read());      // o

        // 4. 关闭资源
        fis.close();
    }
}

3.2.2 FileOutputStream

java.io.FileOutputStream类是文件输出流,用于将数据写出到文件。

  • public FileOutputStream(File file):创建文件输出流,写出由指定的 File对象表示的文件。
  • public FileOutputStream(String name): 创建文件输出流,指定的名称为写出文件。
  • public FileOutputStream(File file, boolean append): 创建文件输出流,指明是否在现有文件末尾追加内容。

举例:

package com.suyv.test02;

import org.junit.Test;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;

/**
 * @Author: 憨憨浩浩
 * @CreateTime: 2023-12-20 16:14
 * @Description: FileOutputStream
 */
public class FileOutputStream01 {

    @Test
    public void Test01() throws IOException {
        // 1.   2. 创建FileOutputStream流对象
        FileOutputStream fos = new FileOutputStream("file\\fos.txt");

        // 3. 执行操作
        fos.write(97);
        fos.write(98);
        fos.write(99);
        System.out.println("写入成功");
        /*当前fos.txt内容为:abc*/

        // 4. 关闭资源
        fos.close();
    }

    @Test
    public void Test02() throws IOException {
        // 1.   2. 创建FileOutputStream流对象
        // 默认为不追加
        FileOutputStream fos = new FileOutputStream("file\\fos.txt");

        // 3. 执行操作
        // 字符串转换为字节数组
        byte[] b = "abcde".getBytes();
        // 写出从索引2开始,2个字节。索引2是c,两个字节,也就是cd。
        fos.write(b,2,2);
        /*当前fos.txt内容为:cd*/

        // 4. 关闭资源
        fos.close();
    }

    @Test
    public void Test03() throws IOException {
        // 1.   2. 创建FileOutputStream流对象
        // 添加第二个参数为true时,为文件追加内容
        FileOutputStream fos = new FileOutputStream("file\\fos.txt",true);

        // 3. 执行操作
        // 字符串转换为字节数组
        byte[] b = "abcde".getBytes();
        fos.write(b);
        /*当前fos.txt内容为:cdabcde*/

        // 4. 关闭资源
        fos.close();
    }


    // 接收控制台输入的内容
    @Test
    public void Test04() throws IOException {
        Scanner scan = new Scanner(System.in);

        // 创建流对象
        FileOutputStream fos = new FileOutputStream("file\\content.txt");

        // 操作流
        String str = scan.nextLine();
        fos.write(str.getBytes());

        /*文件内容为:中国*/

        // 关闭资源
        fos.close();
    }


    // 接收控制台输入的内容
    @Test
    public void Test05() throws IOException {
        Scanner scan = new Scanner(System.in);

        // 创建流对象
        FileOutputStream fos = new FileOutputStream("file\\content.txt");

        while (true) {
            // 操作流
            String str = scan.nextLine();

            // 循环退出条件
            if (str.equals("-1")){
                break;
            }

            fos.write(str.getBytes());
            fos.write('\n');
        }

        // 关闭资源
        fos.close();
    }
}

3.3 练习

3.3.1 复制图片

package com.suyv.test02;

import org.junit.Test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;


/**
 * @Author: 憨憨浩浩
 * @CreateTime: 2023-12-20 14:45
 * @Description: 复制图片
 */
public class FileInputOutputStream {

    //1. 创建File类的对象,对应着物理磁盘上的某个文件
    //2. 创建FileReader流对象,将File类的对象作为参数传递到FileReader的构造器中
    //3. 通过相关流的方法,读取文件中的数据
    //4. 关闭相关的流资源,避免出现内存泄漏

    // 复制一份03.png文件,命名为03_copy.png
    @Test
    public void Test01() throws IOException {
        //1. 创建File类的对象,对应着物理磁盘上的某个文件
        File file1 = new File("file\\03.png");
        File file2 = new File("file\\03_copy.png");

        //2. 创建FileInputStream和FileOutputStream流对象
        FileInputStream fis = new FileInputStream(file1);
        FileOutputStream fos = new FileOutputStream(file2);

        //3. 通过相关流的方法,读取文件中的数据
        byte[] buffer = new byte[1024]; //1kb
        int len;//记录每次读入到buffer中字节的个数
        while ((len = fis.read(buffer)) != -1) {
            fos.write(buffer, 0, len);
        }
        System.out.println("复制成功");

        //4. 关闭相关的流资源,避免出现内存泄漏
        fos.close();
        fis.close();

    }

}

3.3.2 实现图片加密操作

package com.suyv.test02;

import org.junit.Test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * @Author: 憨憨浩浩
 * @CreateTime: 2023-12-20 16:50
 * @Description: 图片的加密与加密
 */
public class FileInputOutputStream02 {

    // 图片的加密操作
    @Test
    public void Test01() throws IOException {

        //1. 创建File类的对象
        File file1 = new File("file\\girl.jpeg");
        File file2 = new File("file\\girl_secret.jpeg");

        //2. 创建FileInputStream流对象和FileOutputStream流对象
        FileInputStream fis = new FileInputStream(file1);
        FileOutputStream fos = new FileOutputStream(file2);

        //3. 通过相关流的方法,读取文件中的数据
        byte[] buffer = new byte[1024];
        int len;
        while ((len = fis.read(buffer)) != -1){
            for (int i = 0; i < len; i++) {
                buffer[i] = (byte) (buffer[i] ^ 5);
            }
            fos.write(buffer,0, len);
        }
        System.out.println("加密成功");

        //4. 关闭相关的流资源,避免出现内存泄漏
        fos.close();
        fis.close();

    }


    // 图片的解密操作
    @Test
    public void Test02() throws IOException {
        //1. 创建File类的对象
        File file1 = new File("file\\girl_secret.jpeg");
        File file2 = new File("file\\girl_unsecret.jpeg");

        //2. 创建FileInputStream流对象和FileOutputStream流对象
        FileInputStream fis = new FileInputStream(file1);
        FileOutputStream fos = new FileOutputStream(file2);

        //3. 通过相关流的方法,读取文件中的数据
        byte[] buffer = new byte[1024];
        int len;
        while ((len = fis.read(buffer)) != -1){
            for (int i = 0; i < len; i++) {
                buffer[i] = (byte) (buffer[i] ^ 5);
            }
            fos.write(buffer,0, len);
        }
        System.out.println("解密成功");

        //4. 关闭相关的流资源,避免出现内存泄漏
        fos.close();
        fis.close();
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

3DES加解密

public static void main(String[] args) throws Exception {String content "";String plainText "";String key "";//加密byte[] encryptedBytes encrypt(plainText, key);String encryptedText Base64.getEncoder().encodeToString(encr…

21 Vue3中使用v-for遍历对象数组

概述 使用v-for遍历对象数组在真实的开发中也属于非常常见的用法&#xff0c;需要重点掌握。 因为目前流行的是前后端分离开发&#xff0c;在前后端分离开发中&#xff0c;最常需要处理的就是对象数组类型的数据了。 比如&#xff0c;将员工信息渲染到表格中。 这节课我们就…

python调取一欧易API并写一个比特币均线交易策略

比特币均线交易策略是一种基于比特币价格的移动均线的交易策略。它通过计算不同时间段的移动均线来确定买入和卖出点。 具体步骤如下&#xff1a; 确定要使用的均线。常用的均线包括5日、10日、20日、50日和200日均线。较短的均线可以更快地反应价格变动&#xff0c;而较长的均…

[CVPR 2023:3D Gaussian Splatting:实时的神经场渲染]

文章目录 前言小结 原文地址&#xff1a;https://blog.csdn.net/qq_45752541/article/details/132854115 前言 mesh 和点是最常见的3D场景表示&#xff0c;因为它们是显式的&#xff0c;非常适合于快速的基于GPU/CUDA的栅格化。相比之下&#xff0c;最近的神经辐射场&#xf…

Java日志框架Logback

logback.xml文件配置(放在src下微服务建议放在resources下) <?xml version"1.0" encoding"UTF-8"?> <configuration><!--定义日志文件的存储地址,使用绝对路径--><property name"LOG_HOME" value"d:/logs"/>…

【已解决】taos时序数据库3.0版本,怎么按照时间分组?

taos数据库中按照时间分组&#xff0c;在2.4版本时候可以直接使用INTERVAL(time_unit)来查询。例如 前面可以直接添加_ts的。但是在3.0版本之后&#xff0c;如果直接使用的话&#xff0c;只会返回count&#xff1a; 没有前面的时间。那么在3.0版本时候&#xff0c;怎么修改呢&a…

Spring Boot学习随笔- 拦截器实现和配置(HandlerInterceptor、addInterceptors)、jar包部署和war包部署

学习视频&#xff1a;【编程不良人】2021年SpringBoot最新最全教程 第十三章、拦截器 拦截器 &#xff1a;Interceptor 拦截 中断 类似于javaweb中的Filter&#xff0c;不过没有Filter那么强大 作用 Spring MVC的拦截器是一种用于在请求处理过程中进行预处理和后处理的机制。拦…

Mybatis-Plus——03,CRUD改

CRUD改 一、CRUD——改update————————如觉不错&#xff0c;随手点赞&#xff0c;关注&#xff0c;收藏(*&#xffe3;︶&#xffe3;)&#xff0c;谢谢~~ 一、CRUD——改update Test//测试更新public void updateTest(){User user new User();user.setId(3L);//怎么改…

基于Vue的汽车服务商城系统设计与实现论文

摘 要 本课题是根据用户的需要以及网络的优势建立的一个基于Vue的汽车服务商城系统&#xff0c;来更好的为用户提供服务。 本基于Vue的汽车服务商城系统应用Java技术&#xff0c;MYSQL数据库存储数据&#xff0c;基于SSMVue框架开发。在网站的整个开发过程中&#xff0c;首先对…

10分钟学会logback错误日志推送企业微信

引言 项目部署到服务器上之后&#xff0c;有错误日志和异常无法及时响应和查看。 本文目的是把logback的error级别日志通过群聊机器人推送到企业微信上。 ps&#xff1a;本文教程默认你的项目已经整合了logback日志框架 知识点引入 Appender: logback 将写入日志事件的任务…

​TrustZone之可信固件

Trusted Firmware是Armv8-A设备的安全世界软件的开源参考实现。Trusted Firmware为SoC开发人员和OEM提供了一个符合相关Arm规格&#xff08;包括TBBR和SMCC&#xff09;的参考Trusted代码库。 以下图表显示了Trusted Firmware的结构&#xff1a; SMC调度程序处理传入的SMC。SMC…

深入了解海外代理IP——代理IP类型区别详解,以及如何获取?

代理充当您的设备和您访问的网站之间的中介&#xff0c;掩盖您的 IP 地址并保护您的身份。但是&#xff0c;并非所有代理都是相同的&#xff0c;接触过的小伙伴都知道&#xff0c;代理IP有很多种类型&#xff0c;每种类型都有针对特定目的的特点&#xff0c;因此在选择之前&…

华为交换机,配置OSPF与BFD联动示例

OSPF简介 定义 开放式最短路径优先OSPF&#xff08;Open Shortest Path First&#xff09;是IETF组织开发的一个基于链路状态的内部网关协议&#xff08;Interior Gateway Protocol&#xff09;。 OSPF把自治系统AS&#xff08;Autonomous System&#xff09;划分成逻辑意义上…

FPGA模块——以太网芯片MDIO读写

FPGA模块——以太网MDIO读写 MDIO接口介绍MDIO接口代码&#xff08;1&#xff09;MDIO接口驱动代码&#xff08;2&#xff09;使用MDIO驱动的代码 MDIO接口介绍 MDIO是串行管理接口。MAC 和 PHY 芯片有一个配置接口&#xff0c;即 MDIO 接口&#xff0c;可以配置 PHY 芯片的工…

原生微信小程序中使用-阿里字体图标-详解

步骤一 1、打开阿里巴巴矢量图标库 网址&#xff1a;iconfont-阿里巴巴矢量图标库 2、搜索字体图标&#xff0c;鼠标悬浮点击添加入库 3、按如下步骤添加到自己的项目 步骤二 进入微信开发者工具 1、创建 fonts文件夹 > iconfont.wxss 文件&#xff0c;将刚才的代码复制…

Spring Boot学习随笔- 文件上传和下载(在线打开、附件下载、MultipartFile)

学习视频&#xff1a;【编程不良人】2021年SpringBoot最新最全教程 第十二章、文件上传、下载 文件上传 文件上传是指将文件从客户端计算机传输到服务器的过程。 上传思路 前端的上传页面&#xff1a;提交方式必须为post&#xff0c;enctype属性必须为multipart/form-data开发…

【STL容器】详解list的使用和模拟实现

&#x1f34e; 博客主页&#xff1a;&#x1f319;披星戴月的贾维斯 &#x1f34e; 欢迎关注&#xff1a;&#x1f44d;点赞&#x1f343;收藏&#x1f525;留言 &#x1f347;系列专栏&#xff1a;&#x1f319; STL函数专栏 &#x1f319;请不要相信胜利就像山坡上的蒲公英一…

Axure--中继器(增删改查)

&#x1f4da;&#x1f4da; &#x1f3c5;我是bing人&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《Axure》。&#x1f3af;&#x1f3af; &#x1f680;无论你是编程小白&#xff0c;还是有一…

龙迅LT86102UXE HDMI一分二HDMI,支持音频剥离,支持4K60HZ

描述&#xff1a; 龙迅 LT86102UXE HDMI2.0 分路器具有符合 HDMI2.0/1.4 规范的 1&#xff1a;2 分路器、最大 6Gbps 高速数据速率、自适应均衡 RX 输入和预加重 TX 输出&#xff08;用于支持长电缆应用&#xff09;、内部 TX 通道交换以实现灵活的 PCB 布线。 LT86102UXE HDM…

Python importlib模块详细教程

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com importlib模块是Python标准库中用于动态导入模块的工具。它提供了一系列函数&#xff0c;允许以编程方式加载、检查和操作模块。本文将深入探讨importlib的各种用法&#xff0c;并通过丰富的示例代码帮助你更好地…