java--io流(二)

一、打印流(PrintStream[字节]、PrintWriter[字符])

(基本上可以代替前面所学的字节、字符输出流),二者关于打印数据功能相同(都方便且高效),但是关于数据写出不同,前者写出字节数据,后者写出字符数据。

1.什么是打印流?

打印流可以实现更方便、更高效的打印数据作用,能实现打印什么就写出什么

2.打印流的作用是什么?

实现更方便、更高效的打印数据,自动刷新输出缓冲区,以字符串形式打印到文件

3.打印流提供打印数据的方案?

 

 

4.打印流怎么用?

    1)创建一个打印流管道对象

    2)用对象调用方法

注意:以上是一般情况下,打印流的使用方法。那么,如果想要在文件后追加数据呢?此时就不能和低级流那样直接在后面跟上true。此时,应该在打印流中包装一个低级流(这个低级流需要new出来)并在低级流中跟上true。

5.打印流的一种应用:

输出语句的重定向(依赖于方法:setOut(输出流)方法 )

示例:

import java.io.FileOutputStream;
import java.io.PrintStream;public class PrintStreamRedirectExample {public static void main(String[] args) {// 创建文件输出流,并将标准输出流重定向到文件PrintStream ps = new PrintStream(new FileOutputStream("output.txt"));System.setOut(ps);// 输出到重定向后的文件System.out.println("Hello, World!");System.out.println("This is a test.");// 恢复原来的标准输出流System.setOut(System.out);// 输出到控制台System.out.println("This will be printed to console.");}
}

二、数据流(字节流下的两种实现类)

问题:如果使用上面的打印流打印数据到文件中,我们怎么读取出特定类型的数据呢?

答:打印流打印的数据被当作字符串堆砌到文件中,无法读取出特定类型的数据,因此我们需要一种新的流来同时写出数据和数据类型,以便我们在读取时,读取到特定类型的数据。

1.什么是数据流?

DataOutPutStream(数据输出流)、DataInputStream(数据输入流)

2.数据流的作用是什么?

同时写出数据和数据类型,以便我们在读取时,读取到特定类型的数据。

3.数据流提供打印数据的方案?

DataOutPutStream(数据输出流)

 DataInputStream(数据输入流)

4.数据流怎么用?

    1)创建一个数据流管道对象(其中参数需要包装低级的字节输入输出流)

    2)用对象调用方法

   注意:在使用数据输出流时,需要注意读取顺序应该和写入顺序相同!!!!

