IO流的转换流

目录

​编辑

转换流

利用转换流按照指定字符编码读取

利用转换流按照指定字符编码写出 

将本地文件中的GBK文件。转成UTF-8 

练习

序列化流 

反序列化流 /对象操作输入流

序列化流/反序列化流的细节

练习 


转换流

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

字符转换输入流:InputStreamReader
字符转换输出流:0utputStreamWriter 

下面我们来看个例子👇

利用转换流按照指定字符编码读取

这是GBK文件 

 

package convertstream;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class ConvertStreamDemo1 {

    public static void main(String[] args) throws IOException {
        InputStreamReader isr=new InputStreamReader(new FileInputStream("..\\Myio\\a.txt"),"GBK");
        //读取资源
        int ch;
        while((ch=isr.read())!=-1){
            System.out.print((char)ch);
        }
        //释放资源
        isr.close();
    }
}

 

在jdk11:这种方法被淘汰了

我们用下面的替代方案

package convertstream;


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

import java.nio.charset.Charset;

public class ConvertStreamDemo1 {

    public static void main(String[] args) throws IOException {
        FileReader fr=new FileReader("..\\Myio\\a.txt", Charset.forName("GBK"));
        //读取资源
        int ch;
        while((ch=fr.read())!=-1){
            System.out.print((char)ch);
        }
        //释放资源
        fr.close();
    }
}

利用转换流按照指定字符编码写出 

package convertstream;

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

import java.io.OutputStreamWriter;

public class ConvertStreamDemo2 {
    public static void main(String[] args) throws IOException {
        OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("..\\Myio\\d.txt"),"GBK");
        //写出数据
        osw.write("你好你好");
        //释放资源
        osw.close();
    }
}

 

 就可以查看写出的数据

下面为替代方法 

package convertstream;


import java.io.FileWriter;
import java.io.IOException;


import java.nio.charset.Charset;

public class ConvertStreamDemo2 {
    public static void main(String[] args) throws IOException {
        FileWriter fw=new FileWriter("..\\Myio\\d.txt", Charset.forName("GBK"));
        //写出数据
        fw.write("你好你好");
        //释放资源
        fw.close();
    }
}

将本地文件中的GBK文件。转成UTF-8 

jdk11以前的方案👇

package convertstream;

import java.io.*;

public class ConvertStreamDemo3 {
    public static void main(String[] args) throws IOException {
        InputStreamReader isr=new InputStreamReader(new FileInputStream("..\\Myio\\a.txt"),"GBK");
        OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("..\\Myio\\d.txt"),"UTF-8");
        int a;
        while ((a=isr.read())!=-1){
            osw.write(a);
        }
        //释放资源
        osw.close();
        isr.close();
    }
}

 

替代方案👇 

package convertstream;

import java.io.*;
import java.nio.charset.Charset;

public class ConvertStreamDemo3 {
    public static void main(String[] args) throws IOException {
        
        FileReader fr=new FileReader("..\\Myio\\a.txt", Charset.forName("GBK"));
        FileWriter fw=new FileWriter("..\\Myio\\d.txt",Charset.forName("UTF-8"));
        int a;
        while ((a=fr.read())!=-1){
            fw.write(a);
        }
        //释放资源
        fw.close();
        fr.close();
    }
}

运行结果都是一样的

练习

利用字节流读取文件中的数据,每次读一整行,面且不能出现乱码

package convertstream;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class ConvertStreamDemo4 {
    public static void main(String[] args) throws IOException {
        InputStreamReader isr=new InputStreamReader(new FileInputStream("..\\Myio\\d.txt"));
        BufferedReader br=new BufferedReader(isr);
        String line;
        while((line=br.readLine())!=null) {
            System.out.println(line);
        }
        br.close();
    }
}

还可以给创建对象的合并在一起👇

序列化流 

序列化流/对象操作输出流

可以把Java中的对象写到本地文件中

构造方法:
public objectoutputstream(outputstream out)        把基本流包装成高级流

成员方法:
public final void writeobject(object obj)                把对象序列化(写出)到文件中去

利用序列化流/对象操作输出流,把一个对象写到本地文件中👇

先写Student类

package objectstream;



public class Student {
    private String name;
    private Integer age;

    public Student() {
    }

    public Student(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return age
     */
    public Integer getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(Integer age) {
        this.age = age;
    }

    public String toString() {
        return "Student{name = " + name + ", age = " + age + "}";
    }
}

