IO流---缓冲流,转换流,打印流,序列化流

news2025/8/17 13:05:16

缓冲流

缓冲流(Buffered Stream)也被称为高效流,它是对基本的字节字符流进行增强的一种流。通过缓冲流,可以提高数据的读写能力。

在创建缓冲流对象时,会创建一个内置的默认大小的缓冲区数组。通过对缓冲区的读写,可以减少系统的IO次数,从而提高读写的效率。

Java中提供了多种缓冲流类,包括BufferedReader、BufferedWriter、BufferedInputStream和BufferedOutputStream。这些类分别对应于不同类型的I/O操作:

  • BufferedReader 和 BufferedWriter 是字符缓冲流,分别用于字符输入和输出。
  • BufferedInputStream 和 BufferedOutputStream 是字节缓冲流,分别用于字节输入和输出。
字节缓冲流

实例

通过字节缓存流来提高读写效率

import java.io.*;

public class IOLearn3 {
    public static void main(String[] args) throws Exception {
        //创建一个FileInputStream对象
        InputStream fileInputStream = new FileInputStream("C:\\Users\\bumiexiguang\\OneDrive\\桌面\\lambada\\a.txt");
        //缓冲输入流包装原始的字节输入流
        BufferedInputStream bufferedInputStream=new BufferedInputStream(fileInputStream);
        //创建文件输出流对象
        OutputStream fileOutputStream = new FileOutputStream("C:\\Users\\bumiexiguang\\OneDrive\\桌面\\lambada\\b.txt");
        //缓冲输出流包装原始的字节输出流
        BufferedOutputStream bufferedOutputStream=new BufferedOutputStream(fileOutputStream);
        //读取a.txt文件中的数据写入到b.txt中
        int data;
        while ((data=bufferedInputStream.read())!=-1){
            bufferedOutputStream.write(data);
        }
        //关闭流
        bufferedOutputStream.close();
        bufferedInputStream.close();
        fileOutputStream.close();
        fileInputStream.close();

    }
}
字符缓冲流
实例

通过字符缓冲流提高读写效率

import java.io.*;

public class IOLearn6 {
    public static void main(String[] args) throws Exception {
        //创建字符输入管道
        FileReader fileReader=new FileReader("C:\\Users\\bumiexiguang\\OneDrive\\桌面\\lambada\\a.txt");
        //字符缓冲流包装原始字符流
        BufferedReader bufferedReader=new BufferedReader(fileReader);
        //创建字符输出管道
        FileWriter fileWriter=new FileWriter("C:\\Users\\bumiexiguang\\OneDrive\\桌面\\lambada\\b.txt");
        //字符缓冲输出流包装原始字符输出流、
        BufferedWriter bufferedWriter=new BufferedWriter(fileWriter);
        int data;
        while((data=bufferedReader.read())!=-1){
            bufferedWriter.write(data);
        }
        //关闭流
        bufferedWriter.close();
        bufferedReader.close();
        fileWriter.close();
        fileReader.close();
    }
}

关闭流的两种方式

改写字符缓冲流的实例

1.try-catch-finally
import java.io.*;

public class IOLearn6 {
    public static void main(String[] args) throws IOException {
        FileReader fileReader=null;
        BufferedReader bufferedReader=null;
        FileWriter fileWriter=null;
        BufferedWriter bufferedWriter=null;
        try{
            //创建字符输入管道
            fileReader=new FileReader("C:\\Users\\bumiexiguang\\OneDrive\\桌面\\lambada\\a.txt");
            //字符缓冲流包装原始字符流
            bufferedReader=new BufferedReader(fileReader);
            //创建字符输出管道
            fileWriter=new FileWriter("C:\\Users\\bumiexiguang\\OneDrive\\桌面\\lambada\\b.txt");
            //字符缓冲输出流包装原始字符输出流、
            bufferedWriter=new BufferedWriter(fileWriter);
            int data;
            while((data=bufferedReader.read())!=-1){
                bufferedWriter.write(data);
            }
        }catch (IOException e){
            e.printStackTrace();
        }finally {
            //关闭流
            bufferedWriter.close();
            bufferedReader.close();
            fileWriter.close();
            fileReader.close();
        }


    }
}
2.try-with-resource

