【进阶篇-Day14:JAVA中IO流之转换流、序列化流、打印流、Properties集合的介绍】

news2024/9/25 1:19:13

目录

  • 1、转换流
    • 1.1 转换流分类:
    • 1.2 转换流的作用
      • (1)按照指定的字符编码读写操作:
      • (2)将字节流转换为字符流进行操作:
  • 2、序列化流
    • 2.1 序列化的基本使用:
    • 2.2 序列化的操作流程:
    • 2.3 总结
    • 2.4 案例:
  • 3、打印流
    • 3.1 打印流概念
    • 3.2 打印流的使用
      • (1)PrintStream打印流:
      • (2)PrintWriter打印流:
      • (3)总结:
  • 4、Properties集合
    • 4.1 Properties介绍
    • 4.2 作为集合的使用:
    • 4.3 和IO有关的方法:
    • 4.4 总结

1、转换流

1.1 转换流分类:

在这里插入图片描述

1.2 转换流的作用

(1)按照指定的字符编码读写操作:

在这里插入图片描述

(2)将字节流转换为字符流进行操作:

在这里插入图片描述

package com.itheima.change;
import java.io.*;
public class ChangeStreamDemo1 {
    /**
     * 转换流按照指定的字符编码读写
     *
     * 构造方法:
     *         InputStreamReader(InputStream in, String CharsetName)
     *         OutputStreamWriter(OutputStream out, String CharsetName)
     */
    public static void main(String[] args) throws IOException {
        //read();
        write();
    }

    private static void write() throws IOException {
        //按照gbk编码方式写入内容,同时是追加写入
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\c.txt", true), "gbk");
        osw.write("哈哈");
        osw.close();
    }

    private static void read() throws IOException {
        //按照gbk编码方式读取内容
        InputStreamReader isr = new InputStreamReader(new FileInputStream("D:\\stu.txt"), "gbk");
        int i;
        while ((i = isr.read()) != -1){
            System.out.println((char)i);
        }
        isr.close();
    }
}

在这里插入图片描述

2、序列化流

2.1 序列化的基本使用:

在这里插入图片描述

package com.itheima.serialization;
import java.io.*;
public class SerializationDemo1 {
    /**
     * 序列化流读写对象
     *     序列化: 将对象写出到文件
     *             public ObjectOutputStream(OutputStream out)
     *     反序列化:从文件中将对象读取到程序
     *             public ObjectInputStream(InputStream in)
     */
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        //writeObject();
        readObject();
    }

    private static void readObject() throws IOException, ClassNotFoundException {
        //反序列化,即从文件中将对象读取到程序
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("stu.txt"));
        Object o = ois.readObject();
        System.out.println(o);
        //关闭流
        ois.close();
    }

    private static void writeObject() throws IOException {
        //创建一个对象
        Student s = new Student("张三", 23);
        //将对象序列化,即写入到文件中
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("stu.txt"));
        oos.writeObject(s);//调用这个方式之前,序列化的对象需要实现Serializable接口
        //关闭流
        oos.close();
    }
}

2.2 序列化的操作流程:

在这里插入图片描述

上述流程解释如下:
1、当我们要序列化对象时,首先需要对象实现Serializable接口,实现了这个接口之后,其实就会给这个对象生成一个序列化ID;
2、然后调用writeObject()方法进行序列化时,除了将对象的内容保存到文件之外,还会将这个序列化ID写入;
3、当我们调用readObject()方法进行反序列化时,会对比文件里的序列ID是否与当前程序中的对象序列化ID相等,如果相等则反序列化成功,如果不相等,则报错。
那有人就要问了,怎么会不相等呢?试想一下,如果序列化后,我们将对象增加属性或方法,那么序列化ID肯定就不相等了。
如何解决这个问题呢?

答:当我们标记一个对象需要序列化时(实现Serializable接口就是这个标记),手动指定序列化ID,那么就能解决上述问题,如下这样即可:
在这里插入图片描述

在这里插入图片描述
手动指定的序列化ID,我们可以借助idea工具实现,设置如下:

