[java进阶]——高级IO流家族,序列化流、打印流、压缩流、转换流

简介: [java进阶]——高级IO流家族,序列化流、打印流、压缩流、转换流

一、序列化流 (对象操作流)

序列化的概念:

当不想让他人读懂文件里的数据时,可以将数据序列化

创建一个自定义对象时,会根据所有成员计算出一个序列号。

存储数据时,会先根据序列号序列化内容,然后把序列号和被序列内容一同存到文件里面。

//序列化流
Studen s = new Studen("xiaohong", 14);
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("10_16\\a.txt"));
oos.writeObject(s);
oos.close();
//反序列化输入流
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("10_16\\a.txt"));
Object o = ois.readObject();
ois.close();
System.out.println(((Studen) o));

代码解析:

要关联基本流

别忘了关流

细节:

①要序列化的类必须实现Serializable接口,该接口是标记性接口,里面没有抽象方法,作用就是标识这个类可被序列化和反序列化

②如果我们存完该类后,又修改了该类的成员,序列号就会变,序列号变也就意味着以前的序列号没用了,你在反序列化就会报错,在该类中添加以下代码。

private static final long serialVersionUID = -1326719789726226251L;

③反序列化出来的数据类型是Object,我们要强转为需要的类型

用集合序列化多个对象

如果我们在存储一个类的多个对象是,在反序列化时读取到最后一个就会错,EOFExpection异常,所以 一般我们用集合存储多个对象,直接序列化和反序列化集合

二、打印流

PrintStream ps = new PrintStream(new FileOutputStream("10_16\\a.txt"));
ps.println("BBB");
ps.close();

代码分析:

关联基本流

使用print、printfln等方法向文件写数据

关流

标准输出流

System.out.printfln就是标准输出流,输出到控制台。

System是系统的一个类.out一个静态的输出流,默认指向控制台,所以这也是为什么我们每次打印都能在控制台看到数据

三、压缩流(zip文件)

解压缩本质:从压缩文件读取数据,每一个ZipEntery对象代表一个压缩文件或文件夹

File src = new File("10_16\\a.zip");
File dest = new File("10_16\\");
unzip(src, dest);
private static void unzip(File src, File dest) throws IOException {
ZipInputStream zip = new ZipInputStream(new FileInputStream(src), Charset.forName("GBK"));
        //nextEntry表示压缩包里面的每一个文件,读取完返回null
        ZipEntry ze = null;
        while((ze = zip.getNextEntry()) != null){
            //如果是文件夹 创建文件夹
            if(ze.isDirectory()){
                new File(dest, ze.toString()).mkdir();
            }else{
                int tmp = 0;
                FileOutputStream fos = new FileOutputStream(new File(ze.toString()));
                while((tmp = zip.read()) != -1){
                    fos.write(tmp);
                }
                fos.close();
            }
        }
        zip.close();
    }

压缩实际:将数据写入到压缩文件,将压缩文件对象放到压缩包里

//压缩文件流
        File src = new File("10_16\\a");
        File dest = new File(src.getParent(), src.getName()+".zip");
        //将文件写入压缩文件流
        ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(dest));
        //第三个参数代表压缩包里面的路径
        //注意第三个参数
        toZip(src, zos, src.getName());
        zos.close();
 private static void toZip(File src, ZipOutputStream zos, String dest) throws IOException {
        //files是绝对路径
        File[] files = src.listFiles();
        for (File file : files) {
            if(file.isDirectory()){
                toZip(file, zos, dest+"\\"+file.getName());
            }else{
                //将文件写入到entryzip对象里,将此对象put到压缩包里
                ZipEntry ze = new ZipEntry(dest+"\\"+file.getName());
                zos.putNextEntry(ze);
                FileInputStream fis = new FileInputStream(file);
                int tmp = 0;
                while((tmp = fis.read()) != -1){
                    zos.write(tmp);
                }
                fis.close();
                zos.closeEntry();
            }
        }
    }

四、转换流

是字符流与字节流之间的桥梁

InputStreamReader:将一个输入字节流转换为字符流(读数据的时候可以读一个字符)

OutputSreamWriter:将一个输出字符流转为字节流(写数据的时候写一个字节)

//将字节流转换为字符流
        File newfile = new File("IOTest1\\a.txt");
        InputStreamReader isr = new InputStreamReader(new FileInputStream(newfile));
        int tmp = 0;
        while ((tmp = isr.read()) != -1){
            System.out.print((char)tmp);
        }
        isr.close();
File newfile = new File("IOTest1\\a.txt");
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(newfile));
        osw.write("我是通过转换流写入的");
        osw.close();
相关文章
|
9月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
431 1
|
9月前
|
Java Unix Go
【Java】(8)Stream流、文件File相关操作,IO的含义与运用
Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。!但本节讲述最基本的和流与 I/O 相关的功能。我们将通过一个个例子来学习这些功能。
348 1
|
9月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
397 1
|
11月前
|
Java 测试技术 API
Java IO流(二):文件操作与NIO入门
本文详解Java NIO与传统IO的区别与优势,涵盖Path、Files类、Channel、Buffer、Selector等核心概念,深入讲解文件操作、目录遍历、NIO实战及性能优化技巧,适合处理大文件与高并发场景,助力高效IO编程与面试准备。
|
11月前
|
SQL Java 数据库连接
Java IO流(一):字节流与字符流基础
本文全面解析Java IO流,涵盖字节流、字符流及其使用场景,帮助开发者理解IO流分类与用途,掌握文件读写、编码转换、异常处理等核心技术,通过实战案例提升IO编程能力。
|
存储 Java Linux
操作系统层面视角下 Java IO 的演进路径及核心技术变革解析
本文从操作系统层面深入解析Java IO的演进历程,涵盖BIO、NIO、多路复用器及Netty等核心技术。分析各阶段IO模型的原理、优缺点及系统调用机制,探讨Java如何通过底层优化提升并发性能与数据处理效率,全面呈现IO技术的变革路径与发展趋势。
255 3
|
监控 Java API
现代 Java IO 高性能实践从原理到落地的高效实现路径与实战指南
本文深入解析现代Java高性能IO实践,涵盖异步非阻塞IO、操作系统优化、大文件处理、响应式网络编程与数据库访问,结合Netty、Reactor等技术落地高并发应用,助力构建高效可扩展的IO系统。
352 0
|
存储 安全 Java
深入理解Java序列化接口及其实现机制
记住,序列化不仅仅是把对象状态保存下来那么简单,它涉及到类的版本控制、安全性和性能等多个重要方面。正确理解和实现Java序列化机制对于构建高效、安全和可维护的Java应用至关重要。
353 0
|
JSON Java 数据库连接
|
存储 网络协议 安全
Java网络编程,多线程,IO流综合小项目一一ChatBoxes
**项目介绍**:本项目实现了一个基于TCP协议的C/S架构控制台聊天室,支持局域网内多客户端同时聊天。用户需注册并登录,用户名唯一,密码格式为字母开头加纯数字。登录后可实时聊天,服务端负责验证用户信息并转发消息。 **项目亮点**: - **C/S架构**:客户端与服务端通过TCP连接通信。 - **多线程**:采用多线程处理多个客户端的并发请求,确保实时交互。 - **IO流**:使用BufferedReader和BufferedWriter进行数据传输,确保高效稳定的通信。 - **线程安全**:通过同步代码块和锁机制保证共享数据的安全性。
689 23