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

缓冲流

缓冲流(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流体系

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

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

相关文章

JDBC教程+数据库连接池

JDBC 1.JDBC概述 ​ JDBC,全称Java数据库连接(Java DataBase Connectivity),它是使用Java语言操作关系型数据库的一套API。 ​ JDBC本质是官方(原SUN公司,现ORACLE)定义的一套操作所有关系型数…

35岁转行,是我人生中最正确的选择

前言 经常听到有人说,35岁是职场的分水岭,但我觉得我的35岁,人生才刚刚开始。 35岁前后,我生二胎,考研,跳槽,转行,从传统行业到服务业,从服务业到新能源行业&#xff0…

静态时序分析:SDC约束命令set_clock_transition详解

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 在静态时序分析:SDC约束命令create_clock详解一文的最后,我们谈到了针对理想(ideal)时钟,可以使用set_clock_transition命令直…

函数、极限、连续——刷题(3

目录 1.题目:2.解题思路和步骤:3.总结:小结: 1.题目: 2.解题思路和步骤: 3.总结: 首先还是考虑好所有情况(所有情况见:函数、极限、连续——刷题(1&#xff…

JVM-垃圾回收(标记算法,收集器)

申明:文章内容是本人学习极客时间课程所写,文字和图片基本来源于课程资料,在某些地方会插入一点自己的理解,未用于商业用途,侵删。 原资料地址:课程资料 垃圾回收的基本原理 1 什么是垃圾? 在…

并发编程(1)基础篇

1 概览 1.1 这门课讲什么 这门课中的【并发】一词涵盖了在 Java 平台上的 进程线程并发并行 以及 Java 并发工具、并发问题以及解决方案,同时也会讲解一些其它领域的并发 1.2 为什么学这么课 我工作中用不到并发啊? 那你还是没有接触到复杂项目. …

JS如何判断普通函数与异步(async)函数

这里可以先打印一下普通函数和异步(async)函数的结构,如下图 可以看出两者原型链,普通函数的原型链指向的是一个函数,异步(async)函数原型链指向的是一个AsyncFunction,这时就会想到…

[高并发] - 1.高并发综述

1. 必备条件 高并发,高性能分布式ID 高并发过滤组件 Bloom FIlter 2. 数据库 (1)不要让mysql干不擅长的工作,例如全文搜索,而是采用对应的nosql来处理;对于擅长的存取数据则能很好胜任; &am…

SQL的1999语法

目录 交叉连接 实现交叉连接 自然连接 实现自然连接(实际上就是内连接) ON和USING 使用自然连接时要求两张表的字段名称相同,但是如果不相同或者两张表中有两组字段是重名,这时就要利用 ON 子句指定关联条件,利用 USING 子句…

【游戏开发各岗位的优势和劣势】

游戏开发各岗位的优势和劣势 在这个充满创意和技术的时代,游戏行业成为众多创新人才追求梦想的热土。对于那些准备踏入这个充满挑战与机遇的领域的新人来说,了解游戏开发的各个岗位及其独特性是至关重要的。游戏程序员、美术设计师和游戏策划——这三个…

python解构赋值详解(包含leetcode226.翻转二叉树题目讲解以及python代码)

目录 一、背景 1.1问题 1.2原因 二、解构赋值 2.1定义 2.2解题应用 2.2.1翻转二叉树 2.2.2 思路以及代码 一、背景 1.1问题 在写二叉树相关代码赋值的时候发现这样的写法,担心会发生这样的情况:先把node.right的值给node.left,在把…

黑马Java——IO流

一、IO流的概述 IO流:存储和读取数据的解决方案 IO流和File是息息相关的 1、IO流的分类 1.1、纯文本文件 word、Excel不是纯文本文件 而txt或者md文件是纯文本文件 2、小结 二、IO流的体系结构 三、字节流 1、FileOutputStream(字节输出流&#xff…

【VSCode】使用笔记

目录 快捷键系列 相关插件 相关文档链接 快捷键系列 调出终端 ctrl 或者是ctrlJ 结束进程 ctrlc 注释 ctrlkc 取消注释 ctrlku 上下移动代码 alt方向键 多行光标ctrlalt方向键 快速跳过某个单词 ctrl方向键 相关插件 1.每次修改后,自动保存启动项目 相…

【第二十四课】二分图:acwing-860染色法判定二分图 / acwing-861二分图的最大匹配 ( c++代码 )

目录 二分图是什么 acwing-860染色法判定二分图 染色法 代码 acwing-861二分图的最大匹配 思路 代码 二分图是什么 学习二分图的目的就是一些题目可以简化成二分图的模型来求解。 二分图也就是:一个无向图顶点集,分成了两堆顶点(可以理解为两…

黄金交易策略(Nerve Nnife.mql4):移动止盈的设计

完整EA:Nerve Knife.ex4黄金交易策略_黄金趋势ea-CSDN博客 相较mt4的止盈止损,在ea上实现移动止盈,可以尽最大可能去获得更高收益。移动止盈的大体逻辑是:到达止盈点就开始追踪止盈,直到在最高盈利点回撤指定点数即平…

小程序或者浏览器chrome访问的时候出现307 interval redicrect内部http自动跳转到https产生的原理分析及解决方案

#小李子9479# 出现的情况如下,即我们访问http的时候,它会自动307重定向到https,产生的原因是, 当你通过https访问过一个没有配置证书的http的网站之后,你再访问http的时候,它就会自动跳转到https,导致访问…

【网站项目】228高校教师电子名片系统

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

抽象的问题1

vue3&#xff0c;在使用v-mode绑定属性时&#xff0c;发生了奇怪的问题&#xff0c;渲染失败了 代码如下 <template><div><form><div>账号<input v-model"form_user_Data.username" type"text"></div><div>密…

【C语言相关问题】C语言中关于大小写字母转换的问题

大家好&#xff0c;这里是争做图书馆扫地僧的小白。非常感谢各位的支持&#xff0c;也期待着您的关注。 目前博主有着C语言、C、linux以及数据结构的专栏&#xff0c;内容正在逐步的更新。 希望对各位朋友有所帮助同时也期望可以得到各位的支持&#xff0c;有任何问题欢迎私信与…

OpenCV 笔记(22):图像的缩放——最近邻插值、双线性插值算法

1. 图像缩放 1.1 简介 图像缩放是指通过增加或减少像素来改变图像尺寸的过程&#xff0c;是图像处理中常见的操作。图像缩放会涉及效率和图像质量之间的权衡。 图像放大&#xff08;也称为上采样或插值&#xff09;的主要目的是放大原图像&#xff0c;以便在更高分辨率的显示设…