//数据输出流示例程序:
import java.io.*;public class DataOutputStreamExample {public static void main(String[] args) {try {// 创建File对象,指定要写入的文件路径File outputFile = new File("output.txt");// 创建DataOutputStream,包装FileOutputStreamDataOutputStream dos = new DataOutputStream(new FileOutputStream(outputFile));// 写入数据dos.writeInt(123);    // 写入一个整数dos.writeFloat(3.14f); // 写入一个浮点数dos.writeUTF("Hello, World!"); // 写入一个字符串// 关闭DataOutputStreamdos.close();System.out.println("Data written to file successfully.");} catch (IOException e) {e.printStackTrace();}}
}

 

//数据输入流的示例程序:
import java.io.*;public class DataInputStreamExample {public static void main(String[] args) {try {// 创建File对象,指定要读取的文件路径File inputFile = new File("output.txt");// 创建DataInputStream,包装FileInputStreamDataInputStream dis = new DataInputStream(new FileInputStream(inputFile));// 读取数据int intValue = dis.readInt();    // 读取一个整数float floatValue = dis.readFloat(); // 读取一个浮点数String stringValue = dis.readUTF(); // 读取一个字符串// 关闭DataInputStreamdis.close();// 打印读取的数据System.out.println("Read integer: " + intValue);System.out.println("Read float: " + floatValue);System.out.println("Read string: " + stringValue);} catch (IOException e) {e.printStackTrace();}}
}

三、(重点)序列化流

问题:上面提到的数据流可以读写出指定的类型的数据,那么怎么读取一个一个的对象呢?那么就需要一种新的流:序列化流

1. 什么是序列化流?

序列化流是Java I/O系统中的一种流,它允许将对象转换为字节流,以便可以将其存储到文件、数据库或通过网络传输。Java中的序列化流主要包括ObjectOutputStreamObjectInputStreamObjectOutputStream用于将对象序列化为字节流,而ObjectInputStream用于从字节流中反序列化恢复对象。

2. 序列化流的作用是什么?

序列化流的主要作用包括:

  • 持久化对象状态:将对象的状态保存到文件或其他持久化存储中,以便在程序重启后可以恢复对象的状态。
  • 对象传输:通过网络传输对象,使得分布式系统中的不同部分可以共享对象状态。
  • 对象复制:创建对象的副本,这在某些情况下可以用于克隆对象。

3. 序列化流提供的方案:

Java序列化流提供的方案包括:

  • 对象序列化:使用ObjectOutputStream将对象转换为字节序列。
  • 对象反序列化:使用ObjectInputStream从字节序列中恢复对象。
  • 版本控制:Java序列化机制支持版本控制,即使类定义发生了变化,只要变化是兼容的,反序列化仍然可以成功。
  • 自定义序列化:允许开发者通过实现writeObjectreadObject方法来自定义序列化和反序列化的行为。

4. 序列化流怎么用?

使用序列化流的基本步骤如下:

序列化对象(使用ObjectOutputStream):
  1. 创建一个FileOutputStream,指向一个文件,用于存储序列化后的对象。
  2. 创建一个ObjectOutputStream,将其连接到FileOutputStream
  3. 使用ObjectOutputStreamwriteObject方法将对象写入流中。
  4. 关闭ObjectOutputStream

示例代码:

import java.io.*;public class SerializationExample {public static void main(String[] args) {try {// 创建一个对象MySerializableObject obj = new MySerializableObject("Example Object");// 创建FileOutputStreamFileOutputStream fileOut = new FileOutputStream("object.ser");// 创建ObjectOutputStreamObjectOutputStream out = new ObjectOutputStream(fileOut);// 序列化对象out.writeObject(obj);// 关闭流out.close();fileOut.close();System.out.println("Object has been serialized");} catch (IOException e) {e.printStackTrace();}}
}
反序列化对象(使用ObjectInputStream):
  1. 创建一个FileInputStream,指向包含序列化对象的文件。
  2. 创建一个ObjectInputStream,将其连接到FileInputStream
  3. 使用ObjectInputStreamreadObject方法从流中读取对象。
  4. 关闭ObjectInputStream

示例代码:
 

import java.io.*;public class DeserializationExample {public static void main(String[] args) {try {// 创建FileInputStreamFileInputStream fileIn = new FileInputStream("object.ser");// 创建ObjectInputStreamObjectInputStream in = new ObjectInputStream(fileIn);// 反序列化对象MySerializableObject obj = (MySerializableObject) in.readObject();// 关闭流in.close();fileIn.close();System.out.println("Object has been deserialized");System.out.println(obj.getMessage());} catch (IOException | ClassNotFoundException e) {e.printStackTrace();}}
}

请注意,要序列化的类必须实现java.io.Serializable接口,这是一个标记接口,没有定义任何方法。此外,如果类中有任何非瞬态(non-transient)和非静态(non-static)的字段是不可序列化的(例如,它们引用了不可序列化的类),那么这些字段必须声明为transient,以避免序列化过程中的错误。(后面一句话简单的说就是:如果想要有选择性的序列化,就把不想序列化的部分用transient修饰)

四、io框架

 框架怎么使用?下面以commons-io框架为演示:

 以上就是这个框架为我们准备的一些完成某种目的的简便方法,极大的提高了io效率

那么,我们怎么获得框架呢?又怎么使用呢?

(前提是,这些框架是开源的)我们可以在相应的官网上下载框架(.zip文件),之后的步骤如图:包括怎么在IDE中导入框架,怎么把框架合并在我们的项目中供我们使用。

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

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

相关文章

上位机图像处理和嵌入式模块部署(树莓派4b和qt应用全屏占有)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 我们都知道,嵌入式应用一般都是为了某一个特定应用而存在的。也就是说,和pc不同,这个嵌入式板子一般都是为了解…

图像ISP——AGC参数解析

前言 AWB和AGC是两种常见的自动调整功能。AWB用于自动调整图像的白平衡,以确保颜色在不同光照条件下仍然看起来自然。而AGC则用于自动调整图像的增益,以在不同的亮度条件下保持适当的曝光。 代码例程 static AWB_AGC_TABLE_S g_stAwbAgcTable {/* bvali…

Android解放双手的利器之ViewBinding

文章目录 1. 背景2. ViewBinding是什么3. 开启ViewBinding功能4. 生成绑定类5. 使用ViewBinding5.1Activity 中使用5.2 Fragment 中使用5.3 ViewHolder 中使用 6. ViewBinding的优点7. 与 dataBinding 对比 1. 背景 写代码最繁琐的是什么?重复的机械操作。我们刚接…

Docker搭建ctfd平台

安装docker和docker-compose (1)安装docker: curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun(2)安装 Docker Compose: yum install docker-compose安装失败参考下面文章 https:/…

二叉搜索树模拟实现

目录 认识二叉搜索树: 模拟实现: 节点结构体构建: insert(插入): find(查找): erase(删除)(重点): 全部代码 认识二叉…

第十一讲:指针(3)

第十一讲:指针(3) 1.字符指针变量1.1存储一个字符1.2存储一个字符串1.3一个有趣的面试题 2.数组指针变量2.1什么是数组指针变量2.2数组指针变量的初始化 3.二维数组传参的本质4.函数指针变量4.1介绍函数指针变量4.2 两段有趣的代码4.2.1代码1…

内容安全(AV)

防病毒网关(AV)简介 基于网络侧 识别 病毒文件,工作范围2~7层。这里的网关指的是内网和外网之间的一个关口,在此进行病毒的查杀。在深信服中就有一个EDR设备,该设备就是有两种部署,一个部署在网关&#xf…

Java----数组的定义和使用

1.数组的定义 在Java中,数组是一种相同数据类型的集合。数组在内存中是一段连续的空间。 2.数组的创建和初始化 2.1数组的创建 在Java中,数组创建的形式与C语言又所不同。 Java中数组创建的形式 T[] 数组名 new T[N]; 1.T表示数组存放的数据类型…

FPGA学习笔记(1)——Vivado和HLS

1 Vivado设计 1.1 FPGA基本知识 Xilinx Atrix-7使用6输入LUT结构(0-63)CLB:可配置逻辑块Slice:每个CLB包含2个Slice(包含查找表LUT和8位寄存器REG)布线池:围绕在CLB周围,衔接FPGA的资源调度I/O块&#xf…

vivado Spartan-7 配置存储器器件

下表所示闪存器件支持通过 Vivado 软件对 Spartan -7 器件执行擦除、空白检查、编程和验证等配置操作。 本附录中的表格所列赛灵思系列非易失性存储器将不断保持更新 , 并支持通过 Vivado 软件对其中所列非易失性存储器 进行擦除、空白检查、编程和验证。赛灵…

带EXCEL附件邮件发送相关代码

1.查看生成的邮件 2.1 非面向对象的方式(demo直接copy即可) ​ REPORT Z12. DATA: IT_DOCUMENT_DATA TYPE SODOCCHGI1,IT_CONTENT_TEXT TYPE STANDARD TABLE OF SOLISTI1 WITH HEADER LINE,IT_PACKING_LIST TYPE TABLE OF SOPCKLSTI1 WITH HEADER LIN…

在做题中学习(57):寻找数组的中心下标

724. 寻找数组的中心下标 - 力扣(LeetCode) 解法:前缀和后缀和 思路:要看一个数是不是中心下标,就看他前面数的和 与 后面数的和 相不相等。 1.i前面数的和,是[0,i-1] 的前缀和,i后面数的和&am…

快递物流查询:如何实现快递批量查询?这些技巧助你轻松应对

在日常生活和工作中,我们经常需要查询快递物流信息,尤其是当面对大量的快递包裹时,逐一查询无疑会耗费大量的时间和精力。这时,实现快递批量查询就显得尤为重要。本文将为你介绍办公提效工具一些实现快递批量查询的技巧&#xff0…

国内有哪些知名的网络安全厂商?

首先就是360,这个我相信大家并不陌生了吧,你的电脑装过360么? 360在个人终端服务那是妥妥的扛把子,但是在企业服务里虽然有他们的身影却略显不足。 第二个就是深信服,网络安全的老牌大佬,业务覆盖了全球5…

【数据分析】 JupyterNotebook安装及使用简介

各位大佬好 ,这里是阿川的博客 , 祝您变得更强 个人主页:在线OJ的阿川 大佬的支持和鼓励,将是我成长路上最大的动力 阿川水平有限,如有错误,欢迎大佬指正 在数据分析中,一般用Pycharm编辑代…

18 分页:介绍

目录 简单例子 页表存在哪里 列表中究竟有什么 分页:也很慢 内存追踪 小结 在解决大多数空间管理问题上面,操作系统有两种方法: 第一种就是将空间分割成不同长度的分片,类似于虚拟内存管理中的分段,但是这个方法…

MySQL45讲(一)(40)

回顾binlog_formatstatement STATEMENT 记录SQL语句。日志文件小,节约IO,但是对一些系统函数不能准确复制或不能复制,如now()、uuid()等 在RR隔离级别下,binlog_formatstatement 如果执行insert select from 这条语句是对于一张…

win10禁止自动更新的终极方法

添加注册表值 1.运行,输入regedit 2.打开注册表编辑器依次进入以下路径“计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings”。 3.在Settings项中,新建DWORD(32位)值(D),重命名为以下命名“Fl…

vuex核心概念-getters

除了state之外,有时我们还需要从state中派生出一些状态,这些状态是依赖state的,此时会用到getters。

2023版brupsuite专业破解安装

安装教程,分两部分: 1、安装java环境、参考链接JAVA安装配置----最详细的教程(测试木头人)_java安装教程详细-CSDN博客 2、安装2023.4版本brupsuite:参考链接 2023最新版—Brup_Suite安装配置----最详细的教程&…