import java.io.*;

public class IOLearn6 {
    public static void main(String[] args) throws Exception {

        try(  //创建一个FileInputStream对象
              InputStream fileInputStream = new FileInputStream("C:\\Users\\bumiexiguang\\OneDrive\\桌面\\lambada\\a.txt");
              //缓冲输入流包装原始的字节输入流
              BufferedInputStream bufferedInputStream=new BufferedInputStream(fileInputStream);
              //创建文件输出流对象
              OutputStream fileOutputStream = new FileOutputStream("C:\\Users\\bumiexiguang\\OneDrive\\桌面\\lambada\\b.txt");
              //缓冲输出流包装原始的字节输出流
              BufferedOutputStream bufferedOutputStream=new BufferedOutputStream(fileOutputStream);){


            //读取a.txt文件中的数据写入到b.txt中
            int data;
            while ((data=bufferedInputStream.read())!=-1){
                bufferedOutputStream.write(data);
            }

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




    }
}

字符转换流(解决不同编码情况下,读取字符乱码问题)

解决步骤:获取原始字节输入流,通过指定的字符集转换成字符输入流

字符转换流(Character Conversion Streams)在Java的I/O库中指的是那些能够在字节流和字符流之间进行转换的流。字符流(如Reader和Writer)处理的是char类型的数据,而字节流(如InputStream和OutputStream)处理的是byte类型的数据。当你要在字节流和字符流之间进行转换时,就需要使用字符转换流。

Java提供了几个类来实现这种转换,其中最常用的是InputStreamReaderOutputStreamWriter。这些类允许你把字节流转换为字符流,或者把字符流转换为字节流。

实例一

将a.txt以GBK字符集读取

import java.io.*;

public class IOLearn7 {
    public static void main(String[] args) throws Exception {

        try(  //创建一个FileInputStream对象
              InputStream fileInputStream = new FileInputStream("C:\\Users\\bumiexiguang\\OneDrive\\桌面\\lambada\\a.txt");
              //将字节输入流转换成指定字符集的字符输入流
              InputStreamReader inputStreamReader=new InputStreamReader(fileInputStream,"GBK");

              ){
            //读取a.txt文件中的数据
            int data;
            while ((data=inputStreamReader.read())!=-1){
                System.out.print((char)data);
            }

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




    }
}

结果:

实例二

将a.txt(GBK编码)中的数据写入到b.txt(UTF-8编码)

import java.io.*;

public class IOLearn7 {
    public static void main(String[] args) throws Exception {

        try(  //创建一个FileInputStream对象
              InputStream fileInputStream = new FileInputStream("C:\\Users\\bumiexiguang\\OneDrive\\桌面\\lambada\\a.txt");
              //将字节输入流转换成指定字符集的字符输入流
              InputStreamReader inputStreamReader=new InputStreamReader(fileInputStream,"GBK");

              //创建字节输出流
              OutputStream outputStream=new FileOutputStream("C:\\Users\\bumiexiguang\\OneDrive\\桌面\\lambada\\b.txt");
              //将字节输出流转换成指定字符集的字符输出流
              OutputStreamWriter outputStreamWriter=new OutputStreamWriter(outputStream, "UTF-8");

              ){
            //读取a.txt文件中的数据
            int data;
            while ((data=inputStreamReader.read())!=-1){
                //它会将字符编码为字节,并将这些字节存储在缓冲区中。
                outputStreamWriter.write(data);
            }

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




    }
}

打印流

打印流(Print Stream)**在Java中,特指PrintStream和PrintWriter这两个类,它们主要用于方便地打印各种数据值的表现形式到指定的输出目标,如控制台、文件等。

