IO流:字节流、字符流、缓冲流、转换流、数据流、序列化流 --Java学习笔记

目录

IO流

IO流的分类

IO流的体系

字节流:

1、Filelnputstream(文件字节输入流)

2、FileOutputStream(文件字节输出流)

字节流非常适合做一切文件的复制操作

复制案例:

try-catch-finally 和 try-with-resource

 字符流

1、FileReader(文件字符输入流)

2、FileWriter(文件字符输出流)

字节流、字符流的使用场景小结:

缓冲流

BufferedReader(字符缓冲输入流)

BufferedWriter(字符缓冲输出流)

不同编码读取出现乱码的问题

转换流

InputStreamReader(字符输入转换流)

OutputStreamWriter字符输出转换流

打印流

PrintStream/PrintWriter(打印流)

Printstream提供的打印数据的方案

PrintWriter提供的打印数据的方案

PrintStream和PrintWriter的区别

打印流的一种应用:输出语句的重定向

数据流

DataOutputstream(数据输出流)

Datalnputstream(数据输入流)

序列化流

Objectoutputstream(对象字节输出流)

Objectlnputstream(对象字节输入流)


IO流

  • 读写数据的输入输出流
  • I指Input,称为输入流:负责把数据读到内存中去
  • O指Output,称为输出流:负责写数据出去

IO流的分类

IO流总体看来分为四大流

  • 字节输入流:以内存为基准,来自磁盘文件/网络中的数据以字节的形式读入到内存中去的流
  • 字节输出流:以内存为基准,把内存中的数据以字节写出到磁盘文件或者网络中去的流
  • 字符输入流:以内存为基准,来自磁盘文件/网络中的数据以字符的形式读入到内存中去的流
  • 字符输出流:以内存为基准,把内存中的数据以字符写出到磁盘文件或者网络介质中去的流

IO流的体系

字节流:

1、Filelnputstream(文件字节输入流)

  • 作用:以内存为基准,可以把磁盘文件中的数据以字节的形式读入到内存中去

代码演示:

abc.txt内容

一个一个字节读 和 使用循环一个一个字节读:

import java.io.*;

public class IoTest1 {
    public static void main(String[] args) throws IOException {
        //1、创建文件字节输入流管道,与源文件接通
        //InputStream fileInputStream = new FileInputStream(new File("file_io\\src\\com\\zeyu\\abc.txt"));  new File可省略
        InputStream fileInputStream = new FileInputStream("file_io\\src\\com\\zeyu\\abc.txt");

        //2、读取文件字节数据
        //public int read() 每次读取一个字节返回,如果没有数据了,返回-1
//        int b1 = fileInputStream.read();
//        System.out.println((char)b1);
//
//        int b2 = fileInputStream.read();
//        System.out.println((char)b2);

        //使用循环读
        int b;
        while((b = fileInputStream.read()) != -1){
            System.out.print((char)b);
        }
        //读取数据的性能很差!
        //读取汉字输出会乱码!!无法避免的!!
        //流使用完毕之后,必须关闭!释放系统资源!
        fileInputStream.close();
    }
}

运行结果:

为什么会乱码?

因为中文字符在utf-8里面占三个字节,而每次读取一个字节输出显然是解码不出中文的,只会读取中文字符三个字节中的一个字节

用字节数组读 和 结合循环用字节数组读:

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

public class IoTest2 {
    public static void main(String[] args) throws IOException {
        InputStream fileInputStream = new FileInputStream("file_io\\src\\com\\zeyu\\abc.txt");
        //读取文件中的字节数据,每次读取多个字节
        // public int read(byte b[])throws IOException
        //每次读取多个字节到字节数组中去,返回读取的字节数量,读取完毕会返回-1
//        byte[] buffer = new byte[3];
//        int len = fileInputStream.read(buffer); //返回读取了多少个字节
//        System.out.println(new String(buffer));
//        System.out.println(len);
//
//        int len2 = fileInputStream.read(buffer);
//        //注意:读取多少,倒出多少
//        System.out.println(new String(buffer,0,len2));  //倒出0到len2的字节
//        System.out.println(len2);
//
//        int len3 = fileInputStream.read(buffer);
//        System.out.println(len3);   //-1

        //使用循环改造
        int len;
        byte[] buffer = new byte[3];
        while((len = fileInputStream.read(buffer)) != -1){
            System.out.print(new String(buffer, 0, len));
        }   //性能得到了明显的提升
            //这种方案也不能避免中文乱码问题
        fileInputStream.close();
    }
}

