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驱动的写作辅助软件,每一…

Langchain-Chatchat 部署实践

Langchain-Chatchat 部署实践 LangChain-Chatchat (原 Langchain-ChatGLM),基于 ChatGLM 等大语言模型与 Langchain 等应用框架实现,开源、可离线部署的检索增强生成(RAG)大模型知识库项目。 一种利用 langchain 思想实现的基于本地知识库的问答应用&a…

对于FileUpload控件的一些bug

我写的程序,问题出现的也很神奇,就是我在上传已经存在在我指定目录下的就可以成功,如果不存在,上传仍是可以成功的,但是就会不显示,但是你重启服务器的时候又会再次显示。这种问题出现的原因我们就需要了解…

项目环境准备

在正式开始项目的环境准备前,先简单介绍这个项目。 先简单介绍一下该项目的技术栈 技术栈 基础工具环境:JDK17或JDK21IDEA2023(全新改版)Maven3.9Linux服务器 微服务技术:新版SpringCloudAlibaba全家桶SpringBoot3.XNacos2.xMybatisPlusMy…

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…

【找最长重复子串长度】

你会得到一个DNA序列:一个由字符A、C、G和T组成的字符串。你的任务是找到序列中最长的重复次数。这是一个最大长度的子字符串,仅包含一种类型的字符。 输入 唯一的输入行包含 n(1 ≤ n ≤ 10 的字符串6) 字符。 输出 打印一个整数…

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

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

Ubuntu编译ftdi_sio

为了解决Ubuntu插入FTDI设备可能出现没有ttyUSB*设备的问题。可以通过命令看一下结果: dmesg | grep usb 例如发现错误: ftdi_sio: Unknown symbol usb_serial_handle_sysrq_char (err -2) 这种错误有可能是因为模块是为不同版本的内核编译的&#xf…

网络爬虫概述与原理

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

移动端 3060 6G 安装配置 TensorFlow 和 Pytorch(高版本)

目录 前置条件硬件条件 检查方法解决方法Python3.7GPU 系统驱动CUDA11.2cudnn8.1.1 GPU 在 Python 中的驱动cudatoolkit11.3.1cudnn8.2.1 Tensorflowtensorflow2.10.0 Pytorchpytorch1.10.0 结果 前置条件 硬件条件 R7-6800H RTX3060(移动端) 检查方法…

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

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

算法提高之魔板

算法提高之魔板 核心思想&#xff1a;最短路模型 将所有状态存入队列 更新步数 同时记录前驱状态 #include <iostream>#include <cstring>#include <algorithm>#include <unordered_map>#include <queue>using namespace std;string start&qu…

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

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

数据库提权

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

Android 逆向

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

SCADE 开发环境介绍

SCADE Suite 中的"SCADE"为"安全关键应用开发环境"的缩写。需说明的是&#xff0c;在时效性方面&#xff0c;下面的描述反映的是发展至2010年左右的情况。更详细的内容&#xff0c;可参考《Formal Methods - Industrial Use from Model to the Code》(ISBN…

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

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

TriDet: Temporal Action Detection with Relative Boundary Modeling

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