在这里插入图片描述

然后在idea中,提示快捷键alt+enter即可,或者点击提示也行。具体可以参考:使用idea自动生成序列化ID全过程

如果某一个属性不想被序列化,则需要使用transient关键字修饰,如下所示:

在这里插入图片描述

2.3 总结

在这里插入图片描述

2.4 案例:

在这里插入图片描述

package com.itheima.serialization;
import java.io.*;

public class SerializationDemo2 {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        //1、定义三个对象
        Student s1 = new Student("张三", 23);
        Student s2 = new Student("李四", 24);
        Student s3 = new Student("王五", 25);

        //2、定义输出序列化流,并执行序列化
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("序列化.txt", true));
        oos.writeObject(s1);
        oos.writeObject(s2);
        oos.writeObject(s3);
        oos.close();

        //3、定义反序列化流,并执行反序列化
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("序列化.txt"));
        while (true){
            try {
                //readObject()方法读取到末尾后,如果继续读取,则会报IOException异常
                Object o = ois.readObject();
                System.out.println(o);
            }catch (IOException e){
                break;
            }
        }
        ois.close();
    }
}

上述代码的写法,多个对象就做多少次序列化,同理,那要反序列化也需要多次。其实一般情况下,我们可以将对象存入一个集合中,然后只执行一次序列化,一次反序列化即可,如下代码:

package com.itheima.serialization;
import java.io.*;
import java.util.ArrayList;
import java.util.List;

public class SerializationDemo3 {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        //1、定义三个对象
        List<Student> list = new ArrayList<>();
        list.add(new Student("张三", 23));
        list.add(new Student("李四", 24));
        list.add(new Student("王五", 25));

        //2、定义输出序列化流,并执行序列化
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("序列化2.txt", true));
        oos.writeObject(list);//只执行一次序列化,因为List也实现了Serializable接口
        oos.close();

        //3、定义反序列化流,并执行反序列化
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("序列化2.txt"));
        List<Student> list1 = (List<Student>)ois.readObject();//只执行一次
        ois.close();

        //4、遍历打印
        for (Student student : list1) {
            System.out.println(student);
        }
    }
}

3、打印流

3.1 打印流概念

在这里插入图片描述
在这里插入图片描述

package com.itheima.print;
import java.io.PrintStream;

public class PrintDemo1 {
    /**
     * System.out.println() 打印语句的细节
     */
    public static void main(String[] args) {
        //1、获取打印流
        PrintStream out = System.out;
        //2、执行打印
        out.println("你好");
        //简化如下
        System.out.println("你好");
    }
}

3.2 打印流的使用

(1)PrintStream打印流:

标准打印流是向控制台输出,那么能不能往文件写入呢?为了解决这个问题,我们接着看,下面是打印流的三个构造方法,看例子怎么使用:
在这里插入图片描述

package com.itheima.print;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;

public class PrintDemo2 {
    /**
     * PrintStream基本使用
     *     1、创建对象关联文件
     *             public PrintStream(OutputStream os)
     *             public PrintStream(File f)
     *             public PrintStream(File f, String csn):第二个参数为指定的编码格式
     *             public PrintStream(String filepath)
     *             public PrintStream(String filepath, String csn):第二个参数为指定的编码格式
     *     2、写出方法
     *             write():   写出也给字节,不建议使用,无法原样写入
     *             print():   原样写入数据,无换行
     *             println(): 原样写入数据,带有换行
     */
    public static void main(String[] args) throws Exception {
        //method1();
        //method2();
        method3();
    }

    /**
     * 不带编码格式的打印流
     */
    private static void method1() throws Exception {
        //1、定义打印流
        PrintStream ps = new PrintStream("打印流.txt");
        //2、写入文件
        ps.write(97);//不能保证原样写入,不建议使用
        ps.println(97);//原样写入数据,带有换行
        ps.print(97);//原样写入数据,无换行
        ps.close();
    }

