Java I/O

2023-05-16

参考链接:https://blog.csdn.net/m0_71563599/article/details/125120982
https://www.cnblogs.com/shamo89/p/9860582.html
https://blog.csdn.net/weixin_48351326/article/details/125017750

整体结构
在这里插入图片描述

Java序列化

Java序列化定义: Java序列化是将对象转化为字节流的过程,以便将其存储在磁盘上或通过网络传输。在Java中,对象是在内存中存储的,因此无法在不进行序列化的情况下直接将其存储到磁盘或通过网络传输。序列化将对象转化为字节流,以便可以在磁盘上存储或通过网络传输,并且在需要时可以反序列化为Java对象。这使得Java程序可以在不同的机器和操作系统之间共享数据,并使得持久性存储成为可能。
Java序列化实现: 将被序列化的类实现Serialize接口,然后使用一个输出流来构造一个ObjectOutputStream对象,再使用ObjectOutputStream对象的write(Object obj)方法就可以将obj写出。

字节流

字节流在默认情况下是不支持缓存的,这意味着每调用一次read方法都会请求操作系统来读取一个字节,这往往会伴随着一次磁盘IO,因此效率会比较低。InputStream类中read的以字节数组为参数的重载方法本质上是循环调用read()方法。要使用内存缓冲区以提高读取的效率,应该使用BufferedInputStream。

字符流

字符流处理的基本单位是Unicode码元。通常用来处理文本数据。Java中的String类型默认就把字符以Unicode规则编码后存储在内存中。
输出字符流: 把要写入文件的字符序列(实际上是Unicode码元序列)转为指定编码方式下的字节序列,然后再写入到文件中。
输入字符流: 把要读取的字节序列按指定编码方法解码为相应字符序列(实际上是Unicode码元序列),从而存在内存中。

字符流和字节流的区别

  • 字节流操作的基本单位为字节;字符流操作的基本单位为Unicode码元。
  • 字节流默认不适用缓冲区;字符流使用缓冲区。
  • 字节流是用于处理二进制数据,它通常用来处理任意类型的数据,但它不支持直接写入活读取Unicode码元;字符流通常处理文本数据,它支持写入及读取Unicode码元。

什么时候应该选择字节流,什么时候应该选择字符流?

大多数情况下使用字节流会更好,因为大多时候I/O操作都是直接操作磁盘文件。如果对于操作需要通过I/O在内存中频繁处理字符串的情况下使用字符串会好些,因为字符流会使用缓冲区提高性能。
如果是音频文件、图片、歌曲用字节流比较合适,如果是文本的,用字符流比较合适。

什么是缓冲区?有什么作用?

缓冲区是一段特殊的内存区域,用来缓冲输入或输出的数据。为了提升性能将一部分数据暂时读写到缓冲区,以后直接从此区域中读写数据。

流是怎么关闭的?

流一旦打开就必须关闭,使用close方法,放入finally语句块中,多个处理流互相调用只需要关闭最外层的流。

什么是节点流,什么是处理流,它们各有什么用处,处理流的创建有什么特征?

节点流: 直接与数据源或目的地进行交互,它们提供了一种直接的方式来读取或写入数据。节点流通常与文件、套接字等 I/O资源直接关联。
处理流: 是基于节点流构建的,它们提供了更高层次的数据处理功能。处理流通常与节点流链接起来使用,使得数据在读取或写入时可以经过一系列处理,比如缓冲、压缩、加密等操作,从而提高数据处理的效率和安全性。
处理流的创建有以下特征:

  • 处理流必须建立在一个已有的节点流之上。也就是说,处理流无法独立存在,必须与底层的节点流链接在一起使用。
  • 处理流通常是装饰器模式的典型应用,因为处理流可以对底层节点流进行功能扩展,而不需要修改节点流的代码。
  • 处理流可以按照需要进行堆叠。也就是说,可以将多个处理流链接在一起形成处理流的链条,以便实现更复杂的数据处理操作。
    节点流和处理流各有不同的用途:
    节点流用于直接与底层数据源或目的地进行交互,适合于处理原始的二进制数据和文本数据。比如FileInputStream和FileOutputStream可以用于读取和写入文件,SocketInputStream和SocketOutputStream可以用于与套接字进行交互。

