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.hqwc.cn/news/690073.html

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

相关文章

「云渲染教程」3D渲染时GPU内存不足怎么解决?

在进行三维场景渲染时,如果遇到模型较为复杂,用户们可能会面临图形处理单元(GPU)内存不足的挑战。这种情况通常意味着现有的硬件配置不足以满足渲染任务的需求。为了缓解GPU的工作压力,可以采取一些策略来优化资源的分…

【Web后端】jsp基础知识_请求转发和重定向

1.jsp基础知识 1.1简介 java server page&#xff0c;运行在服务器端的页面java代码html代码java代码全部都放在<%%>中间 1.2jsp表达式 作用&#xff1a;将动态信息显示在页面上&#xff0c;以字符串方式&#xff0c;返回给浏览器端语法&#xff1a;<%变量或表达式…

37 | 什么时候会使用内部临时表?

union 执行流程 (select 1000 as f) union (select id from t1 order by id desc limit 2);key=PRIMARY,说明第二个子句用到了索引 id。 Extra 字段,表示在对子查询的结果集做 union 的时候,使用了临时表 (Using temporary)。 执行流程 创建一个内存临时表,这个临时表只有…

Scala编程入门:从零开始的完整教程

目录 引言环境准备创建第一个Scala项目基本语法高阶概念进阶资源结语 引言 Scala是一种强大的、静态类型的、多范式编程语言&#xff0c;它结合了面向对象和函数式编程的特点。本教程将指导您如何从零开始学习Scala&#xff0c;并搭建一个简单的开发环境。让我们开始探索Scala…

ACM实训冲刺第四天

【碎碎念】最近的任务有点繁重&#xff0c;所以考虑到实际情况&#xff0c;视频学习决定放置一段时间&#xff0c;重点是学校的实训练习题&#xff0c;对于我而言&#xff0c;目标不是优秀/良好&#xff0c;综合考虑我的实际情况&#xff0c;保佑我及格、顺利通过就可&#xff…

建筑、室内设计师如何利用AI绘画辅助完成一套设计工作流?超长干货深度好文建议收藏!

2023年是AI人工智能突然大爆发的元年 所有行业都受到了AI的冲击 对设计师来说也迎来了新一轮的效率革命 新事物的到来 有人热情学习和接受 也有人担忧害怕和拒绝 担心自己被取代 其实 取代你的并不是AI 而是会使用AI的设计师 常用的AI工具有哪些&#xff1f; 对于设…

ICode国际青少年编程竞赛- Python-4级训练场-嵌套for循环入门

ICode国际青少年编程竞赛- Python-4级训练场-嵌套for循环入门 1、 for i in range(3):Dev.step(3)for j in range(3):Dev.turnLeft()Dev.step(-2)Dev.turnLeft()2、 for i in range(3):Dev.turnLeft()Dev.step(4)Dev.turnRight()Dev.step(2)for i in range(4):Dev.step(2)D…

alist网盘自动同步

alist网盘自动同步 alist可以设置目录定时转存到各个网盘&#xff0c;做到夸网盘&#xff0c;多备份的效果可以将自己挂载的alist 下的各个目录相互间进行同步&#xff0c;原理是采用alist原始api调用执行&#xff0c;同步原理是匹配文件名称是否相同&#xff0c;相同会跳过同…

八年三顾A股“茅庐”无果,富友支付“减利”后只能赴港上市?

都说事不过三&#xff0c;此前三次想要“进宫”&#xff0c;却三次与A股“无缘”的富友支付&#xff0c;最终无奈选择南下港交所上市了。 据港交所披露&#xff0c;上海富友支付服务股份有限公司&#xff08;简称“富友支付”&#xff09;于2024年4月30日正式向港交所递交招股…

一文了解CRM系统帮助中心:从认识到搭建

众所周知&#xff0c;客户关系管理&#xff08;CRM&#xff09;系统是企业必不可少的一部分。CRM系统到底是什么&#xff1f;为什么我们需要搭建一个CRM系统的帮助中心&#xff1f;又如何去搭建呢&#xff1f;本文将来一一解答这些问题。 一、什么是CRM系统 CRM系统&#xff0c…

书生浦语训练营第四次课作业

基础作业 环境配置 拷贝internlm开发机内的环境 studio-conda xtuner0.1.17# 激活环境 conda activate xtuner0.1.17 # 进入家目录 &#xff08;~的意思是 “当前用户的home路径”&#xff09; cd ~ # 创建版本文件夹并进入&#xff0c;以跟随本教程 mkdir -p /root/xtuner0…

解密某游戏的数据加密

前言 最近有个兄弟通过我的视频号加我&#xff0c;咨询能否将这个dubo游戏游戏开始前就将数据拿到从而进行押注&#xff0c;于是通过抓包工具测试了下&#xff0c;发现数据有时候是明文&#xff0c;有时候确实密文&#xff0c;大致看了下有这几种加密&#xff1a;Md5aes、Md5&a…