java基础-chapter15(io流)

io流:存储和读取数据的解决方案

I:input         O:output

io流的作用:用于读写数据(本地文件,网络)

io流按照流向可以分为:

输出流:程序->文件

输入流:文件->程序

io流按照操作文件的类型可分类为:

字节流:可以操作所有类型的文件

字符流:只能操作纯文本文件(能用电脑自带记事本打开并且能读懂的文件)

File:表示系统中的文件或者文件夹的路径

获取文件信息(大小,文件名,修改时间) 判断文件的类型

创建文件/文件夹         删除文件/文件夹

注意:File类只能对文件本身进行操作,不能读写文件里面存储的数据

字节流

FileOutputStream

操作本地文件的字节输出流,可以把程序中的数据写在本地文件中

步骤:

1.创建字节输出流对象

2.写数据

3.释放资源

FileOutputStream原理

通过创建对象 传入路径 使程序和文件产生数据传输通道

 FileOutputStream fos = new FileOutputStream("D:\\ideaProject\\study\\AdvancedJava3\\src\\itemIO\\a.txt");

通过调用write方法写入数据 

fos.write(97);

调用close方法释放资源(断开程序和文件之间的连接)

 fos.close();

FileOutputStream书写细节

创建字节输出流对象 

细节1:参数可以是字符串表示的路径或者是File对象

细节2:如果文件不存在,会创建一个新的文件,但是要保证父级路径是存在的

细节3:如果文件已经存在,则会清空文件

写出数据

细节:write方法的参数是整数,但是实际上写到本地文件中的是整数在ASCII上对应的字符

释放资源

每次使用完流之后都要释放资源

FileOutputStream写数据的3种方式

一次写一个字节数组数据

public class ByteStreamDemo2 {
    public static void main(String[] args) throws IOException {
        FileOutputStream fos = new FileOutputStream("D:\\ideaProject\\study\\AdvancedJava3\\src\\itemIO\\a.txt");
        //一次写一个字节数组数据
        byte[] bytes = {97,98,99,100,101,102};
        //调用write方法将数组写入文件
        fos.write(bytes);
        //释放资源
        fos.close();
    }
}

一次写一个字节数组的部分数据

public class ByteStreamDemo3 {
    public static void main(String[] args) throws IOException {
        FileOutputStream fos = new FileOutputStream("D:\\ideaProject\\study\\AdvancedJava3\\src\\itemIO\\a.txt");
        /*
        void write(byte[] b,int off,int len)
        参数一:数组  参数二:起始索引  参数三:个数
         一次写一个字节数组的部分数据
         */
        byte[] bytes = {97,98,99,100,101,102};
        //调用write方法将数组写入文件
        fos.write(bytes,2,2); //cd
        //释放资源
        fos.close();
    }
}

FileOutputStream写数据的两个小问题

换行写

public class ByteStreamDemo4 {
    public static void main(String[] args) throws IOException {
        /*
        换行写
        写出一个换行符
        Windows: \r\n
        Linux:   \n
        Mac:     \r
         */
        FileOutputStream fos = new FileOutputStream("D:\\ideaProject\\study\\AdvancedJava3\\src\\itemIO\\a.txt");
        //写出数据 huluyazhenshuai
        String str = "huluyazhenshuai";
        //调用getBytes方法把字符串变成字节数组
        byte[] bytes = str.getBytes();
//        System.out.println(Arrays.toString(bytes));
        /*
        变成字节数组
        [104, 117, 108, 117, 121, 97, 122, 104, 101, 110, 115, 104, 117, 97, 105]
         */
        //调用write方法写入数据
        fos.write(bytes);

        String str2= "\r\n"; //写出换行符
        fos.write(str2.getBytes());

        String str3 = "666";
        fos.write(str3.getBytes());

        /*
        文件中的数据:
        huluyazhenshuai
        666
         */

        //释放资源
        fos.close();
    }
}

续写

如果想要续写,打开续写开关即可

开关位置:创建对象的第二个参数