 再写测试类

package objectstream;

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

public class ObjectStreamDemo1 {
    public static void main(String[] args) throws IOException {
        //创建学生对象
        Student stu=new Student("张三",18);
        ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("..\\Myio\\a.txt"));
        //写出数据    
        oos.writeObject(stu);
        //释放资源
        oos.close();
    }
}

 使用对象输出流将对象保存到文件时会出现NotserializableException异常

解决方案:需要让Javabean类实现Serializable接口 

Serializable接口里面是没有抽象方法,标记型接口

一旦实现了这个接口,那么就表示当前的student类可以被序列化

修改后的Student类:

package objectstream;

import java.io.Serializable;

public class Student implements Serializable {
    private String name;
    private Integer age;

    public Student() {
    }

    public Student(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return age
     */
    public Integer getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(Integer age) {
        this.age = age;
    }

    public String toString() {
        return "Student{name = " + name + ", age = " + age + "}";
    }
}

反序列化流 /对象操作输入流

可以把序列化到本地文件中的对象,读取到程序中来 

构造方法
public objectInputstream(Inputstream out)                把基本流变成高级流

成员方法
public object readobject()                把序列化到本地文件中的对象,读取到程序中来

package objectstream;

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

public class ObjectStreamDemo2 {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        ObjectInputStream ois=new ObjectInputStream(new FileInputStream("..\\Myio\\a.txt"));
        Object o = ois.readObject();
        System.out.println(o);
        ois.close();
    }
}

 

序列化流/反序列化流的细节

先序列化流将数据写到本地文件当中 

如果现在在Student类里加上👇

这个时候运行反序列化流就会出现报错

文件中的版本号,跟lavabean的版本号不匹配

我们可以复制Serializable,在setting里粘贴进去

勾选标红线的两个,再Apply->OK

 再回到Student中,贯标放到Student上Alt+回车,让idea帮我们添加

这个时候再执行一遍上述的添加address的操作,也就不会报错 

如果一个对象中的某个成员变量的值不想被序列化,又该如何实现呢?

重新写一下Student类

package objectstream;



import java.io.Serial;
import java.io.Serializable;

public class Student implements Serializable {


    @Serial
    private static final long serialVersionUID = 348569226864978244L;
    private String name;
    private Integer age;
    private String address;


    public Student() {
    }

    public Student( String name, Integer age, String address) {
        this.name = name;
        this.age = age;
        this.address = address;
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return age
     */
    public Integer getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(Integer age) {
        this.age = age;
    }

    /**
     * 获取
     * @return address
     */
    public String getAddress() {
        return address;
    }

    /**
     * 设置
     * @param address
     */
    public void setAddress(String address) {
        this.address = address;
    }

    public String toString() {
        return "Student{" + serialVersionUID + ", name = " + name + ", age = " + age + ", address = " + address + "}";
    }
}

这个时候我不想序列化address

可以在前面加上transient关键字

 这个时候执行一遍

address不参与序列化

  • 使用序列化流将对象写到文件时,需要让Javabean类实现Serializable接口,否则,会出现NotSerializableException异常
  • 序列化流写到文件中的数据是不能修改的,一旦修改就无法再次读回来了
  • 序列化对象后,修改了Javabean类,再次反序列化,会不会有问题?会出问题,会抛出InvalidclassException异常解决方案:给Javabean类添加serialVersionUID(列号、版本号)
  • 如果一个对象中的某个成员变量的值不想被序列化,又该如何实现呢?

                解决方案:给该成员变量加transient关键字修饰该关键字标记的成员变量不参与序列化过程

练习 

将多个自定义对象序列化到文件中。但是对象的个数不确定,该如何操作呢?

Student类

package convertstream;

import java.io.Serial;
import java.io.Serializable;

public class Student implements Serializable {
    @Serial
    private static final long serialVersionUID = 3771817918770415923L;
    private String name;
    private Integer age;

    public Student() {
    }

    public Student(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return age
     */
    public Integer getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(Integer age) {
        this.age = age;
    }

    public String toString() {
        return "Student{name = " + name + ", age = " + age + "}";
    }
}

序列化流:

package convertstream;

import java.io.*;
import java.util.ArrayList;

public class ConvertStreamTest1 {
    public static void main(String[] args) throws IOException {
        Student s1=new Student("张三",18);
        Student s2=new Student("李四",20);
        Student s3=new Student("王五",19);
        ArrayList<Student>list=new ArrayList<>();
        list.add(s1);
        list.add(s2);
        list.add(s3);
        ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("..\\Myio\\a.txt"));
        oos.writeObject(list);
        oos.close();
    }
}