    /**
     * 指定编码格式的打印流

     */
    private static void method2() throws Exception {
        PrintStream ps = new PrintStream("打印流.txt", "utf-8");
        ps.println("你好啊");
    }

    /**
     * 追加写入
     */
    private static void method3() throws FileNotFoundException {
        PrintStream ps = new PrintStream(new FileOutputStream("打印流.txt", true));
        ps.println("追加写入了一行");
        ps.println("追加写入了二行");
        ps.println("追加写入了三行");
    }
}

(2)PrintWriter打印流:

在这里插入图片描述

package com.itheima.print;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

public class PrintWriteDemo1 {
    /**
     * PrintWrite的使用
     */
    public static void main(String[] args) throws IOException {
        //1、基本使用
        PrintWriter pw = new PrintWriter("F.txt");
        pw.println("你好");
        pw.flush();
        pw.close();

        //2、自动刷新的使用方法:在构造方法里第二个参数写true,不调用flush或close方法,也会自动刷新
        // 注:只对println方法管用
        PrintWriter pw2 = new PrintWriter(new FileWriter("G.txt"), true);
        pw2.println("哈哈哈");
    }
}

(3)总结:

在这里插入图片描述

4、Properties集合

4.1 Properties介绍

在这里插入图片描述
在这里插入图片描述

4.2 作为集合的使用:

在这里插入图片描述

package com.itheima.properties;
import java.util.Properties;
import java.util.Set;

public class PropertiesDemo1 {
    /**
     * Properties作为集合的使用:
     *     Object setProperty(String key, String value):类似Map集合的put方法
     *     String getProperty(String key):类似Map集合的get方法
     *     Set<String> stringPropertyNames():类似Map集合的keySet方法
     */
    public static void main(String[] args) {
        Properties p = new Properties();
        //1、set方法
        p.setProperty("username", "admin");
        p.setProperty("password", "1234");
        System.out.println(p);//{password=1234, username=admin}

        //2、get方法
        Object username = p.get("username");
        Object password = p.get("password");
        System.out.println(username);//admin
        System.out.println(password);//1234

        //3、keySet方法:用于获取key组成的集合
        Set<String> keySet = p.stringPropertyNames();
        for (String s : keySet) {
            System.out.println(s + "------" + p.get(s));
        }
    }
}

4.3 和IO有关的方法:

在这里插入图片描述

package com.itheima.properties;
import java.io.*;
import java.util.Properties;
public class PropertiesDemo2 {
    /**
     * Properties 和 IO 有关的方法
     *     void load(InputStream inStream)         从输入字节流读取属性列表(键和元素对)
     *     void load(Reader reader)                 从输入字符流读取属性列表(键和元素对)
     *     void store(OutputStream outStream, String comments)    将集合的键值对写出到文件(字节流),comments是注释
     *     void store(Writer writer, String comments)             将集合的键值对写出到文件(字符流),comments是注释
     */
    public static void main(String[] args) throws IOException {
//        storeMethod();
        Properties prop = new Properties();
        //load()方法:从文件将内容读取到流中
//        FileInputStream fis = new FileInputStream("config.properties");//字节流
        FileReader fis = new FileReader("config.properties");//字符流
        prop.load(fis);
        fis.close();
        System.out.println(prop);//{password=1234, username=admin}
    }

    private static void storeMethod() throws IOException {
        Properties prop = new Properties();
        prop.setProperty("username", "admin");
        prop.setProperty("password", "1234");
        //store()方法:将内容写入文件
//        FileOutputStream fos = new FileOutputStream("config.properties");//字节流
        FileWriter fos = new FileWriter("config.properties");//字符流
        prop.store(fos, "我是注释,不想写的话可以写null");
        fos.close();
    }
}

4.4 总结

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《Token-Label Alignment for Vision Transformers》ICCV2023

摘要 这篇论文探讨了数据混合策略&#xff08;例如CutMix&#xff09;在提高卷积神经网络&#xff08;CNNs&#xff09;性能方面的有效性&#xff0c;并指出这些策略在视觉Transformer&#xff08;ViTs&#xff09;上同样有效。然而&#xff0c;发现了一个“token fluctuation…