默认false:表示续写,此时创建对象就可以清空文件

手动传递true;表示打开续写,此时创建对象不会清空文件

 FileOutputStream fos = new FileOutputStream("D:\\ideaProject\\study\\AdvancedJava3\\src\\itemIO\\a.txt",true);

FileOutputStream小结

作用:可以把程序中的数据写到本地文件中,是字节流的基本流

书写步骤:创建对象        写出数据        释放资源

三步操作的细节:

创建对象: 文件存在(清空文件)  文件不存在(创建文件)  追加写入(true)

写出数据:写出整数  写出字节数组  换行写

释放资源:关闭通道

字节输入流的基本用法

FileInputStream

操作本地文件的字节输入流,可以把本地文件中的数据读取到程序中来

书写步骤

1.创建对象

2.读数据

3.释放资源

FileInputStream书写细节

1.创建对象

细节1:如果文件不存在,就直接报错

2.读数据

细节1:一次读一个字节,读出来的是数据在ASCII上对应的数字

细节2:读到文件末尾,read方法返回-1

3.释放资源

FileInputStream循环读取

public class FileInputStreamDemo2 {
    public static void main(String[] args) throws IOException {
        //字节输入流循环读取
        FileInputStream fis = new FileInputStream("D:\\ideaProject\\study\\AdvancedJava3\\src\\itemIO\\a.txt");
        //循环读取
        int b;
        while ((b = fis.read()) != -1) { //read:表示读取数据 并且读取一次数据就会移动一次指针
            System.out.println((char) b);
        }
        //释放资源
        fis.close();
    }
}

文件拷贝

public class FileInputStreamDemo3 {
    public static void main(String[] args) throws IOException {
        /*
        练习:
        文件拷贝
         */
        //创建对象
        FileInputStream fis = new FileInputStream("D:\\ideaProject\\study\\AdvancedJava3\\src\\itemIO\\a.txt");
        FileOutputStream fos = new FileOutputStream("D:\\ideaProject\\study\\AdvancedJava3\\src\\itemIO\\copy.txt");

        //拷贝  边读边写
        int b;
        while ((b = fis.read()) != -1){ 
            fos.write(b);
        }

        //释放资源
        fos.close();
        fis.close();
    }
}

FileInputStream读取的问题

一次读写一个字节

public class FileInputStreamDemo4 {
    public static void main(String[] args) throws IOException {
        //一次读一个字节数组数据
        //创建对象
        FileInputStream fis = new FileInputStream("D:\\ideaProject\\study\\AdvancedJava3\\src\\itemIO\\a.txt");
        //创建数组
        //表示一次读两个数据
        byte [] bytes = new byte[2];
        //返回值len:表示本次读取到了多少个字节数据
        int len1 = fis.read(bytes);
        System.out.println(len1); //2
        String str1 = new String(bytes,0,len1);
        System.out.println(str1);

        int len2 = fis.read(bytes);
        System.out.println(len2); //2
        String str2 = new String(bytes,0,len2);
        System.out.println(str2);

        int len3 = fis.read(bytes);
        System.out.println(len3); //1
        String str3 = new String(bytes,0,len3);
        System.out.println(str3);
        fis.close();

    }
}

GBK和Unicode

  1. GBK:在GBK字符集中,每个中文字符占据两个字节。

  2. Unicode:Unicode字符集中,在UTF-8字符集中,中文字符通常占用3个字节的空间。UTF-8是一种可变长度的编码方案,用于表示Unicode字符集中的字符。对于常见的汉字,UTF-8编码通常占用3个字节,但对于罕见的汉字,也可能会占用更多的字节。