 反序列化流

package convertstream;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.ArrayList;

public class ConvertStreamTest2 {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        ObjectInputStream ois=new ObjectInputStream(new FileInputStream("..\\Myio\\a.txt"));
        ArrayList<Student>list = (ArrayList<Student>)ois.readObject();
        for (Student student : list) {
            System.out.println(student);
        }
        ois.close();
    }
}


转换流与序列化流就说到这里啦

努力遇见更好的自己!!!

 

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

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

相关文章

QWidget 属性——windowTitle·windowIcon·qrc

&#x1f40c;博主主页&#xff1a;&#x1f40c;​倔强的大蜗牛&#x1f40c;​ &#x1f4da;专栏分类&#xff1a;QT ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 文章目录 一、windowTitle二、windowIcon三、qrc 一、windowTitle windowTitle 是一个通常用于表示窗口标题…

金融科技企业如何提高服务效率

一、引言 在金融科技&#xff08;FinTech&#xff09;领域&#xff0c;服务效率是企业竞争力的重要组成部分。随着科技的不断进步和市场竞争的加剧&#xff0c;金融科技企业必须不断提升服务效率&#xff0c;以满足客户需求&#xff0c;赢得市场份额。本文将从多个角度详细阐述…

AB测试学习(附有相关代码)

目录 一、基本概念1. 定义2. 作用3. 原理 二、实验基本原则三、实验步骤四、实验步骤详解1. 确定实验目的2. 确定实验变量3. 实验指标设计3.1 实验指标类型&#xff08;按作用区分&#xff09;3.1.1 核心指标3.1.2 驱动指标&#xff08;跟踪指标&#xff09;3.1.3 护栏指标 3.2…

pycharm爬取BOSS直聘岗位信息

编译器&#xff1a;Pycharm 效果展示如图 简单原理描述&#xff1a;模拟人工动作爬取页面信息&#xff0c;运行脚本后代码自动打开浏览器获取相关信息&#xff0c;模拟人工进行页面跳转并自动抓取页面信息记录到表格中。 深入原理描述&#xff1a;页面翻转的时候会调用接口&am…

Pixi.js学习 (四)鼠标跟随、元素组合与图片位控

目录 一、鼠标移动跟随 1.1 获取鼠标坐标 1.2 鼠标跟随 二、锚点、元素组合 2.1 锚点 2.2 元素组合 三、图片图层 四、实战 例题一&#xff1a;完成合金弹头人物交互 例题二&#xff1a;反恐重击瞄准和弹痕 例题一代码&#xff1a; 例题二代码&#xff1a; 总结 前言 为了提高作…

【会议征稿,五大海内外高校支持】第四届经济发展与商业文化国际学术会议(ICEDBC2024,6月21-23)

第四届经济发展与商业文化国际学术会议&#xff08;ICEDBC2024&#xff09;将于2024年6月21-23日在中国大连隆重召开。会议主要围绕“经济发展”“商业文化”等研究领域展开讨论。 旨在为经济&#xff0c;商业的专家学者及企业发展人提供一个分享研究成果、讨论存在的问题与挑战…

调整SinoDB数据库日志模式

在数据库上线后&#xff0c;可能需要变更数据库的日志模式&#xff0c;这可能是由于业务变更或性能调整等原因引起的。数据库日志模式的变更可能涉及单一实例环境或高可用集群环境。本文将介绍如何调整SinoDB数据库的日志模式。 1、 停止应用程序 在修改数据库日志模式之前&am…

Spring 中使用MyBatis

一、Mybatis 的作用 1、MyBatis&#xff08;前身为iBatis&#xff09;是一个开源的Java持久层框架&#xff0c;它主要用于与数据库交互&#xff0c;帮助开发者更轻松地进行数据库操作。 持久层&#xff1a;指的是就是数据访问层(dao)&#xff0c;是用来操作数据库的。 2、MyB…

【BIM+GIS】Supermap优化BIM模型

文章目录 一、生成缓存二、实例化一、生成缓存 第一步:导出Revit模型 第二步:加载模型 第三步:生成缓存 第四步:添加到场景 二、实例化 实例化技术适用于重复模型较多的情况,可以实现对相同的几何模型只绘制一次,降低了显卡等硬件设备的压力。例如,一幢房屋中存在大量…