mp3音频怎么压缩小一点?音频压缩的6个简单方法

在日常的数字生活中&#xff0c;MP3音频文件凭借其广泛的兼容性和相对较高的音质&#xff0c;已然成为了连接音乐创作者与听众之间不可或缺的桥梁。从个人音乐收藏到社交媒体分享&#xff0c;再到专业音频项目的交付&#xff0c;MP3格式以其便捷性占据了重要地位。然而&#xf…

MLP:全连接神经网络的并行执行

目录 MLP:全连接神经网络的并行执行 假设 代码解释 注意事项 MLP:全连接神经网络的并行执行 为了继续解释这段代码,我们需要做一些假设和补充,因为原始代码片段中DummyModel、Shard和mx.array的具体实现没有给出。不过,基于常见的编程模式和深度学习框架的惯例,我们…

【Linux网络】Linux网络初探:开启网络世界的大门

W...Y的主页 &#x1f60a; 代码仓库分享&#x1f495; 前言&#xff1a;我们已经系统的学习了Linux的基本操作、进程、线程、文件、通信等待&#xff0c;但是在如今社会没有网络通信方式是万万不行的&#xff0c;今天我们就走进网络中&#xff0c;系统的学习一下有关Linux网…

电脑外接设备管理软件有哪些(三款USB外设管理软件推荐)

“小张&#xff0c;你上次用U盘拷贝资料时&#xff0c;有没有担心过数据安全问题&#xff1f;” “是啊&#xff0c;李姐&#xff0c;我总感觉用U盘传文件不太放心&#xff0c;万一数据被误删或者泄露就麻烦了。” 正是这样的担忧&#xff0c;促使了电脑外接设备管理软件的出现…

让模型从Pytorch到NCNN——Pytorch模型向NCNN框架部署的小白向详细流程(PNNX模型转换、Linux模型使用)

参考文章和项目地址&#xff1a; [1] Tencent/ncnn: ncnn is a high-performance neural network inference framework optimized for the mobile platform (github.com) [2] pnnx/pnnx: PyTorch Neural Network eXchange (github.com) [3] 使用pnnx把pytorch模型转ncnn模型-CS…

重塑购车体验,实时云渲染赋能东风日产探路云看车新体验

在科技日新月异的今天&#xff0c;汽车行业正经历着前所未有的深刻变革。随着互联网、大数据、人工智能等新兴技术的深度融合&#xff0c;汽车营销策略也迎来了从传统展示到数字化体验的跨越。 消费者的购车习惯逐渐倾向于线上互动与深度体验&#xff0c;希望在线上获得线下同…

【docker】docker数据卷与网络部署服务