public class CharSetDemo1 {
    public static void main(String[] args) throws UnsupportedEncodingException {
        /*
        java中编码的方法
        public byte[] getBytes() 默认方式进行编码
        public byte[] getBytes(String charsetName) 指定方式进行编码

        java中解码的方法
        String (byte[] bytes) 默认方式进行解码
        String (byte[] bytes,String charsetName) 指定方式进行解码
         */

        //1.编码
        String str1 = "ai你哟";
        byte[] bytes1 = str1.getBytes();
        System.out.println(Arrays.toString(bytes1)); //[97, 105, -28, -67, -96, -27, -109, -97]

        byte[] bytes2 = str1.getBytes("GBK");
        System.out.println(Arrays.toString(bytes2)); //[97, 105, -60, -29, -45, -76]

        //解码
        String str2 = new String(bytes1);
        System.out.println(str2); //ai你哟

        String str3 = new String(bytes1,"GBK");
        System.out.println(str3); //ai浣犲摕

    }
}

字符流

FileReader

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

/**
 * @author hyk~
 */
public class FileReaderDemo1 {
    public static void main(String[] args) throws IOException {
        //创建对象并关联本地文件
        FileReader fr = new FileReader("D:\\ideaProject\\study\\AdvancedJava3\\src\\itemIO\\a.txt");
        //读取数据read()
        //字符流的底层也是字节流,默认也是一个字节一个字节的读取
        //但是遇到中文会一次读多个字节 GBK读2个 utf-8读3个
        int ch;
        while((ch = fr.read()) != -1){
            System.out.print((char) ch);
            /*
            read () 细节:
            1.read():默认也是一个字节一个字节的读取的,如果遇到中文就会一次读取多个
            2.在读取之后,方法的底层还会进行解码并转成十进制。
            最终把这个十进制作为返回值 这个十进制的数据也表示在字符集上的数字
            英文: 文件里面二进制数据 0110 0001
            read方法进行读取,解码并转成十进制97
            中文: 文件里面的二进制数据 11100110 10110001 1001001
            read方法进行读取,解码并转成十进制27721
            如果想看到中文汉字,就把这些十进制数据,再进行强转就可以了 (char) ch
             */
        }

        //释放资源
        fr.close();
    }
}

FileWriter

1.创建字符输出流对象

细节1:参数是字符串表示的路径或者File对象都是可以的

细节2:如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的

细节3:如果文件已存在,则会清空文件,如果不想清空可以打开续写开

2.写数据

细节:如果write方法的参数是整数,但是实际上写到本地文件中的是整数在字符集上对应的字符

3.释放资源

细节:每次使用完流后都要释放资源

public class FileReaderDemo3 {
    public static void main(String[] args) throws IOException {
        FileWriter fw = new FileWriter("D:\\ideaProject\\study\\AdvancedJava3\\src\\itemIO\\a.txt");
        fw.write("大家好,我是学生");
        fw.close();
    }
}

字节流和字符流使用场景

字节流

拷贝任意类型的文件

package itemIO;

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

/**
 * @author hyk~
 */
public class Test1 {
    public static void main(String[] args) throws IOException {
        //拷贝一个文件夹,考虑子文件夹

        //创建对象表示数据源
        File src = new File("D:\\ideaProject\\src");
        //创建对象表示目的地
        File dest = new File("D:\\ideaProject\\src10086");

        //调用方法开始拷贝
        copyDir(src,dest);
    }

    /*
    作用:拷贝文件夹
    参数一:数据源
    参数二:目的地
    */
    private static void copyDir(File src, File dest) throws IOException {
        dest.mkdirs();
        //递归
        //进入数据源
        File[] files = src.listFiles();
        //遍历数组
        for (File file : files) {
            //判断文件,拷贝
            if (file.isFile()) {
                FileInputStream fis = new FileInputStream(file);//要拷贝的文件
                FileOutputStream fos = new FileOutputStream(new File(dest,file.getName()));//文件目的地
                byte[] bytes = new byte[1024];
                int len;
                while ((len = fis.read(bytes)) != -1) {
                    fos.write(bytes, 0, len);
                    //bytes数组中从0索引开始,一共len个元素拷贝
                }
                fos.close();
                fis.close();
            }else {
                //判断文件夹,递归
                copyDir(file,new File(dest,file.getName())); //要拷贝的文件夹,目的地
            }
        }
    }
}