运行结果:

即使每次读取三个字节,依旧无法避免乱码的可能,因为若读取的字符串排列为前面俩个英文接一个中文,就会读取到前面俩个英文的(英文数字在utf-8中占一个字节)字节和中文的其中一个字节

一次性读取全部字节:

package com.zeyu.Io;

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

public class IoTest3 {
    public static void main(String[] args) throws IOException {
        //一次性读取完文件的全部字节
        InputStream is = new FileInputStream("file_io\\src\\com\\zeyu\\abc2.txt");

        //准备一个字节数组,大小与文件的大小一样大
//        File f = new File("file_io\\src\\com\\zeyu\\abc2.txt");
//        long size = f.length();
//        byte[] buffer = new byte[(int)size];
//
//        int len = is.read(buffer);
//
//        System.out.println(new String(buffer));
//        System.out.println(len);
//        System.out.println(size);

        byte[] buffer = is.readAllBytes(); //readAllBytes() 直接把文件的全部字节读取到一个字节数组中返回
        System.out.println(new String(buffer));
    }
}

运行结果:

一次读取完文件的所有字节,当然就不会出现乱码问题了,但是文件过大依旧可能出现内存溢出问题

2、FileOutputStream(文件字节输出流)

  • 作用:以内存为基准,把内存中的数据以字节的形式写出到文件中去

代码演示:

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

public class IoTest4 {
    public static void main(String[] args) throws IOException {
        //创建一个字节输出流管道与目标文件接通
        FileOutputStream os = new FileOutputStream("file_io\\src\\com\\zeyu\\abc3.txt");

        //写字节出去
        os.write(97);   //97 为英文字母a的ASCII码
        os.write('b');
        //os.write('泽');  会乱码,中文在utf-8中占3个字节,默认只能写出去一个字节

        byte[] bytes = "重返蓝鲸岛abc".getBytes();
        os.write(bytes);    //直接写入字节数组就没有问题
        os.write("\r\n".getBytes());    //\r\n  换行
        os.write(bytes,0,15);   //写入指定长度

        os.close();

        FileOutputStream os2 = new FileOutputStream("file_io\\src\\com\\zeyu\\abc3.txt",true);  //后面写true,追加数据,不覆盖
        os2.write(bytes);
        os2.close();
    }
}

abc3.txt内容:

字节流非常适合做一切文件的复制操作

  • 任何文件的底层都是字节,字节流做复制,是一字不漏的转移完全部字节,只要复制后的文件格式一致就没问题!

复制案例:

将c盘的一张图片复制到d盘

package com.zeyu.exercise;

import java.io.*;

public class copyFile {
    public static void main(String[] args) throws Exception {
        InputStream is = new FileInputStream("C:\\Users\\dzy\\Pictures\\Camera Roll\\六花.jpg");  //原位置
        OutputStream os = new FileOutputStream("D:\\File\\六花\\六花.jpg"); //目标位置

        byte[] buffer = new byte[1024]; //每次1kb
        int len;    //记录读出多少
        while((len = is.read(buffer)) != -1){
            os.write(buffer,0,len); //取多少倒多少
        }

        is.close();
        os.close();
    }
}

try-catch-finally 和 try-with-resource

如果在使用完IO流之后不关闭(close),可能会导致资源泄漏和引起文件锁定等问题。所以要在使用完后关闭流
假如在执行close语句之前有语句出现异常,那么自然也不会执行close语句,也就不会关闭流了
例如:

运行结果:

可以看到System.out.println(10/0) 这句语句显然是有问题的,而代码执行到这句语句时就直接终止了,后面的语句都没有执行,也就没有关闭流。鉴于这种情况,我们可以用try-catch-finally 或 try-with-resource来解决:

try-catch-finally:

package com.zeyu.Io;

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