处理流用于对底层数据进行加工处理,提高处理的效率和安全性。比如BufferedInputStream和BufferedOutputStream可以用于提高读写文件的效率,GZIPInputStream和GZIPOutputStream可以用于压缩和解压缩数据,ObjectInputStream和ObjectOutputStream可以用于序列化和反序列化对象等。

PrintStream、BufferedWriter、PrintWriter的比较?

  • 处理方式不同:PrintStream和PrintWriter会自动刷新输出缓冲区,而BufferedWriter需要手动调用flush()方法才能将缓冲区的数据输出到目的地。
  • 异常处理方式不同:PrintStream和PrintWriter不会抛出IOException异常,而BufferedWriter发生异常会抛出IOException或UncheckedIOException。
  • 性能和效率不同:BufferedWriter在输出大量数据时,由于数据先被缓冲到内存中,因此具有更高的性能和效率。PrintStream和PrintWriter在输出大量数据时,由于数据需要转换成字符,因此可能会导致性能和效率的下降。
  • 数据输出方式不同:PrintStream和PrintWriter可以输出任意类型的数据,而BufferedWriter只能输出字符数据。另外,PrintStream和PrintWriter输出的数据是通过字节流转换成字符后输出的,而BufferedWriter输出的数据是直接写入字符缓冲区中的。
    综上所述,如果需要输出大量数据,且性能和效率比较重要,可以使用BufferedWriter;如果需要输出任意类型的数据,并且异常处理比较简单,可以使用PrintStream或PrintWriter。另外,如果需要将输出数据转换成字符串并进行操作,可以使用PrintWriter。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java I/O 的相关文章

  • 为什么会出现此异常 FileItemStream$ItemSkippedException?

    在 gwt Web 应用程序中 我必须发送一个文件和附加的一些参数 在服务器端 try ServletFileUpload upload new ServletFileUpload FileItemIterator iterator upl
  • 我在socket上设置了超时,发现这个值不能大于21

    我在socket上设置了超时 该值小于21秒才有效 21秒后发现超时还是21秒 public static void main String args SimpleDateFormat sdf new SimpleDateFormat yy
  • Java - 如何将特殊字符放入字符串中

    Java 似乎有很好的字符串处理能力 尽管如此 我还是遇到了最简单的问题 我需要动态字符串 它们在运行时更改 因此字符串类型不是一个好的选择 因为它们是不可变的 所以我使用字符数组 设置起来有点痛苦 但至少它们是可以修改的 我想创建一个字符
  • 位图内存不足错误

    我对这个错误有疑问 我从 URL 制作网站图标解析器 我这样做是这样的 public class GrabIconsFromWebPage public static String replaceUrl String url StringB
  • JavaFX 图像未在舞台中显示

    我尝试了很多次 尝试了很多方法 但都无法让自己的形象在舞台上如我所愿 我认为这可能与java寻找资源的路径有关 但我不确定 因为我刚刚开始使用视觉库 在本例中为JavaFX 这是我的目录结构 MyProject assets img myI
  • 手动编辑 Jar 以更改包名称

    我有一个来自外部源的 jar 文件 jar 中的所有类都位于 com xyz 包中 我想将所有类移动到 com xyzold 包中 这是否像解压缩 jar 将 xzy 文件夹重命名为 xyzold 并重新压缩它一样简单 或者我还需要修改每个
  • Google App Engine with Java - 运行 javac.exe 编译器时出错

    在 Windows XP 上 刚刚下载并解压谷歌应用程序引擎java sdk to C Program Files appengine java sdk 我已经安装了jdk C Program Files Java jdk1 6 0 20
  • 如何开始使用 Chainsaw for Log4j?

    我想开始使用 Chainsaw v2 几乎没有关于它的信息 我只找到了this http www velocityreviews com forums t140105 help using chainsaw for log4j html 但
  • 字符串池可以包含两个具有相同值的字符串吗? [复制]

    这个问题在这里已经有答案了 字符串池可以包含两个具有相同值的字符串吗 String str abc String str1 new String abc Will the second statement with new operator
  • JTable 和 JScrollpane 大小的问题

    我有一个JScrollPane with a JTable在里面 在里面JTable我最初有 3 行 稍后添加行 默认JTable我的 3 行很难看 因为JScrollPane calls getPreferredScrollableVie
  • 线程“main”中的异常 java.lang.StackOverflowError

    我有一段代码 但我无法弄清楚为什么它在线程 main java lang StackOverflowError 中给出异常 这是问题 Given a positive integer n prints out the sum of the
  • Intellij 中的 Google OR-Tools:UnsatisfiedLinkError

    我正在建立一个应该使用 Google OR Tools 的 java 框架 下面的代码编译成功 但在运行时抛出异常 Exception in thread main java lang UnsatisfiedLinkError com go
  • 创建正则表达式匹配数组

    在Java中 我试图将所有正则表达式匹配返回到一个数组 但似乎您只能检查模式是否匹配某些内容 布尔值 如何使用正则表达式匹配来形成与给定字符串中的正则表达式匹配的所有字符串的数组 4城堡的回答 https stackoverflow com
  • 使用 secp256r1 曲线和 SHA256 算法生成 ECDSA 签名 - BouncyCastle

    我正在尝试使用带有 secp256r1 曲线 P256 的 ECDSA 和用于消息哈希的 SHA256 算法生成签名 我也在使用 Bouncy Castle 库 下面的代码 public class MyTest param args pu
  • 使用 JAD 反编译 java - 限制

    我正在尝试使用 Java 中的 JAD 反编译几个 jar 文件 我也尝试过 JD GUI 但运气更差 但出现了很多错误 一种类型 易于修复 似乎是内部类 但我也发现了这段代码 static int SWITCH TABLE atp com
  • 警告:无法更改每个人的权限:

    当运行 Java 快速入门示例时https developers google com drive web quickstart java hl hu https developers google com drive web quicks
  • 如何用表达式语言获取布尔属性?

    如果我有一堂这样的课 class Person private int age public int getAge return age public boolean isAdult return age gt 19 我可以得到age像这样
  • 无法使用 wget 在 CentOS 机器上安装 oracle jdk

    我想在CentOS上安装oracle java jdk 8 我无法安装 java jdk 因为当我尝试使用命令安装 java jdk 时 root ADARSH PROD1 wget no cookies no check certific
  • 摩尔斯电码 至 英语

    我现在的问题是让 摩尔斯电码转英语 正常工作 将英语转换为莫尔斯电码的第一部分工作正常 我知道以前已经有人问过这个问题 但我不知道我做错了什么 我知道我需要在某个地方进行拆分 但我只是不确定将其放在代码中的何处 现在 莫尔斯电码到英语的部分
  • 防止Java实例化的正确方法[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi

随机推荐

  • RealSR真实场景超分

    一 Camera Lens Super Resolution 本文主要解决RealSR的数据问题 xff0c 通过控制镜头到物体的距离产生成对的真实数据 xff08 Real paired SR data xff09 xff08 1 xff
  • 5374. 长度为 n 的开心字符串中字典序第 k 小的字符串(回溯算法)

    5374 长度为 n 的开心字符串中字典序第 k 小的字符串 List lt String gt res 答案集合不能定义为StringBuilder类型 剩下的就是回溯算法 span class token keyword class s
  • 宝塔忘记端口,解决办法

    1 xff0c 登陆远程连接 xff0c 输入ll 2 输入cd后再ll 3 清下屏 xff0c 输入clear 4 xff0c 输入cd www server panel data 找到port pl 5 输入cat port pl查看端
  • 幽冥传奇

    JAVA环境添加 setx M JAVA HOME D YM cnmmm com bl20166 Java jdk1 8 0 144 setx M CLASSPATH JAVA HOME lib dt jar JAVA HOME lib t
  • TOR下载教程

    不想用自己浏览器ip访问可用以下设置 xff0c 当然有很多其他方法 1 xff0c 官网https www torproject org 2 xff0c 下载对应版本 3 xff0c 打开tor 洋葱浏览器 并选择config 4 lin
  • 几步搞懂cobalt strike启动

    很多人问Cobalt strike怎么启动 xff0c 总结几句 1 cmd管理员身份运2 切换到CS所在目录3 输入ipconf找到自己ip地址4 输入teamserver 自己ip 密码 回车即可5 打开start bat文件再点击确定
  • TOR下载和网桥配置教程

    不想用自己浏览器ip访问可用以下设置 xff0c 当然有很多其他方法 1 xff0c 官网https www torproject org 2 xff0c 下载对应版本安装即可 本节以windows为例 xff08 苹果 安卓手机都有对应a
  • XSS漏洞,通过XSS实现网页挂马

    今天讲下通过XSS实现网页挂马 xff0c 目的是了解安全方面知识 xff0c 提升生活网络中辨别度 原理 xff1a 实验分为两部分 xff1a 1 通过Kali linux xff0c 利用MS14 064漏洞 xff0c 制作一个木马
  • qt样式有时不生效问题分析

    qt 中的样式表非常方便 xff0c 可以自定义自己想要的控件 但是有时候会发现使用样式表时 xff0c 样式不会生效 接下来分析一下主要原因 xff1a 1 样表格式不正确 2 样式表的样式被子对象覆盖 xff0c 设置时注意作用对象 x
  • 逻辑回归案例

    应用案例 之前学习了逻辑回归 xff0c 我们现在来做一个案例 一个图片验证码识别的案例 xff1a 怎么从图片中准确的识别出正确的数字 我们分了三步 第一步 xff1a 先生成150验证码图片 xff0c 每个图片有5个数字 图片中有随机
  • CorelDRAW x4提示非法软件产品被禁用解决方法教程

    说起PS大部分人都有所耳闻 xff0c 甚至会一些简单的操作 但是CDR x4这名字相信有很多人就很陌生了 xff0c 所以在这里也很有必要先说一下CDR到底是个什么样的存在 CDR全名CorelDRAW xff0c 是加拿大Corel公司
  • Mybatis-Plus中分页插件PaginationInterceptor, MybatisPlusInterceptor在SpringBoot中的使用

    配置分页插件 span class token annotation punctuation 64 Configuration span span class token keyword public span span class tok
  • 矩阵连乘问题-构造最优解

    题目描述 使用动态规划算法求解矩阵连乘问题 输入 每组数据包括两行 xff0c 第一行为数组长度n xff0c 第二行为存储矩阵维数的一维数组 输出 矩阵连乘最优计算次序 样例输入 Copy 7 30 35 15 5 10 20 25 样例
  • 树莓派启动——安装+无显示器使用+自启动VNC

    目录 硬件准备软件准备写入系统启动树莓派换源VNC自启动 时隔一年多 xff0c 拿起树莓派却忘记如何使用了 本想用作自己搭建git服务器 xff0c 后续再完成了 在此记录一下使用流程 硬件准备 树莓派 3b 43 TF卡和读卡器 xff
  • Debain 10(Buster)换源

    Debain 10 Buster 换源的操作步骤 必要条件 xff1a 已经安装好的Debain 10 Buster 开始 Debain 10 Buster 换源的操作步骤步骤一 备份原始的源文件用户切换到root下 进行源文件备份 二 换
  • 使用nginx反向代理突然失灵

    之前使用nginx反向代理还好好的 xff0c 后来再启动项目时突然失灵 xff0c 浏览器显示如下 然后开始排查错误 xff0c 首先直接使用ip地址访问是正常的 xff0c 然后使用hosts中映射的域名访问是无效的 xff0c 这说明
  • win10 安装 Linux子系统(WSL)

    序 xff1a 前段时间字节不是发布了 modernJS 的开源项目吗 xff1f 大概看了一部分的内容 xff0c 这些的东西就不一一列出来了 xff0c 本来想尝一口的 xff0c 在环境准备的系统那里就先折了一下 xff08 目前支持
  • Java 集合

    ArrayList 默认长度为10 indexOf lastIndexOf 通过equals方法判断索引 span class token keyword public span span class token keyword int s
  • Java 多线程知识

    参考链接 xff1a https www cnblogs com kingsleylam p 6014441 html https blog csdn net ly0724ok article details 117030234 https
  • Java I/O

    参考链接 xff1a https blog csdn net m0 71563599 article details 125120982 https www cnblogs com shamo89 p 9860582 html https