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.mzph.cn/bicheng/10402.shtml

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

相关文章

数据的均匀化分割算法(网格划分法、四叉树法(含C++代码))

数据的均匀化分割主要是指在分割过程中尽可能均匀地将数据点分布在各个子区域中,以保持数据分布的平衡和优化数据结构的性能。以下是几种可以实现数据均匀化分割的方法: 一. 网格划分法 1. 基本概念 虽然传统的网格划分法不是动态调整的,但通…

3款超好用的智能AI写作神器,不容错过!

在当代写作领域,人工智能(AI)辅助的写作工具已显著地改变了创作过程,不仅优化了撰写效率还提高了内容质量。为了协助读者更好地了解并利用这些先进的工具,本文将详细评述3种卓越的AI驱动的写作辅助软件,每一…

AJ65SBT2B-64DA 三菱CC-Link D/A转换模块

AJ65SBT2B-64DA 是将数字值(16位有符号BIN数据)转换为模拟值(电压或电流)的模块。 AJ65SBT2B-64DA参数说明:4通道;输入分辨率0~12000,-12000~12000,-16000~16000;输出DC-10~10V,DC0~20mA;转换速…

028.实现 strStr()

题意 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。 难度 简单 示例 例 1 输入:hays…

【Win10点击任务栏刷屏,卡死转圈(亲测有效)】

计算机疑难杂症001 Win10点击任务栏刷屏,卡死转圈(亲测有效)1、问题状况2、问题原因3、问题解决 Win10点击任务栏刷屏,卡死转圈(亲测有效) 1、问题状况 在偶然间,发现任务栏点不动了,点击无反应,再多点击几次&#x…

网络爬虫概述与原理

网络爬虫概述与原理 网络爬虫简介狭义上理解功能上理解常见用途总结 网络爬虫分类通用网络爬虫聚焦网络爬虫增量网络爬虫深度网络爬虫 网络爬虫流程网络爬虫采集策略深度有限搜索策略广度优先搜索策略 网络爬虫简介 通过有效地获取网络资源的方式,便是网络爬虫。网…

Threejs Shader动态修改Merge合并几何体中单个Mesh的颜色

目录 Merge合并 现象 思路 实现 为单个geometry添加映射 通过id检索Merge后的Geometry映射属性,获取顶点坐标 onBeforeCompile修改编译前材质的着色代码 编译前材质的顶点着色代码 编译前材质的片元着色代码 着色器代码 注意 效果 Merge合并 mergeBuf…

【GESP】2023年12月图形化二级 -- 小杨报数

小杨报数 【题目描述】 小杨需要从 1 1 1到 N N N报数。在报数过程中,小杨希望跳过 M M M的倍数。例如,如果 N 5 N5 N5, M 2 M2 M2,那么小杨就需要依次报出 1 1 1, 3 3 3, 5 5 5。 默认小猫角色和白色背…

数据库提权

1.此时实验需要用到的软件: (1)phpStudy该程序包集成最新的ApachePHPMySQL phpMyAdminZendOptimizer,一次性安装,无须配置即可使用,是非常方便、好用的PHP调试环境.该程序不仅包括PHP调试环境,还包括了开发工具、开发手册等.总之学习PHP只需…

Android 逆向

一、apk 查壳工具 ApkScan-PKID 相关APK文件可以在 豌豆荚 官网下载 ApkScan-PKID查壳工具 下载 - 简书 (jianshu.com) 二、脱壳工具:frida 1、Android端配置 frida-server: 该步骤需要使用到 adb,操作Android文件 Releases frida/frid…

对话NVIDIA英伟达:AI已照进现实 | 最新快讯

文 | MetaPost NVIDIA 创始人兼首席执行官黄仁勋在 GTC 2024 主题演讲上表示:下一波 AI 浪潮将是 AI 对物理世界的学习。 当下,全球范围内价值超过50万亿美金的行业正在竞相实现数字化,数字孪生技术正在赋能千行百业。NVIDIA Omniverse 中国…

TriDet: Temporal Action Detection with Relative Boundary Modeling

标题:TriDet:采用相对边界建模的时间动作检测 原文链接:TriDet: Temporal Action Detection With Relative Boundary Modeling (thecvf.com)https://openaccess.thecvf.com/content/CVPR2023/papers/Shi_TriDet_Temporal_Action_Detection_W…

笔试强训未触及题目(个人向)

1.DP22 最长回文子序列 1.题目 2.解析 这是一个区间dp问题,我们让dp[i][j]表示在区间[i,j]内的最长子序列长度,如图: 3.代码 public class LongestArr {//DP22 最长回文子序列public static void main(String[] args) {Scanner…

MSP430环境搭建

1.下载ccs编译器 注意:安装路径和工作路径不能出现中文! 没有说明的步骤就点next即可! 1.1下载适合自己电脑的压缩包。 下载好压缩包后解压,点击有图标进行安装。 1.2创建一个文件夹用于安装编译器位置 选择安装地址&#xff0…

新书速览|Rust编程与项目实战

掌握Rust编程基础和开发方法,实战网络编程、图像和游戏开发、数据分析项目 本书内容 Rust是一门系统编程语言,专注于安全,尤其是并发安全,它也是支持函数式、命令式以及泛型等编程范式的多范式语言。标准Rust在语法和性能上和标准…

贝壳面试:MySQL联合索引,最左匹配原则是什么?

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中,最近有小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格,遇到很多很重要的面试题: 1.谈谈你对MySQL联合索引的认识? 2.在MySQ…

信创 | 高效信创项目管理:关键步骤与实用技巧!

高效信创项目管理的关键步骤与实用技巧可以从多个维度进行分析和总结。首先,建立有效的工程管理体系是确保信创项目顺利实施的基础,这包括项目管理、质量管理、成本控制等方面的工作。其次,实现项目全流程精细化管理,如信息的及时…

使用./build.sh编译ORB_SLAM源码时出现报错:/usr/bin/ld:找不到 -lboost_serialization的解决办法

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、/usr/bin/ld:找不到 -lboost_serialization1.问题描述2.解决(1). 下载源码(2) . 编译安装 一、/usr/bin/ld:找不到 -lboost_serialization 1.问题描述 在安装…

机器视觉任务中语义分割方法的进化历史

机器视觉任务中语义分割方法的进化历史 一、基于传统方法的图像分割二、基于卷积神经网络的图像分割三、基于Attention机制的图像分割四、语义分割模型的挑战与改进 在图像处理领域,传统图像分割技术扮演着重要角色。 一、基于传统方法的图像分割 这些方法包括大津…

2 GPIO控制

ESP32的GPIO的模式,一共有输入和输出模式两类。其中输入模式:上拉输入、下拉输入、浮空输入、模拟输入;输出模式:输出模式、开漏输出(跟stm32八种输入输出模式有所不同)。库函数中控制引脚的函数如下&#…