public class try_catch_finally {
    public static void main(String[] args) {
        FileOutputStream os = null;
        try {
            //创建一个字节输出流管道与目标文件接通
            os = new FileOutputStream("file_io\\src\\com\\zeyu\\abc3.txt");

            //写字节出去
            os.write(97);
            os.write('b');
            //os.write('泽');  会乱码,中文在utf-8中占3个字节,默认只能写出去一个字节

            byte[] bytes = "重返蓝鲸岛abc".getBytes();
            os.write(bytes);    //直接写入字节数组就没有问题
            os.write("\r\n".getBytes());    //\r\n  换行
            os.write(bytes,0,15);   //写入指定长度
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //释放资源的操作
            try {
                if(os != null) os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}

在try-catch-finally中无论代码是否报错,它都会在结束之前执行finally里面的语句,除非在其它地方使用System.exit()关闭了jvm,所以使用try-catch-finally方式是肯定会释放资源执行close的

注意:finally中不要写return语句,不然它先执行finally的return从而忽略真正的return语句

try-with-resource:

package com.zeyu.Io;

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

public class try_with_resource {
    public static void main(String[] args) {
        try(    //自动关闭在此创建的资源对象,调用其close方法
                //创建一个字节输出流管道与目标文件接通
                FileOutputStream os = new FileOutputStream("file_io\\src\\com\\zeyu\\abc3.txt");
                //注意:这里只能放资源对象
                //资源对象就是会实现AutoCloseable接口的对象
                ) {

            //写字节出去
            os.write(97);
            os.write('b');
            //os.write('泽');  会乱码,中文在utf-8中占3个字节,默认只能写出去一个字节

            byte[] bytes = "重返蓝鲸岛abc".getBytes();
            os.write(bytes);    //直接写入字节数组就没有问题
            os.write("\r\n".getBytes());    //\r\n  换行
            os.write(bytes,0,15);   //写入指定长度

            os.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

显然,这是一种比try-catch-finally更方便的方法,只要在try后面加个括号,里面写上需要释放的资源的定义语句,那么它就会自动释放其中的资源

 字符流

1、FileReader(文件字符输入流)

  • 作用:以内存为基准,可以把文件中的数据以字符的形式读入到内存中去

代码演示:

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

public class IO_charTest1 {
    public static void main(String[] args) {
        try (   // 1、创建一个文件字符输入流管道与源文件接通
                Reader r = new FileReader("file_io\\src\\com\\zeyu\\z.txt");
                ){
            //读取文本文件内容
            //每次读取一个字符(性能较差,每次读取都要进行系统调用)
//            int c;
//            while((c = r.read()) != -1){
//                System.out.print((char)c);
//            }

            //每次读取多个字符
            //性能不错(每次读取多个,进行系统调用的次数就少了)
            int len;
            char[] buffer = new char[3];
            while((len = r.read(buffer)) != -1){
                System.out.print(new String(buffer,0,len));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

运行结果:

2、FileWriter(文件字符输出流)

  • 作用:以内存为基准,把内存中的数据以字符的形式写出到文件中去

字特输出流使用时的注意事项

  • 字符输出流写出数据后,必须刷新流,或者关闭流,写出去的数据才能生效

代码演示:

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

public class IO_charTest2 {
    public static void main(String[] args) {
        try (   // 0、创建一个文件字符输出流管道与目标文件接通。
                Writer w = new FileWriter("file_io\\src\\com\\zeyu\\z2.txt"/*,true*/);  //后面加true写入由覆盖变为追加
                ){
            // 1、public void write(int c):写一个字符出去
            w.write('l');
            // 2、public void write(string c)写一个字符串出去
            w.write("ove");
            w.write("\r\n");    //换行
            // 3、public void write(string c,int pos ,int len):写字符串的一部分出去
            w.write("hate you",5,3);
            w.write("\r\n");

            // 4、public void write(char[] buffer):写一个字符数组出去
            char[] buffer = {'当','花','叶','呢','喃','之','时',',','请','呼','唤','我','的','名','字'};
            w.write(buffer);
            w.write("\r\n");
            //5、public void write(char[] buffer ,int pos ,int len):写字符数组的一部分出去
            w.write(buffer,8,7);
            w.flush();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

运行结果:

字节流、字符流的使用场景小结:

  • 字节流适合做一切文件数据的拷贝(音视频,文本);字节流不适合读取中文内容输出
  • 字符流适合做文本文件的操作(读,写)

缓冲流

  • 对原始流进行包装,以提高原始流读写数据的性能的流
  • 提高字节流读写数据的性能
  • 原理:字节缓冲输入流自带了8KB缓冲池;字节缓冲输出流也自带了8KB缓冲池

构造器:

将字节流包装成字节缓冲流,再使用字节缓冲流做操作效率会更快

代码演示:

package com.zeyu.IO_byte_buffer;

import java.io.*;

public class IO_byte_bufferTest1 {
    public static void main(String[] args) {
        try (
                OutputStream os = new FileOutputStream("file_io\\src\\com\\zeyu\\b.txt");
                OutputStream bos = new BufferedOutputStream(os/*,8192*2*/);    //字节缓冲输出流,可以在后面自定义缓冲池大小
                InputStream is = new FileInputStream("file_io\\src\\com\\zeyu\\b.txt");
                InputStream bis = new BufferedInputStream(is/*,8192*/);  //字节缓冲输入流,可以在后面自定义缓冲池大小
                ){
            bos.write("由此开启那飘零于时间里的故事".getBytes());
            bos.flush();
            byte[] buffer = new byte[1024];
            int len;
            while((len = bis.read(buffer)) != -1){
                System.out.println(new String(buffer,0,len));
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

运行结果:

BufferedReader(字符缓冲输入流)

  • 作用:自带8K(8192)的字符缓冲池,可以提高字符输入流读取字符数据的性能

  • 字符缓冲输入流新增的功能:按照行读取字符

代码演示:

package com.zeyu.IO_char;

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

public class IO_charTest1 {
    public static void main(String[] args) {
        try (   // 1、创建一个文件字符输入流管道与源文件接通
                Reader r = new FileReader("file_io\\src\\com\\zeyu\\z.txt");
                ){
            //读取文本文件内容
            //每次读取一个字符(性能较差,每次读取都要进行系统调用)
//            int c;
//            while((c = r.read()) != -1){
//                System.out.print((char)c);
//            }

            //每次读取多个字符
            //性能不错(每次读取多个,进行系统调用的次数就少了)
            int len;
            char[] buffer = new char[3];
            while((len = r.read(buffer)) != -1){
                System.out.print(new String(buffer,0,len));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

运行结果:

BufferedWriter(字符缓冲输出流)

  • 作用:自带8K的字符缓冲池,可以提高字符输出流写字符数据的性能

  • 字符缓冲输出流新增的功能:换行

代码演示:

package com.zeyu.IO_char;

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

public class IO_charTest2 {
    public static void main(String[] args) {
        try (   // 0、创建一个文件字符输出流管道与目标文件接通。
                Writer w = new FileWriter("file_io\\src\\com\\zeyu\\z2.txt"/*,true*/);  //后面加true写入由覆盖变为追加
                ){
            // 1、public void write(int c):写一个字符出去
            w.write('l');
            // 2、public void write(string c)写一个字符串出去
            w.write("ove");
            w.write("\r\n");    //换行
            // 3、public void write(string c,int pos ,int len):写字符串的一部分出去
            w.write("hate you",5,3);
            w.write("\r\n");

            // 4、public void write(char[] buffer):写一个字符数组出去
            char[] buffer = {'当','花','叶','呢','喃','之','时',',','请','呼','唤','我','的','名','字'};
            w.write(buffer);
            w.write("\r\n");
            //5、public void write(char[] buffer ,int pos ,int len):写字符数组的一部分出去
            w.write(buffer,8,7);
            w.flush();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

运行结果:

不同编码读取出现乱码的问题

  • 如果代码编码和被读取的文本文件的编码是一致的,使用字符流读取文本文件时不会出现乱码!
  • 如果代码编码和被读取的文本文件的编码是不一致的,使用字符流读取文本文件时就会出现乱码!

转换流

InputStreamReader(字符输入转换流)

  • 解决不同编码时,字符流读取文本内容乱码的问题
  • 解决思路:先获取文件的原始字节流,再将其按真实的字符集编码转成字符输入流,这样字符输入流中的字符就不乱码了

代码演示:

c.txt为GBK编码

import java.io.*;

public class IO_transFromTest1 {
    public static void main(String[] args) {
        try (
                //1、得到文件的原始字节流(GBK的字节流形式)
                InputStream is = new FileInputStream("file_io\\src\\com\\zeyu\\c.txt");
                //2、把原始的字节输入流按照指定的字符集编码转换成字符输入流
                Reader isr = new InputStreamReader(is,"GBK");
                //把字符输入流包装成缓冲字符输入流
                BufferedReader br = new BufferedReader(isr);
                ){
            String line;
            while((line = br.readLine()) != null){
                System.out.println(line);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

OutputStreamWriter字符输出转换流

  • 作用:可以控制写出去的字符使用什么字符集编码
  • 解决思路:获取字节输出流,再按照指定的字符集编码将其转换成字符输出流,以后写出去的字符就会用该字符集编码了

代码演示:

package com.zeyu.transfrom;

import java.io.*;

public class IO_transFromTest2 {
    public static void main(String[] args) {
        try (
                //1、得到文件的原始字节流(GBK的字节流形式)
                OutputStream os = new FileOutputStream("file_io\\src\\com\\zeyu\\c2.txt");
                //2、把原始的字节输入流按照指定的字符集编码转换成字符输入流
                Writer osr = new OutputStreamWriter(os,"GBK");
                //把字符输入流包装成缓冲字符输入流
                BufferedWriter bw = new BufferedWriter(osr);
                ){
            osr.write("I’m a little used to calling outside your name\n" +
                    "我有些习惯在外面大喊你的名字");
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

运行结果:

c2.txt为GBK编码

也可调用String提供的getBytes方法控制写出去的字符使用什么字符集编码

打印流

PrintStream/PrintWriter(打印流)

  • 作用:打印流可以实现更方便、更高效的打印数据出去,能实现打印啥出去就是啥出去

Printstream提供的打印数据的方案

PrintWriter提供的打印数据的方案

 演示代码:

package com.zeyu.print;

import java.io.PrintStream;

public class IO_printTest1 {
    public static void main(String[] args) {
        try (
                PrintStream ps = new PrintStream("file_io\\src\\com\\zeyu\\print.txt"/*, Charset.forName("GBK")*/); //指定字符集编码写入
//                PrintWriter ps = new PrintWriter("file_io\\src\\com\\zeyu\\print.txt"/*, Charset.forName("GBK")*/);
                                    //打印与PrintStream基本一致,PrintStream支持写字节数据,PrintWriter支持写字符数据
//                PrintWriter ps = new PrintWriter(new FileWriter("file_io\\src\\com\\zeyu\\print.txt",true));  //追加写法
                ){
            ps.println("如果下摆湿掉了的话");
            ps.println("等待干就行了");
            ps.println("水滴飞溅 发出声音");
            ps.println("是你教会了我 不再去害怕");
            ps.println("紧握住你的手 不放开的话");
            ps.println(97);
            ps.println(false);
            ps.println(3.14);
            ps.write(97);   //'a'
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

运行结果:

PrintStream和PrintWriter的区别

  • 打印数据的功能上是一模一样的:都是使用方便,性能高效(核心优势)
  • PrintStream继承自字节输出流OutputStream,因此支持写字节数据的方法
  • PrintWriter继承自字符输出流Writer,因此支持写字符数据出去

打印流的一种应用:输出语句的重定向

  • 可以把输出语句打印位置改到某个文件中去

代码演示:

package com.zeyu.print;

import java.io.PrintStream;

public class IO_printTest2 {
    public static void main(String[] args) {
        System.out.println("如果下摆湿掉了的话");
        System.out.println("等待干就行了");
        try (
                PrintStream ps = new PrintStream("file_io\\src\\com\\zeyu\\print2.txt");
                ){
            System.setOut(ps);  //把系统默认的打印流对象改成自己的打印流对象
            System.out.println("水滴飞溅 发出声音");
            System.out.println("是你教会了我 不再去害怕");
            System.out.println("紧握住你的手 不放开的话");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

运行结果:

数据流

DataOutputstream(数据输出流)

  • 允许把数据和其类型一并写出去

代码演示:

import java.io.DataOutputStream;
import java.io.FileOutputStream;

public class IO_DataOutputTest1 {
    public static void main(String[] args) {
        try (   //创建一个数据输出流包装低级的字节输出流
                DataOutputStream dos = new DataOutputStream(new FileOutputStream("file_io\\src\\com\\zeyu\\data.txt"));
                ){
            dos.writeBoolean(true);
            dos.writeInt(777);
            dos.writeDouble(3.14);
            dos.writeUTF("缠住吻住春风吹住我吗");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

运行结果:

Datalnputstream(数据输入流)

  • 用于读取数据输出流写出去的数据

代码演示:

import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;

public class IO_DataInputTest2 {
    public static void main(String[] args) {
        try (        //创建一个数据输入流包装低级的字节输入流
                DataInputStream dis = new DataInputStream(new FileInputStream("file_io\\src\\com\\zeyu\\data.txt"));
                ){
            //读取的类型顺序要和写入的类型顺序一一对应,不然会出bug
            System.out.println(dis.readBoolean());
            System.out.println(dis.readInt());
            System.out.println(dis.readDouble());
            System.out.println(dis.readUTF());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

运行结果:

序列化流

  • 对象序列化:把Java对象写入到文件中去
  • 对象反序列化:把文件里的Java对象读出来

Objectoutputstream(对象字节输出流)

  • 可以把Java对象进行序列化:把Java对象存入到文件中去

注意:对象如果要参与序列化,必须实现序列化接口(java.io.Serializable)

代码演示:

package com.zeyu.object;

import java.io.*;

public class IO_objectOutputTest1 {
    public static void main(String[] args) {
        try (   //2、创建一个对象字节输出流包装原始的字节输出流
                ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("file_io\\src\\com\\zeyu\\Object.txt"));
                ){
            //1、创建一个java对象
            User u1 = new User("admin","小白","123456",22);

            //3、序列化对象到文件中
            oos.writeObject(u1);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

运行结果:

Objectlnputstream(对象字节输入流)

  • 可以把Java对象进行反序列化:把存储在文件中的Java对象读入到内存中来

代码演示:

package com.zeyu.object;

import java.io.FileInputStream;
import java.io.ObjectInputStream;

public class IO_ObjectInputTest2 {
    public static void main(String[] args) {
        try (
                //创建一个对象字节输入流管道,包装低级的字节输入流与源文件接通
                ObjectInputStream ois = new ObjectInputStream(new FileInputStream("file_io\\src\\com\\zeyu\\Object.txt"));
                ){
            User u = (User) ois.readObject();
            System.out.println(u);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

运行结果:

如果想让对象某个成员变量不参与序列化,可以使用transient

如果想要一次性序列化多个对象,可以用集合包装这些对象,然后直接序列化集合对象,ArrayList集合已经实现了序列化接口!

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

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

相关文章

JimuReport 积木报表

一款免费的数据可视化报表,含报表和大屏设计,像搭建积木一样在线设计报表!功能涵盖,数据报表、打印设计、图表报表、大屏设计等! Web 版报表设计器,类似于 excel 操作风格,通过拖拽完成报表设计…

C#学生信息管理系统

一、引言 学生信息管理系统是现代学校管理的重要组成部分,它能够有效地管理学生的基本信息、课程信息、成绩信息等,提高学校管理的效率和质量。本文将介绍如何使用SQL Server数据库和C#语言在.NET平台上开发一个学生信息管理系统的课程设计项目。 二、项…

前端学习<四>JavaScript基础——02-JavaScript入门:hello world

开始写第一行 JavaScript:hello world JS 代码的书写位置在哪里呢?这个问题,也可以理解成:引入 JS 代码,有哪几种方式?有三种方式:(和 CSS 的引入方式类似) 行内式&…

msyql 查看和修改字符集的方法

在插入或修改数据的时候,报字符集的错误,中文的无法进行插入修改。比如: update users set user_name关羽 where user_id2; 报错信息: ERROR 1366 (HY000): Incorrect string value: /xB9/xD8/xD3/xF0 for column user_name at …

2024年学浪视频下载器

学浪视频官方没有提供下载选项,但又有很多人需要学浪视频下载器,于是我就开发了这么一款软件,学浪视频下载器:小浪助手.exe 我把学浪下载器打包成压缩包,有需要的自己取一下 链接:https://pan.baidu.com/s/1y7vcqILT…

Google Chrome 常用设置

Google Chrome 常用设置 References 转至网页顶部 快捷键:Home 转至内容设置 chrome://settings/content 清除浏览数据 历史记录 -> 清除浏览数据 关于 Chrome 设置 -> 关于 Chrome chrome://settings/help References [1] Yongqiang Cheng, https:/…

保健品wordpress外贸模板

保健品wordpress外贸模板 健康保养保健品wordpress外贸模板,做大健康行业的企业官方网站模板。 https://www.jianzhanpress.com/?p3514

NucleiStudio下longan nano烧录官方例程

longan nano烧录官方例程 一、准备工作二、编译程序三、器件连接四、烧录程序 IDE:NucleiStudio202009 开发板:longan nano gd32vf103c8t6 一、准备工作 1、下载IDE 芯来科技官网下载NucleiStudio 2、下载烧录器 https://dl.sipeed.com/shareURL/LONGAN/LonganPi3H 网盘链接 …

达梦配置ODBC连接

达梦配置ODBC连接 基础环境 操作系统:Red Hat Enterprise Linux Server release 7.9 (Maipo) 数据库版本:DM Database Server 64 V8 架构:单实例1 下载ODBC包 下载网址:https://www.unixodbc.org/ unixODBC-2.3.0.tar.gz2 编译并…

【Qt 学习笔记】认识QtSDK中的重要工具

博客主页:Duck Bro 博客主页系列专栏:Qt 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ 认识QtSDK中的重要工具 文章编号:Qt 学习笔记 / 03 文章目…

MySQL安装卸载-Linux

目录 1.概述 2.安装 2.1.上传 2.2.解压 ​​​​​​​2.3.安装 ​​​​​​​2.4.启动服务 ​​​​​​​2.5.查询临时密码 ​​​​​​​2.6.修改临时密码 ​​​​​​​2.7.创建用户 ​​​​​​​2.8.分配权限 ​​​​​​​2.9.重新链接 3.卸载 3.1.停…

A53 cache的架构解读

快速链接: 【精选】ARMv8/ARMv9架构入门到精通-[目录] 👈👈👈 引流关键词:缓存,高速缓存,cache, CCI,CMN,CCI-550,CCI-500,DSU,SCU,L1,L2,L3,system cache, Non-cacheable,Cacheable, non-shareable,inner-shareable,outer-shareable, optee、…

【C++】C++11类的新功能

👀樊梓慕:个人主页 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 🌝每一个不曾起舞的日子,都是对生命的辜负 目录 前言 默认成员函数 类成…

shell的编写

文章目录 1.框架2.命令行3.获取用户命令字符串4.命令行字符串分割5.执行命令和内建命令6.完整代码: 1.框架 我们知道shell是一直存在的,所以首先我们第一步就是要搭建一个框架,使其一直存在。 那么也很简单,一个while循环就可以完…

intellij idea 使用git的 cherry pick 摘取其他分支的comment

cherry pick 摘取其他分支的comment 如果想把 feature_v1.0 分支的comment 摘到 feature_v1.0_new 分支上, 先切换到 feature_v1.0_new分支,这一步不能少了。然后点击 下面菜单栏的 git,点击Local Changes旁边的 Log,这时能看到…

(科研实践篇)大模型相关知识

1.embedding 1.介绍: embedding就是用一个低纬的向量表示一个物品。而这个embedding向量的实质就是使距离相似的向量所对应的物品具有相似的含义(参考皮尔逊算法和cos余弦式子:计算相似度)简单来说,就是用空间去表示…

一个简单好看的html模板

做一个个人博客第一步该怎么做? 好多零基础的同学们不知道怎么迈出第一步。 那么,就找一个现成的模板学一学呗,毕竟我们是高贵的Ctrl c v 工程师。 但是这样也有个问题,那就是,那些模板都,太!…

后端SpringBoot+Mybatis 查询订单数据表奇怪报错加一

排错过程: 看报错意思是SQL语句存在错误,然后使用图形化工具运行这个SQL语句 其实这里稍微细心想一下就能发现问题,但是当时没深入想,就觉得order表前加了数据库名字影响不大,所以感觉SQL语句是没问题的,然…

第十二篇【传奇开心果系列】Python自动化办公库技术点案例示例:深度解读Python自动化操作Word

传奇开心果系列博文 系列博文目录Python自动化办公库技术点案例示例系列 博文目录前言一、Python自动化操作Word介绍二、使用python-docx示例代码二、**使用win32com示例代码**三、使用comtypes示例代码四、使用docx-mailmerge示例代码五、基本操作示例代码六、高级操作示例代码…

讲讲你对数据结构-线性表了解多少?

线性表 - 数组和矩阵 当谈到线性表时,数组和矩阵是两种常见的数据结构。 数组(Array): 数组是有序的元素集合,可以通过索引来访问和操作其中的元素。它是最简单、最基本的数据结构之一。数组的特点包括: …