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流体系

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

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

相关文章

2024.2.10 HCIA - Big Data笔记

1. 大数据发展趋势与鲲鹏大数据大数据时代大数据的应用领域企业所面临的挑战和机遇华为鲲鹏解决方案2. HDFS分布式文件系统和ZooKeeperHDFS分布式文件系统HDFS概述HDFS相关概念HDFS体系架构HDFS关键特性HDFS数据读写流程ZooKeeper分布式协调服务ZooKeeper概述ZooKeeper体系结构…

[职场] 会计学专业学什么 #其他#知识分享#职场发展

会计学专业学什么 会计学专业属于工商管理学科下的一个二级学科,本专业培养具备财务、管理、经济、法律等方面的知识和能力,具有分析和解决财务、金融问题的基本能力,能在企、事业单位及政府部门从事会计实务以及教学、科研方面工作的工商管…

【摸鱼日常】使用Docker部署RPG网页小游戏

一、本次实践介绍 1. 本次实践简介 本次实践部署环境为个人测试环境,快速使用docker部署RPG网页小游戏。 rootWellDone:/home/goodjob# uname -a Linux WellDone 6.5.0-14-generic #14~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Mon Nov 20 18:15:30 UTC 2 x86_64 x86_…

Linux:docker搭建redis集群(3主3从扩容缩容 哈希槽分配)

操作系统:centos7 docker-ce版本:24.0.7 1.准备redis镜像 我这里使用redis 6.0.8 镜像进行操作,如果你也需要镜像,在网络正常情况下直接使用 docker pull redis:6.0.8 即可进行下载,如果你没配置国内加速器&#x…

DS:八大排序之直接插入排序、希尔排序和选择排序

创作不易,感谢三连支持!! 一、排序的概念及运用 1.1 排序的概念 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起 来的操作。稳定性&…

leetcode:96.不同的二叉搜索树

解题思路: 输入n3 n 0 1个 n 1 1个 n 2 2个 头1头2头3 头1 左子树0节点(个数)x右子树2个节点(个数) 头2 左子树1节点(个数)x右子树1个节点(个数) 头3 左子…

集群聊天项目

不懂的一些东西 (const TcpConnectionPtr&)作为形参啥意思:接收一个常量引用,函数内部不允许修改该指针所指向的对象。 优势 1.网络层与业务层分离:通过网络层传来的id,设计一个map存储id以及对印的业务处理器&…

mysql 2-16

安全等于<> 最大最小LEAST,GREATEST BETWEEN AND 条件一是下限 IN LIKE关键字 转移字符 逻辑运算符 位运算符 排序数据 升序降序&#xff0c;默认升序 二级排序 8.0新特性 小拓展 多表查询 多表查询 别名 多表查询的分类 非等值连接 自连接 内连接与外连接 sql92实现外连…

TenorFlow多层感知机识别手写体

文章目录 数据准备建立模型建立输入层 x建立隐藏层h1建立隐藏层h2建立输出层 定义训练方式建立训练数据label真实值 placeholder定义loss function选择optimizer 定义评估模型的准确率计算每一项数据是否正确预测将计算预测正确结果&#xff0c;加总平均 开始训练画出误差执行结…

【超级干货】ArcGIS_空间连接_工具详解

帮助里对空间连接的解释&#xff1a; 根据空间关系将一个要素的属性连接到另一个要素。 目标要素和来自连接要素的被连接属性写入到输出要素类。 如上图所示&#xff0c;关键在于空间关系&#xff0c;只有当两个要素存在空间关系的时候&#xff0c;空间连接才有用武之地。 一…

JavaScript_00001_00000

contents 简介变量与数据类型自动类型转换强制类型转换 简介 变量与数据类型 根据变量定义的范围不同&#xff0c;变量有全局变量和局部变量之分。直接定义的变量是全局变量&#xff0c;全局变量可以被所有的脚本访问&#xff1b;在函数里定义的变量称为局部变量&#xff0c;…

JavaWeb之Servlet接口

Servlet接口 什么是Servlet&#xff1f; Servlet是一种基于Java技术的Web组件&#xff0c;用于生成动态内容&#xff0c;由容器管理&#xff0c;是平台无关的Java类组成&#xff0c;并且由Java Web服务器加载执行&#xff0c;是Web容器的最基本组成单元 什么是Servlet容器&…

【c++】list详细讲解

> 作者简介&#xff1a;დ旧言~&#xff0c;目前大二&#xff0c;现在学习Java&#xff0c;c&#xff0c;c&#xff0c;Python等 > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;熟悉list库 > 毒鸡汤&#xff1a;你的脸上云淡…

关于Build Your Own Botnet的尝试

这是一次失败的尝试、 原文地址&#xff1a;关于Build Your Own Botnet的尝试 - Pleasure的博客 下面是正文内容&#xff1a; 前言 我在上一篇关于DDOS的文章种提到过这个项目&#xff0c;而且说明了由于这个项目是在2020年发布并开源的&#xff0c;并且已经有两年没有进行跟…

身份治理存在权限问题

身份治理正迅速成为 CISO 的首要考虑因素。二十年前&#xff0c;当萨班斯-奥克斯利法案(SoX) 和其他监管指令在互联网泡沫破灭后诞生时&#xff0c;身份治理要求就出现了。合规性控制&#xff0c;例如用户访问审查和有效管理员工访问生命周期的需要&#xff0c;是当时身份治理的…

1.2.1 相机模型—内参、外参

相机模型-内参、外参 更多内容&#xff0c;请关注&#xff1a; github&#xff1a;https://github.com/gotonote/Autopilot-Notes.git&#xff09; 针孔相机模型&#xff0c;包含四个坐标系&#xff1a;物理成像坐标系、像素坐标系、相机坐标系、世界坐标系。 相机参数包含&…

typescript类型详解

因为介绍了ts的全部类型,所以比较长,各位可以通过目录选择性观看 typescript类型概述typescript 类型注解概念-->监测类型变化 ts类型注解语法ts常用类型原始类型对象类型对象类型_数组类型 ts新增,联合类型ts函数类型ts 函数类型 voidts 函数类型可选参数 ts 对象类型ts 可…

The method toList() is undefined for the type Stream

The method toList() is undefined for the type Stream &#xff08;JDK16&#xff09; default List<T> toList() { return (List<T>) Collections.unmodifiableList(new ArrayList<>(Arrays.asList(this.toArray()))); }

OpenAI Sora 初体验

OpenAI Sora 初体验 就在刚刚&#xff0c;OpenAI 再次投下一枚重磅炸弹——Sora&#xff0c;一个文本到视频生成模型。 我第一时间体验了 Sora。看过 Sora 的能力后&#xff0c;我真的印象深刻。对细节的关注、无缝的角色刻画以及生成视频的绝对质量真正将可能性提升到了一个新…

人工智能学习与实训笔记(五):神经网络之推荐系统处理

目录 ​​​​​​​七、智能推荐系统处理 7.1 常用的推荐系统算法 7.2 如何实现推荐​​​​​​​ 7.3 基于飞桨实现的电影推荐模型 7.3.1 电影数据类型 7.3.2 数据处理 7.3.4 数据读取器 7.3.4 网络构建 7.3.4.1用户特征提取 7.3.4.2 电影特征提取 7.3.4.3 相似度…