Docker 网络模式 选择网络模式 Host Mode (主机模式) 特点: 容器与宿主机共享网络命名空间操作: docker run --nethost ... Container Mode (容器模式) 特点: 容器与指定容器共享网络命名空间操作: docker run --netcontainer:<container-id-or-name> ... None Mode (无…

XP服务器-远程桌面连接不上

今天遇到个很奇怪的事&#xff0c;xp服务器突然远程桌面连接不上了&#xff0c;根据上网百度的结果&#xff0c;防火墙关了&#xff0c;也允许远程连接了。我之前修改过服务器的默认端口号3389&#xff0c;改为了新端口号A&#xff0c;但是当时修改完是可以正常登陆的。而且新端…

004集——静态常量和动态常量——C#学习笔记

首先普及一个小白使用的小技巧&#xff1a;tab键可以自动输出系统显示的引导字符。 常量是使用 const 关键字来定义的 。定义一个常量的语法如下&#xff1a; const <data_type> <constant_name> value; 下面的代码演示了如何在程序中定义和使用常量&#xff1…

win服务器cmd执行exe文件失败

问题场景 场景&#xff1a;用python打包的exe文件&#xff0c;在cmd下执行是没问题的&#xff0c;放到定时任务就不执行。。。动di脚本调试没问题&#xff0c;打包成exe可执行程序也能正常运行。就是放到定时任务有问题。 解决&#xff1a; 解决方案 1.打开计划任务创建计划任…

OpenGL3.3_C++_Windows(34)

demo 1 Fresnel-Schlick PBR直接光源 顾名思义&#xff1a;直接光源指有光源直接照射到点p 的辐射强度&#xff0c;由于一个光源只会有一个光线wi影响点p&#xff0c;所以和之前的计算没什么差异对于影响p的光源&#xff0c;并不需要积分计算半球形辐照度&#xff0c;遍历每个…

71 为对象定义类

① 类定义对象的特征和行为。 ② 一个 Python 类使用变量存储数据域&#xff0c;定义方法来完成动作。类就是一份契约&#xff08;有时也称之为模板或蓝本&#xff09;&#xff0c;它定义对象的数据域和方法。 ③ 对象是类的一个实例&#xff0c;可以创建一个类的多个对象。创建…

【Linux】yum软件包管理器(使用、生态、yum源切换)

目录 1.yum-软件包管理器&#x1f638;1.1yum使用方法1.2什么是yum&#xff1f;&#x1f638;1.3yum的周边生态1.4yum源切换1.4.1 查看系统本身yum源1.4.2 软件源1.4.3yum源配置 1.yum-软件包管理器 以下操作需要联网的情况下进行 &#x1f638;1.1yum使用方法 安装软件时由于需…

蜜罐——HFish使用

蜜罐——HFish的使用 一、蜜罐简介 1.1 蜜罐技术 蜜罐技术本质上是一种对攻击方进行欺骗的技术&#xff0c;通过布置一些作为诱饵的主机、网络服务或者信息&#xff0c;诱使攻击方对它们实施攻击&#xff0c;从而可以对攻击行为进行捕获和分析&#xff0c;了解攻击方所使用的…

分类预测|基于灰狼优化最小二乘支持向量机结合Adaboost集成的数据分类预测Matlab程序GWO-LSSVM-Adaboost

分类预测|基于灰狼优化最小二乘支持向量机结合Adaboost集成的数据分类预测Matlab程序GWO-LSSVM-Adaboost 文章目录 前言分类预测|基于灰狼优化最小二乘支持向量机结合Adaboost集成的数据分类预测Matlab程序GWO-LSSVM-Adaboost 一、GWO-LSSVM-Adaboost模型1. Grey Wolf Optimize…

c++基本数据类型变量的最大值,最小值和内存空间

基本数据类型有哪些&#xff1f; 在C中&#xff0c;基本数据类型主要包括以下几种&#xff1a; 整型 (Integral Types)&#xff1a; int&#xff1a;通常为32位&#xff0c;有 signed 和 unsigned 两种版本&#xff0c;如 int, unsigned int.short 或 signed short / unsigned …

sqlserver怎么做全文搜索

在SQL Server Management Studio中管理界面&#xff0c;创建表全文索引&#xff0c; 选中表&#xff0c;右键–>全文检索–>定义全文检索—>SQLServer全文检索向导 &#xff0c;然后按提示下一步&#xff0c;创建要创建索引的列&#xff0c;就是搜索数据列 创建完了使…

抗噪声最大最小值筛选

问题 在如下图所示包含一些噪声的数据队列中如何可以把绿色的&#xff08;有一个点图片上忘记标了&#xff09;几个主观认为的最大值最小值筛选出来 思路 简述&#xff1a;定义一个噪声阈值&#xff0c;如果当前比上一次超过噪声阈值才进行更新&#xff0c;如果当前比上一次的…

双11订单实时大屏 - Flink实战洞见

每年的双11购物狂欢节不仅是消费者的狂欢&#xff0c;更是技术人员展示实力的舞台。在这个全民关注的时刻&#xff0c;如何实现实时、准确、鲜活的订单数据展示&#xff0c;成为了各大电商平台技术竞技的焦点。本文将深入探讨如何利用Apache Flink构建一个面向双11的订单实时大…