文件加密

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

/**
 * @author hyk~
 */
public class Test2 {
    /*
    为了保证文件的安全性,就需要对原始文件进行加密存储再使用的时候再对其进行解密处理
    加密原理:
    对原始文件中的每一个字节数据进行更改,然后将更改以后的数据存储到新的文件中
    解密原理:
    读取加密之后的文件,按照加密的规则反向操作,变成原始文件
     */
    public static void main(String[] args) throws IOException {
        //创建对象关联原始文件
        FileInputStream fis = new FileInputStream("D:\\ideaProject\\study\\AdvancedJava3\\src\\itemIO\\1.png");
        //创建对象关联加密文件
        FileOutputStream fos = new FileOutputStream("D:\\ideaProject\\study\\AdvancedJava3\\src\\itemIO\\ency.png");
        //加密处理
        int b;
        while((b = fis.read()) != -1){
            fos.write(b ^ 10);
        }
        fos.close();
        fis.close();
    }
}

解密操作:

修改文件中的数据

package itemIO;

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;

/**
 * @author hyk~
 */
public class Test3 {
    /*
    文本文件中有以下的数据:
    2-1-9-4-7-8
    将文件中的数据进行排序,变成以下的数据:
    1-2-4-7-8-9
     */
    public static void main(String[] args) throws IOException {
        //读取数据
        FileReader fr = new FileReader("D:\\ideaProject\\study\\AdvancedJava3\\src\\itemIO\\a.txt");
        StringBuilder sb = new StringBuilder();
        int ch;
        while((ch = fr.read()) != -1){
            sb.append((char) ch);
        }
        fr.close();

        //排序
        String str = sb.toString();
        String [] arr = str.split("-");
        ArrayList list = new ArrayList();
        for (String s : arr) {
            int i = Integer.parseInt(s);
            list.add(i);
        }
        Collections.sort(list);
        //写出
        FileWriter fw = new FileWriter("D:\\ideaProject\\study\\AdvancedJava3\\src\\itemIO\\a.txt");
        for (int i = 0; i < list.size(); i++){
            if (i == list.size() -1){
                fw.write(list.get(i) + "");
            }else {
                fw.write(list.get(i)+"-");
            }
        }
        fw.close();

    }
}

字节缓冲流

import java.io.*;

/**
 * @author hyk~
 */
public class BufferedStreamDemo2 {
    public static void main(String[] args) throws IOException {
        /*
        需求:
            利用字节缓冲流拷贝文件

            字节缓冲输入流的构造方法:
                public BufferedInputStream(Inputstream is)
            字节缓冲输出流的构造方法:
                public BufferedOutputstream(Outputstream os)
         */

        //创建缓冲流的对象
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\ideaProject\\study\\AdvancedJava3\\src\\itemIO\\a.txt"));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\ideaProject\\study\\AdvancedJava3\\src\\itemIO\\copy.txt"));

        //拷贝 一次读写多个字节
        byte[] bytes = new byte[1024];
        int len;
        while ((len = bis.read(bytes))!= -1){
            bos.write(bytes,0,len);
        }
        bos.close();
        bis.close();
    }
}

字符缓冲流

public class BufferedStreamDemo3 {
    public static void main(String[] args) throws IOException {
        /*
        字符缓冲输入流:
        构造方法:
        public BufferedReader(Reader r)
        特有方法:
        public String readLine()读一整行
         */

        //创建字符缓冲流的对象
        BufferedReader br = new BufferedReader(new FileReader("D:\\ideaProject\\study\\AdvancedJava3\\src\\itemIO\\a.txt"));
        //读取数据
        String line;
        while (((line = br.readLine()) != null)){
            System.out.println(line);
        }

        //释放资源
        br.close();

    }
}

字符流

读取纯文本文件中的数据

往纯文本文件中写出数据

转换流

转换流主要有两种类型:InputStreamReader OutputStreamWriter

