[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();
相关文章
|
1月前
|
存储 安全 Java
🌟Java零基础-反序列化:从入门到精通
【10月更文挑战第21天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
79 5
|
1月前
|
存储 缓存 安全
🌟Java零基础:深入解析Java序列化机制
【10月更文挑战第20天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
29 3
|
1月前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
2月前
|
存储 缓存 安全
在Java的Map家族中,HashMap和TreeMap各具特色
【10月更文挑战第19天】在Java的Map家族中,HashMap和TreeMap各具特色。HashMap基于哈希表实现,提供O(1)时间复杂度的高效操作,适合性能要求高的场景;TreeMap基于红黑树,提供O(log n)时间复杂度的有序操作,适合需要排序和范围查询的场景。两者在不同需求下各有优势,选择时需根据具体应用场景权衡。
36 2
|
3月前
|
JSON NoSQL Java
redis的java客户端的使用(Jedis、SpringDataRedis、SpringBoot整合redis、redisTemplate序列化及stringRedisTemplate序列化)
这篇文章介绍了在Java中使用Redis客户端的几种方法,包括Jedis、SpringDataRedis和SpringBoot整合Redis的操作。文章详细解释了Jedis的基本使用步骤,Jedis连接池的创建和使用,以及在SpringBoot项目中如何配置和使用RedisTemplate和StringRedisTemplate。此外,还探讨了RedisTemplate序列化的两种实践方案,包括默认的JDK序列化和自定义的JSON序列化,以及StringRedisTemplate的使用,它要求键和值都必须是String类型。
redis的java客户端的使用(Jedis、SpringDataRedis、SpringBoot整合redis、redisTemplate序列化及stringRedisTemplate序列化)
|
2月前
|
存储 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第9天】在Java的世界里,对象序列化是连接数据持久化与网络通信的桥梁。本文将深入探讨Java对象序列化的机制、实践方法及反序列化过程,通过代码示例揭示其背后的原理。从基础概念到高级应用,我们将一步步揭开序列化技术的神秘面纱,让读者能够掌握这一强大工具,以应对数据存储和传输的挑战。
|
2月前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第3天】在Java编程的世界里,对象序列化与反序列化是实现数据持久化和网络传输的关键技术。本文将深入探讨Java序列化的原理、应用场景以及如何通过代码示例实现对象的序列化与反序列化过程。从基础概念到实践操作,我们将一步步揭示这一技术的魅力所在。
|
2月前
|
消息中间件 存储 Java
大数据-58 Kafka 高级特性 消息发送02-自定义序列化器、自定义分区器 Java代码实现
大数据-58 Kafka 高级特性 消息发送02-自定义序列化器、自定义分区器 Java代码实现
55 3
|
2月前
|
分布式计算 资源调度 Hadoop
Hadoop-10-HDFS集群 Java实现MapReduce WordCount计算 Hadoop序列化 编写Mapper和Reducer和Driver 附带POM 详细代码 图文等内容
Hadoop-10-HDFS集群 Java实现MapReduce WordCount计算 Hadoop序列化 编写Mapper和Reducer和Driver 附带POM 详细代码 图文等内容
104 3
|
2月前
|
Java 数据库 对象存储
Java 序列化详解
本文详细解析了Java序列化的概念与应用。通过具体实例,深入探讨了其在对象存储和传输中的作用及实现方法,帮助读者理解如何有效利用这一特性来简化数据交换,并对其实现机制有了更深入的认识。
55 9