  1. PrintStream:这是字节打印流,继承自OutputStream,主要用于写字节数据。它提供了print和println方法,可以打印数据并自动进行换行。创建PrintStream对象时,可以指定目标输出,例如文件或OutputStream。
  2. PrintWriter:这是字符打印流,继承自Writer,主要用于写字符数据。与PrintStream类似,它也提供了print和println方法。当启用自动刷新时,调用println、printf或format方法会立即刷新输出
实例一
import java.io.IOException;
import java.io.PrintStream;

public class IOlearn8 {
    public static void main(String[] args) {
        try (PrintStream printStream = new PrintStream("C:\\Users\\bumiexiguang\\OneDrive\\桌面\\lambada\\src\\print.txt");

        ){  
            System.setOut(printStream);//指定打印流对象
            System.out.println("test printStream");//打印到文件中
        }catch (IOException e){
            e.printStackTrace();
        }


    }
}

结果

实例二
import java.io.IOException;
import java.io.PrintStream;
import java.io.PrintWriter;

public class IOlearn8 {
    public static void main(String[] args) {
        try (PrintWriter printWriter = new PrintWriter("C:\\Users\\bumiexiguang\\OneDrive\\桌面\\lambada\\src\\print.txt");

        ){
            printWriter.println("test1");
            printWriter.println("test2");
            printWriter.println("test3");
        }catch (IOException e){
            e.printStackTrace();
        }


    }
}

序列化流

序列化流在Java中指的是将对象的状态转换为可以存储或传输的形式的过程,以及随后将这个形式的数据恢复为对象的过程。这个过程涉及到两个核心的概念:序列化和反序列化。

**序列化(Serialization)**是将对象的状态转换为字节流的过程,这样可以将对象的状态保存到磁盘、数据库或通过网络发送到另一台机器。序列化流就是用于执行这个转换过程的输出流。

**反序列化(Deserialization)**则是将之前序列化保存的字节流恢复为对象的过程。反序列化流是用于执行这个恢复过程的输入流。

在Java中,要实现对象的序列化,需要让类实现Serializable接口。这个接口是一个标记接口,没有任何方法需要实现,它仅仅是一个标识符,告诉Java运行时系统这个类的对象可以被序列化。

Java提供了ObjectOutputStream类来执行序列化操作,它可以将对象序列化到输出流中。同时,ObjectInputStream类用于执行反序列化操作,它可以从输入流中读取序列化数据并创建对象。

下面是一个简单的例子,展示了如何使用ObjectOutputStream和ObjectInputStream进行序列化和反序列化:

import java.io.*;  
  
// 假设有一个类Person实现了Serializable接口  
class Person implements Serializable {  
    private String name;  
    private int age;  
  