它们的作用是在字节流和字符流之间建立桥梁,使得字节流能够以字符流的形式被读取,或者字符流能够以字节流的形式被写入。

创建转换流:

1. 创建 InputStreamReader
FileInputStream fis = new FileInputStream("input.txt"); // 创建字节输入流
InputStreamReader isr = new InputStreamReader(fis); // 创建转换流
2. 创建 OutputStreamWriter
FileOutputStream fos = new FileOutputStream("output.txt"); // 创建字节输出流
OutputStreamWriter osw = new OutputStreamWriter(fos); // 创建转换流

在创建转换流时,你可以选择是否指定字符集。如果不指定字符集,将会使用系统默认的字符集。例如,可以这样指定字符集:

InputStreamReader isr = new InputStreamReader(fis, "UTF-8"); // 指定字符集为UTF-8
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8"); // 指定字符集为UTF-8

使用转换流:

1. 使用 InputStreamReader 读取文件内容:
BufferedReader br = new BufferedReader(isr); // 创建缓冲字符流
String line;
while ((line = br.readLine()) != null) {
    System.out.println(line); // 输出每一行内容
}
2. 使用 OutputStreamWriter 写入数据:
BufferedWriter bw = new BufferedWriter(osw); // 创建缓冲字符流
bw.write("Hello, world!"); // 写入字符串
bw.newLine(); // 写入换行符
bw.close(); // 关闭流

序列化流

序列化流在Java中是用来将对象转换为字节流的一种方式。主要用于对象的持久化存储或网络传输。Java提供了两种序列化流:ObjectOutputStream 用于将对象写入到流中,ObjectInputStream 用于从流中读取对象。

创建序列化流:

1. 创建 ObjectOutputStream
FileOutputStream fos = new FileOutputStream("object.dat"); // 创建字节输出流
ObjectOutputStream oos = new ObjectOutputStream(fos); // 创建序列化流
2. 创建 ObjectInputStream
FileInputStream fis = new FileInputStream("object.dat"); // 创建字节输入流 
ObjectInputStream ois = new ObjectInputStream(fis); // 创建反序列化流

使用序列化流:

1. 使用 ObjectOutputStream 写入对象:
MyObject obj = new MyObject(); // 创建一个自定义对象
oos.writeObject(obj); // 将对象写入流中
2. 使用 ObjectInputStream 读取对象:
MyObject obj = (MyObject) ois.readObject(); // 从流中读取对象,并进行类型转换

注意事项:

  1. 被写入流中的对象必须实现 Serializable 接口,否则会抛出 java.io.NotSerializableException 异常。
  2. 对象中的静态变量不会被序列化,因为静态变量属于类而不是对象。
  3. 有时候需要对某些敏感信息进行序列化时,可以使用 transient 关键字来标记不需要序列化的字段。
  4. 序列化的版本号可以通过 serialVersionUID 显式声明,以控制序列化对象的版本。
import java.io.*;

