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体系结构…

[uniapp生命周期]详细讲解uniapp中那些属于vue生命周期,那些属于uniapp独有的生命周期,以及这中间的区别 相关的内容和api 代码注释

目录 1. Vue.js生命周期函数2.Vue生命周期函数代码beforeCreatecreatedbeforeMountmountedbeforeUpdateupdatedbeforeDestroydestroyed$nextTick$forceUpdate$destroy 3. UniApp独有的生命周期函数onLaunchonShowonHideonError 4.总结 在UniApp中,除了Vue.js的生命周…

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

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

【摸鱼日常】使用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 排序的概念 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起 来的操作。稳定性&…

2402,如何正确的最佳方式对付新冠

这几天,连着发了几天的烧,配合感冒冲剂,荆防颗粒,同新冠进行了5次2小时的斗争. 最后,我发现,同新冠直接斗争,是很傻的行为. 为啥,我要直接同新冠斗争呢? 为啥不让新冠同环境中的消毒剂斗争呢?消毒剂是化学药品,病毒最怕的就是这些玩意! 只要我的局部环境充满了消毒剂,新冠要同…

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

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

操作字符串之子串削除-11-${string%%substring}

1.${string%%substring} 从$string的结尾位置截掉最短匹配的$substring 2.实例 操作字符串样例:string123ABCabc456xyzabc 字符串操作默认从右边开始进行 命令: echo ${string%%a*c} [rootkibana ~]# echo ${string%%a*c} 123ABC #从$string的结尾…

集群聊天项目

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

mysql 2-16

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

【前端工程化面试题】如何优化提高 webpack 的构建速度

使用最新版本的 Webpack 和相关插件: 每个新版本的 Webpack 都会带来性能方面的改进和优化&#xff0c;因此始终确保你在使用最新版本。同时&#xff0c;更新你的相关插件也是同样重要的。 合理配置 Webpack: 优化 Webpack 的配置文件&#xff0c;包括合理设置 entry、output、…

TenorFlow多层感知机识别手写体

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

倒计时52天(待续,,,

寒假学习内容总复习上&#xff1a; 倒计时67天-CSDN博客 1. #include<bits/stdc.h> using namespace std; #define int long long const int N2e56; const int inf0x3f3f3f3f; int month[13]{0,31,28,31,30,31,30,31,31,30,31,30,31}; int a[110]; void solve() {for(…

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

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

JavaScript_00001_00000

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

【leetcode热题】对称二叉树

难度&#xff1a; 简单通过率&#xff1a; 42.2%题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目描述 给定一个二叉树&#xff0c;检查它是否是镜像对称的。 例如&#xff0c;二叉树 [1,2,2,3,4,4,3] 是对称的。 1/ \2 …

JavaWeb之Servlet接口

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

杂文随笔_

己写于亥年正月廿六&#xff0c;校图书馆&#xff0c;天气阴 “你的工作将会是你生活中很大一部分&#xff0c;唯一能使自己得到真正满足的是&#xff0c;做你伟大的工作,做一份伟大的工作的唯一方法是&#xff0c;热爱你所做的工作。“这是乔布斯在斯坦福大学的一次演讲所说的…

【c++】list详细讲解

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