C++ day6 练习

#include <iostream>using namespace std;class Animal { private:string name; public:Animal(){}Animal(string name):name(name){}virtual void perform(){cout << "我是" << name <<endl;} };class Lion:public Animal { private:string…

Deploy Kafka for Centos 7

应用介绍 Kafka是由Apache软件基金会开发的一个开源流处理平台&#xff0c;由Scala和Java编写&#xff0c;用于处理消费者在网站中的所有动作流数据。 Kafka是一种高吞吐量的分布式发布订阅消息系统&#xff0c;它可以处理消费者在网站中的所有动作流数据&#xff0c;这些数据…

filezilla-server 1.8.1 设置

filezilla-server 1.8.1 设置&#xff1a; 1. 2. 3. 4. 其他不用配置&#xff0c; 5. 6. 7. 8. 9. 如果外网连不上 filezilla-server 提示无法连接到服务器&#xff0c; 多半是 filezilla-server 所在的电脑没有通过防火墙允许&#xff0c;打开 Windows defender 防…

最短路径Dijkstra算法详解

目录 最短距离问题 最短路径问题 进阶--标尺增多 升级方法 例题应用 最短距离问题 Dijkstra算法的策略&#xff1a; 设置集合S存放已被访问的顶点&#xff0c;然后执行n次下面的两个步骤&#xff08;n为顶点个数&#xff09;&#xff1a; &#xff08;1&#xff09;每次…

c++中string用法详解

目录 二、案例需求 三、案例实现 1.首先获取strData中的角色数量 2.创造结构体数组&#xff0c;定义两个索引值 3.循环遍历对结构体User中的Id和Exp进行赋值 4.对结构体数组userArr进行排序 5.展示结果以及最终代码 ​四、最后 一、前言 在C中&#xff0c;std::string …

webshell三巨头 综合分析(蚁剑,冰蝎,哥斯拉)

考点: 蚁剑,冰蝎,哥斯拉流量解密 存在3个shell 过滤器 http.request.full_uri contains "shell1.php" or http.response_for.uri contains "shell1.php" POST请求存在明文传输 ant 一般蚁剑执行命令 用垃圾字符在最开头填充 去掉垃圾字符直到可以正常bas…

STM32MP135裸机编程:配置RCC,修改主频到1GHz

0 工具准备 STM32CubeMX v6.11.1 STM32CubeIDE v1.15 STM32CubeProgrammer v2.16.0 STM32MP13xx参考手册 STM32MP13勘误手册 STM32MP135AD数据手册 正点原子stm32MP135开发板 1 确认时钟源 本例使用的时钟源均由外部晶振提供&#xff0c;分别是24MHz的HSE、32.768KHz的LSE。原…

服务器制作RAID磁盘阵列并管理

1. 规划节点 主机规划 IP主机名节点192.168.100.10localhost控制节点 2. 基础准备 使用VMWare Workstation软件安装CentOS 7.2操作系统&#xff0c;镜像使用提供的 CentOS-7-x86_64-DVD-1511.iso&#xff0c;并添加4块20 GB硬盘。YUM源使用提供的 mdadm_yum文件夹。 1. 创…

R可视化:ggpubr包学习

欢迎大家关注全网生信学习者系列&#xff1a; WX公zhong号&#xff1a;生信学习者 Xiao hong书&#xff1a;生信学习者 知hu&#xff1a;生信学习者 CDSN&#xff1a;生信学习者2 介绍 ggpubr是我经常会用到的R包&#xff0c;它傻瓜式的画图方式对很多初次接触R绘图的人来…

Thinkphp一文鸡富贵鸡玫瑰庄园富农场仿皮皮果理财农场源码

Thinkphp一文鸡富贵鸡玫瑰庄园富农场仿皮皮果理财农场源码&#xff0c;喜欢的朋友可以下载研究 一文鸡富贵鸡玫瑰庄园富农场仿皮皮果理财农场源码

什么是自适应滤波器?

一、自适应滤波器 自适应滤波器是一种能够自动调整其滤波参数以匹配输入信号特性变化的滤波器&#xff0c;主要用于信号处理中选择性地通过特定频率范围内的信号&#xff0c;同时抑制其他频率成分。自适应滤波器主要有几种&#xff1a; LMS (Least Mean Squares) 自适应滤波器…