class MyObject implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;

    public MyObject(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

public class Main {
    public static void main(String[] args) {
        try {
            // 创建对象输出流
            FileOutputStream fos = new FileOutputStream("object.dat");
            ObjectOutputStream oos = new ObjectOutputStream(fos);

            // 写入对象
            MyObject obj1 = new MyObject("Object 1");
            oos.writeObject(obj1);

            // 关闭对象输出流
            oos.close();

            // 创建对象输入流
            FileInputStream fis = new FileInputStream("object.dat");
            ObjectInputStream ois = new ObjectInputStream(fis);

            // 读取对象
            MyObject obj2 = (MyObject) ois.readObject();
            System.out.println("Name: " + obj2.getName());

            // 关闭对象输入流
            ois.close();
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

这段代码演示了如何创建和使用序列化流来序列化和反序列化对象。请确保在处理异常时进行适当的处理,比如打印错误信息或者进行其他的异常处理操作。

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

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

相关文章

Qt Creator(Qt 6.6)拷贝一行

Edit - Preference - Environment&#xff1a; 可看到&#xff0c;拷贝一行的快捷键是&#xff1a; ctrl Ins

使用KEPServer连接欧姆龙PLC获取对应标签数据(标签值类型改为字符串型)

1.创建通道&#xff08;通道&#xff09;&#xff0c;&#xff08;选择对应的驱动&#xff0c;跟当前型号PLC型号对应&#xff09;。 2.创建设备&#xff0c;&#xff08;填入IP地址以及欧姆龙的默认端口号&#xff1a;44818&#xff09; 3.创建对应的标签。这里关键讲诉下字…

医院该如何应对网络安全?

在线医生咨询受到很多人的关注&#xff0c;互联网医疗行业的未来发展空间巨大&#xff0c;但随着医院信息化建设高速发展 医院积累了大量的患者基本信息、化验结果、电子处方、生产数据和运营信息等数据 这些数据涉及公民隐私、医院运作和发展等多因素&#xff0c;医疗行业办…

[C/C++]_[初级]_[在Windows平台上导出DLL函数接口的一些疑问]

场景 最近看了《COM本质论》里关于如何设计基于抽象基类作为二进制接口,把编译器和链接器的实现隐藏在这个二进制接口中,从而使用该DLL时不需要重新编译。在编译出C接口时,发现接口名直接是函数名,比如BindNativePort,怎么不是_BindNativePort?说明 VC++导出的函数默认是使…

Notepad++ 常用

File Edit search view Encoding Language Settings Tools Macro Run Plugins Window 文件 编辑 搜索 视图 编码 语言 设置 工具 宏 运行 插件 窗口 快捷方式 定位行 &#xff1a;CTRL g查找&#xff1a; CTRL F替换&am…

精准检测,安全无忧:安全阀检测实践指南

安全阀作为一种重要的安全装置&#xff0c;在各类工业系统和设备中发挥着举足轻重的作用。 它通过自动控制内部压力&#xff0c;有效防止因压力过高而引发的设备损坏和事故风险&#xff0c;因此&#xff0c;对安全阀进行定期检测&#xff0c;确保其性能完好、工作可靠&#xf…

Ubuntu安装GCC编译器

GCC编译器安装 GCC编译器安装切换软件源(换成国内的服务器)1 、创建一个文本文档并命名为“sources.list”2 、复制软件源列表清华源:阿里源:3 、把修改之后的.list 文件覆盖原有的文件4 、更新软件列表5 、安装6 、检查是否安装成功7、GCC 编译器:GCC编译器安装 这里演示…

HackTheBox-Machines--Nibbles

Nibbles 测试过程 1 信息收集 NMAP 80 端口 网站出了打印出“Hello world&#xff01;”外&#xff0c;无其他可利用信息&#xff0c;但是查看网页源代码时&#xff0c;发现存在一个 /nibbleblog 文件夹 检查了 http://10.129.140.63/nibbleblog/ &#xff0c;发现了 /index.p…

数据库开发-MySQL01

目录 前言 1. MySQL概述 1.1 安装 1.1.1 版本 1.1.2 安装 1.1.3 连接 1.1.4 企业使用方式(了解) 1.2 数据模型 1.3 SQL简介 1.3.1 SQL通用语法 1.3.2 分类 2. 数据库设计-DDL 2.1 项目开发流程 2.2 数据库操作 2.2.1 查询数据库 2.2.2 创建数据库 2.2.3 使用数…

开放式耳机怎么选?2024五款火爆全网品牌力荐!

​耳机如今已是生活必备品&#xff0c;但传统入耳式耳机长时间佩戴容易让耳朵受压、甚至引发健康问题。为了解决这些烦恼&#xff0c;开放式耳机应运而生。它不用塞进耳朵&#xff0c;不仅避免了耳道压力&#xff0c;还减少了耳道感染的风险&#xff0c;让人能尽情享受音乐。现…

Java18+ springboot+mysql +Thymeleaf 技术架构开发的全套同城服务家政上门系统源码(APP用户端+APP服务端+PC管理端)

Java springbootmysql Thymeleaf 技术架构开发的全套同城服务家政上门系统源码&#xff08;APP用户端APP服务端PC管理端&#xff09; 家政上门预约系统&#xff1a;该系统综合运用springboot、java1.8、vue移动支付、微信授权登录等技术&#xff0c;由用户小程序、站长小程序、…

C# try catch异常捕获

异常捕获 执行过程&#xff1a;try中的代码没有出现异常&#xff0c;则catch里面不会自行&#xff0c;如果try中代码出现异常&#xff0c;则后面的代码都不执行&#xff0c;直接跳到catch中的代码执行。 // try catch 可以捕获多个错误&#xff0c; try...catch...catch.... …

透明度技术在AI去衣中的双刃剑作用

引言&#xff1a; 在当今这个数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;已经成为我们生活中不可或缺的一部分。它不仅改变了我们的工作方式&#xff0c;还影响了我们的娱乐和社交活动。然而&#xff0c;随着AI技术的不断发展&#xff0c;一些伦理问题也逐渐浮出…

高并发项目-分布式Session解决方案

分布式Session解决方案 1.保存Session&#xff0c;进入商品列表页面 1.保存Session 1.编写工具类 1.MD5Util.java package com.sxs.seckill.utils;import org.apache.commons.codec.digest.DigestUtils;/*** Description: MD5加密工具类** Author sun* Create 2024/5/5 14…

【漏洞复现】WordPress Country State City Dropdown CF7插件 SQL注入漏洞(CVE-2024-3495)

0x01 产品简介 Country State City Dropdown CF7插件是一个功能强大、易于使用的 WordPress 插件&#xff0c;它为用户在联系表单中提供国家.州/省和城市的三级下拉菜单功能&#xff0c;帮助用户更准确地填写地区信息。同时&#xff0c;插件的团队和支持也非常出色&#xff0c…

启智CV机器人,ROS,ubuntu 20.04 【最后一步有问题】

资料&#xff1a; https://wiki.ros.org/kinetic/Installation/Ubuntu https://blog.csdn.net/qq_44339029/article/details/120579608 装VM。 装ubuntu20.04 desktop.iso系统。 装vm工具&#xff1a; sudo apt update sudo dpkg --configure -a sudo apt-get autoremove o…

热敏电阻的设计

热敏电阻(NTC)的作用&#xff1a;抑制开机时的浪涌电流。防止开机瞬间产生的浪涌电流损坏后面的元件。 取值依据:根据对开机的脉冲电流&#xff08;浪涌电流&#xff09;小于多少A&#xff1f; 由,这个U是指最大输入电压&#xff0c;I为要求的浪涌电流。 NTC是负温度系数的热…

生成树协议STP(Spanning Tree Protocol)

为了提高网络可靠性&#xff0c;交换网络中通常会使用冗余链路。然而&#xff0c;冗余链路会给交换网络带来环路风险&#xff0c;并导致广播风暴以及MAC地址表不稳定等问题&#xff0c;进而会影响到用户的通信质量。生成树协议STP&#xff08;Spanning Tree Protocol&#xff0…

Flutter基础 -- Dart 语言 -- 注释函数表达式

目录 1. 注释 1.1 单行注释 1.2 多行注释 1.3 文档注释 2. 函数 2.1 定义 2.2 可选参数 2.3 可选参数 默认值 2.4 命名参数 默认值 2.5 函数内定义 2.6 Funcation 返回函数对象 2.7 匿名函数 2.8 作用域 3. 操作符 3.1 操作符表 3.2 算术操作符 3.3 相等相关的…

安卓SystemServer进程详解

目录 一、概述二、源码分析2.1 SystemServer fork流程分析2.1.1 [ZygoteInit.java] main()2.1.2 [ZygoteInit.java] forkSystemServer()2.1.3 [Zygote.java] forkSystemServer()2.1.4 [com_android_internal_os_Zygote.cpp]2.1.5 [com_android_internal_os_Zygote.cpp] ForkCom…