java--io流(二)

news2025/1/10 2:27:37

一、打印流(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,包装FileOutputStream
            DataOutputStream dos = new DataOutputStream(new FileOutputStream(outputFile));

            // 写入数据
            dos.writeInt(123);    // 写入一个整数
            dos.writeFloat(3.14f); // 写入一个浮点数
            dos.writeUTF("Hello, World!"); // 写入一个字符串

            // 关闭DataOutputStream
            dos.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,包装FileInputStream
            DataInputStream dis = new DataInputStream(new FileInputStream(inputFile));

            // 读取数据
            int intValue = dis.readInt();    // 读取一个整数
            float floatValue = dis.readFloat(); // 读取一个浮点数
            String stringValue = dis.readUTF(); // 读取一个字符串

            // 关闭DataInputStream
            dis.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");

            // 创建FileOutputStream
            FileOutputStream fileOut = new FileOutputStream("object.ser");

            // 创建ObjectOutputStream
            ObjectOutputStream 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 {
            // 创建FileInputStream
            FileInputStream fileIn = new FileInputStream("object.ser");

            // 创建ObjectInputStream
            ObjectInputStream 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.coloradmin.cn/o/1664471.html

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

相关文章

数字孪生引擎国产信创环境适配靠谱么?

近期我们组织了一次国产化环境适配以及产品国产化产品替换的交流,虽然从属于不同的业务条线,但是在过去一段时间多多少少都承受不同程度的信创压力,尤其是自然资源业务方面,由于自然资源大多数的业务是属于强GIS的范畴&#xff0c…

未来娱乐新地标?气膜球幕影院的多维体验—轻空间

在中国,一座独特的娱乐场所正在崭露头角:气膜球幕影院。这个融合了气膜建筑与激光投影技术的创新场所,不仅令人惊叹,更带来了前所未有的科幻娱乐体验。让我们一起探索这个未来的娱乐空间,感受其中的多维魅力。 现场演出…

电脑复制和粘贴的时候会出现Hello!

电脑不管是Microsoft Excel还是Microsoft Word复制之后粘贴过来就出现HELLO,当复制粘贴文件的时候就会出现WINFILE; 具体现象看下面两个图片: 这是因为winfile 文件病毒(幽灵蠕虫病毒),每月的28号发作; 症状…

基础I/O:文件系统调用接口

文章目录 文件系统调用接口open系统调用接口和C语言封装文件描述符fd重定向 文件系统调用接口 open NAME//打开、创建 - 打开并可能创建文件或设备open, creat - open and possibly create a file or deviceSYNOPSIS#include <sys/types.h>#include <sys/stat.h>…

【数据结构】顺序表与链表的差异

顺序表和链表都是线性表&#xff0c;它们有着相似的部分&#xff0c;但是同时也有着很大的差异。 存储空间上的差异&#xff1a; 对于插入上的不同点&#xff0c;顺序表在空间不够时需要扩容&#xff0c;而如果在使用realloc函数去扩容&#xff0c;会有原地扩容和异地扩容两种情…

DDS块集是如何工作的?

DDS块集使你能够在Simulink中创建DDS应用程序。如果你有一个在Simulink中建模的应用程序&#xff0c;希望能够使用DDS&#xff0c;则可以使用DDS块集轻松连接到DDS中间件平台。 DDS块集将DDS概念引入Simulink环境&#xff0c;在Simulink应用程序中对这些概念进行建模&#xff0…

Failed to parse source map (@toast-ui/editor/dist/purify.js.map)

使用 toast-ui-editor 时出现报错&#xff1a;Failed to parse source map (toast-ui/editor/dist/purify.js.map) 解决方法很简单&#xff1a; "start": "set "GENERATE_SOURCEMAPfalse" && react-scripts start ",在启动脚本时添加执…

PTP 对时协议 IEEE1588 网络对时 计算原理

前言 本文将阐述 PTP 对时协议的原理&#xff0c;slave 节点如何根据获取的时间来纠正和更新自己的时间。 协议概述 整个通讯过程中会发送 4 种类型的数据包&#xff0c;用来支撑对时。下面是 4 个包的解释 Sync message: 由 master 发送&#xff0c;发起对时事务, slave 接…

用于视频识别的快慢网络

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 摘要Abstract文献阅读&#xff1a;用于视频识别的快慢网络1、文献摘要2、提出方法2.1、SlowFast模型2.2、SlowFast 提出思想 3、相关方法3.1、时空间卷积3.2、基于光…

交通数据三维可视化呈现与可视化分析系统开发(附程序源码)

目录 01 系统介绍 02 功能介绍 文件管理功能 模型研究 可视化分析功能 今天分享一套“交通数据三维可视化呈现与可视化分析系统”&#xff0c;并开放程序源代码下载&#xff0c;内容涉及开源空间数据库的使用、三维引擎的二次开发、矢量和栅格数据管理、交通流量分析模型框…

C语言----斐波那契数列

各位看官们好&#xff0c;当我写了上一篇博客杨辉三角后&#xff0c;有一些看官叫我讲一下斐波那契数列。对于这个大家应该是有了解的。最简单的规律就是f(n)f(n-2)f(n-1)。就是当前是前两项之和&#xff0c;然后下标1和0都是1.从第三项开始计算的。那么我们知道规律&#xff0…

信息系统架构模型_3.企业数据交换总线

1.企业数据交换总线 实践中&#xff0c;还有一种较常用的架构&#xff0c;即企业数据交换总线&#xff0c;即不同的企业应用之间进行信息交换的公共通道&#xff0c;如图1所示。 图1 企业数据交换总线架构 这种架构在大型企业不同应用系统进行信息交换时使用较普遍&am…

C++入门系列-构造函数

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会…

ROS2 工作空间

文章目录 ROS2 工作空间创建工作空间自动安装依赖编译工作空间设置环境变量参考链接 ROS2 工作空间 工作空间可以简单理解为工程目录。 ROS 系统中一个典型的工作空间结构如图所示&#xff1a; dev_ws&#xff1a; 根目录&#xff0c;里面会有四个子目录&#xff08;子空间&a…

从0开发、发布油猴脚本(保姆级)

概览 项目中使用conify集成图标&#xff0c;有些内网用户只能使用离线图标&#xff0c;但是如何判断使用的conify集成图标是在线还是离线呢&#xff1f;这个时候就需要一个油猴脚本&#xff0c;作用于iconify官网&#xff0c;对离线图标进行标识。 此篇文章主要从如下几点去梳…

【算法】动态规划之背包DP问题(2024.5.11)

前言&#xff1a; 本系列是学习了董晓老师所讲的知识点做的笔记 董晓算法的个人空间-董晓算法个人主页-哔哩哔哩视频 (bilibili.com) 动态规划系列 【算法】动态规划之线性DP问题-CSDN博客 01背包 步骤&#xff1a; 分析容量j与w[i]的关系&#xff0c;然后分析是否要放…

【免费】在线识别通用验证码接口

模块优势价格5元1000次&#xff0c;每天免费100次api文档支持 使用量小的完全够用了 <?phpfunction Post_base64($base64_str){$url http://api.95man.com:8888/api/Http/Recog?Taken41******QK&imgtype1&len0 ; $fields array( ImgBase64>$base64_str); $ch…

【好困】磁场里的瞌睡虫:地磁暴真的会让我们感到疲倦吗?

【好困】磁场里的瞌睡虫&#xff1a;地磁暴真的会让我们感到疲倦吗&#xff1f; 写在最前面地磁暴真的会让我们感到疲倦吗&#xff1f;一探究竟地磁暴是什么&#xff1f;地磁暴如何影响人体&#xff1f;结论 &#x1f308;你好呀&#xff01;我是 是Yu欸 &#x1f30c; 2024每…

18 分页:介绍

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

前端笔记-day03

文章目录 01-初始CSS02-CSS引入方式03-标签选择器04-类选择器05-id选择器06-通配符选择器07-画盒子08-字体大小09-文字粗细10-字体倾斜11-行高12-行高垂直居中13-字体族14-font复合属性15-文本缩进16-文本对齐方式17-图片对齐方式18-文本修饰线19-文字颜色20-调试工具21-综合案…