    // 构造方法、getter和setter方法  
    // ...  
}  
  
public class SerializationExample {  
    public static void main(String[] args) {  
        try {  
            // 序列化对象到文件  
            Person person = new Person("Alice", 30);  
            FileOutputStream fos = new FileOutputStream("person.ser");  
            ObjectOutputStream oos = new ObjectOutputStream(fos);  
            oos.writeObject(person);  
            oos.close();  
  
            // 从文件中反序列化对象  
            FileInputStream fis = new FileInputStream("person.ser");  
            ObjectInputStream ois = new ObjectInputStream(fis);  
            Person deserializedPerson = (Person) ois.readObject();  
            ois.close();  
  
            // 输出反序列化后的对象信息  
            System.out.println("Deserialized Person:");  
            System.out.println("Name: " + deserializedPerson.getName());  
            System.out.println("Age: " + deserializedPerson.getAge());  
  
        } catch (IOException | ClassNotFoundException e) {  
            e.printStackTrace();  
        }  
    }  
}

在这个例子中,Person类实现了Serializable接口,因此可以被序列化。ObjectOutputStream用于将Person对象序列化到文件person.ser中,而ObjectInputStream则用于从该文件中反序列化对象。注意,序列化时可能会 抛出IOException,反序列化时可能会抛出IOException和ClassNotFoundException,因此需要进行适当的异常处理。

IO流体系

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

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

相关文章

【Windows】删除 VHD 虚拟磁盘时提示“文件已在 System 中打开”的解决方法

一、原因 正如显示的那样,虚拟磁盘仍在被系统占用。因此我们需要断开磁盘与系统的连接。 二、解决方法 1. 在“开始”菜单中搜索“磁盘管理”,选择“创建并格式化硬盘分区”。 2. 右键点击需要删除的虚拟磁盘,选择“分离 VHD”。 3. 点击“…

OpenAI 发布文生视频大模型 Sora,AI 视频要变天了,视频创作重新洗牌!AGI 还远吗?

一、一觉醒来,AI 视频已变天 早上一觉醒来,群里和朋友圈又被刷屏了。 今年开年 AI 界最大的震撼事件:OpenAI 发布了他们的文生视频大模型 Sora。 OpenAI 文生视频大模型 Sora 的横空出世,预示着 AI 视频要变天了,视…

概率基础——二项分布

概率基础——二项分布 介绍 在统计学中,二项分布是一种离散型概率分布,它描述了在一系列独立同分布的伯努利试验中成功的次数。这里我们以抛硬币为例,将一个硬币抛掷 n n n次,每次抛掷结果为正面向上的概率为 p p p,…

鸿蒙开发系列教程(二十四)--List 列表操作(3)

列表编辑 1、新增列表项 定义列表项数据结构和初始化列表数据,构建列表整体布局和列表项。 提供新增列表项入口,即给新增按钮添加点击事件。 响应用户确定新增事件,更新列表数据。 2、删除列表项 列表的删除功能一般进入编辑模式后才可…

《Go 简易速速上手小册》第9章:数据库交互(2024 最新版)

文章目录 9.1 连接数据库 - Go 语言的海底宝藏之门9.1.1 基础知识讲解安装数据库驱动数据库连接 9.1.2 重点案例:用户信息管理系统准备数据库Go 代码实现连接数据库添加新用户查询用户信息用户登录验证主函数 9.1.3 拓展案例 1:批量添加用户准备数据库Go…

【IIS中绑定SSL证书】

下载SSL证书: 打开服务器IIS: 点击导入 在IIS中新增网站:

Sentinel注解@SentinelResource详解

Sentinel注解SentinelResource详解 熔断 针对访问超过限制【sentinel中配置的限制】的资源,通过java代码配置,返回一个自定义的结果,需要用到 SentinelResource 注解的 blockHandlerClass 和 blockHandler 属性。 blockHandlerClass&#…

防御保护--内容安全过滤

目录 文件过滤 内容过滤技术 邮件过滤技术 应用行为控制技术 DNS过滤 URL过滤 防火墙 ---- 四层会话追踪技术 入侵防御 ---- 应用层深度检测技术 深度包检测深度流检测 随着以上俩种的成熟与完善,提出了所谓的内容安全过滤 当然上网行为确实需要治理&…

反转链表【基础算法精讲 06】

视频地址 反转链表【基础算法精讲 06】_哔哩哔哩_bilibili 概念 链表的每一个结点都包含节点值 和1指向下一个结点的next指针 , 链表的最后一个结点指向空; 206 . 反转链表 用cur记录当前遍历到的结点 , 用pre表示下一个结点 , 用nxt表示cur的下一个…

Windows 编译 yangfengzzz/fluid-engine-OpenVDB

我想将 OpenVDB 接入 doyubkim 的流体引擎 https://github.com/doyubkim/fluid-engine-dev 然后搜到已经有人做过这件事了 https://github.com/yangfengzzz/fluid-engine-OpenVDB Windows 编译 yangfengzzz/fluid-engine-OpenVDB 但是我是 windows,所以想要编译…

代码随想录算法训练营第三二天 | 买卖股票、跳跃游戏

目录 买卖股票的最佳时机II跳跃游戏跳跃游戏ii LeetCode 122.买卖股票的最佳时机II LeetCode 55. 跳跃游戏 LeetCode 45.跳跃游戏II 买卖股票的最佳时机II 只有一只股票! 当前只有买股票或者卖股票的操作。 最终利润是可以分解的:把利润分解为每天为…

【机器学习】机器学习常见算法详解第4篇:KNN算法计算过程(已分享,附代码)

本系列文章md笔记(已分享)主要讨论机器学习算法相关知识。机器学习算法文章笔记以算法、案例为驱动的学习,伴随浅显易懂的数学知识,让大家掌握机器学习常见算法原理,应用Scikit-learn实现机器学习算法的应用&#xff0…

Vue练习1:组件开发1(头像组件)

样式预览 注释代码 <template><div class"img-box":style"{ //动态style必须为对象width: size rem,height: size rem}"><imgclass"avatar-img":src"url" //动态url/></div> </templ…

【ARM架构】ARMv8-A 系统中的安全架构概述

一个安全或可信的操作系统保护着系统中敏感的信息&#xff0c;例如&#xff0c;可以保护用户存储的密码&#xff0c;信用卡等认证信息免受攻击。 安全由以下原则定义&#xff1a; 保密性&#xff1a;保护设备上的敏感信息&#xff0c;防止未经授权的访问。有以下几种方法可以做…

算法详解:滑动窗口-- 最大连续1的个数 III

题目来源:力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 本期讲解滑动窗口经典例题,我会从三个点开始讲解题目1.题目解析2.算法原理 3.编写代码 1.题目解析 这道题目理解起来还是比较简单的,我们简单分析一下,也就是给定一个数组,数组是由1和0组成…

PLC-Recorder的延伸分析功能说明

目录 一、缘起 二、如何从PLC-Recorder获取数据 1、在线获取 2、全自主打开数据文件 3、延伸分析 三、设置方法 四、效果展示 一、缘起 在各个行业&#xff0c;在不同的场景中&#xff0c;朋友们拿到数据后&#xff0c;想做的事情五花八门&#xff0c;有做宏观分析的、…

ABC341 A-G

Toyota Programming Contest 2024#2&#xff08;AtCoder Beginner Contest 341&#xff09; - AtCoder B读不懂题卡了&#xff0c;F读假题卡了&#xff0c;开题开慢了rank了 A - Print 341 题意&#xff1a; 打印一串交替出现的包含N个0&#xff0c;N1个1的01串 代码&…

OpenCV-40 绘制直方图

一、使用matplotlib画直方图 可以利用matplotlib把OpenCV统计得到的直方图绘制出来 示例代码如下&#xff1a; import cv2 import matplotlib.pyplot as pltlena cv2.imread("beautiful women.png") # 变为黑白图片 gray cv2.cvtColor(lena, cv2.COLOR_BGR2GRAY…

视觉设计师的项目评审复盘攻略:如何提升设计质量与效率

视觉设计师的角色是至关重要的&#xff0c;以确保设计项目满足预期的质量和结果。作为一名视觉设计师&#xff0c;有必要进行定期的项目审查&#xff0c;以确保项目在正轨上进行&#xff0c;并尽早解决任何问题。在本文中我们将讨论可视化设计人员如何做好项目评审&#xff0c;…

HarmonyOS—@State装饰器:组件内状态

State装饰的变量&#xff0c;或称为状态变量&#xff0c;一旦变量拥有了状态属性&#xff0c;就和自定义组件的渲染绑定起来。当状态改变时&#xff0c;UI会发生对应的渲染改变。 在状态变量相关装饰器中&#xff0c;State是最基础的&#xff0c;使变量拥有状态属性的装饰器&a…