java 的io流需要学吗_Java的IO流之字节流,必须要学得内容,你会嘛?

原标题:Java的IO流之字节流,必须要学得内容,你会嘛?

伙伴们~

端午节过的如何呀~

有没有很开心呀~

假期已过咱们继续开动了

IO流

先来认识一下IO流:

IO流用来处理设备之间的数据传输,Java对数据的操作是通过流的方式,用于操作流的类都在IO包中。

1)流按流向分为两种:

输入流,输出流。

2)流按操作类型分为两种:

字节流 :

字节流可以操作任何数据,因为在计算机中任何数据都是以字节的形式存储的

字节流的抽象父类:

InputStream/OutputStream

字符流 :

字符流只能操作纯字符数据,比较方便。

字符流的抽象父类:

Reader/Writer

3)IO程序书写规范

使用前,导入IO包中的类

使用时,进行IO异常处理

使用后,释放资源

字节流

今天我们先来认识一下字节流

1)FileInputStream

字节流的输入,使用read()方法一次读取一个字节

把文件 zzz.txt 中的字节读取到控制台上~因为a、b、c等英文字符在底层是用 ASC 码的数字表示的,所以我们在控制台上读取的结果是数字

注意:

read()方法的返回值是int

因为字节输入流可以操作任意类型的文件,比如图片音频等,这些文件底层都是以二进制形式的存储的。

如果每次读取都返回 byte,有可能在读到中间的时候遇到 {{111111111:0}}(byte类型的-1),read() 方法遇到 -1 就会停止不读,后面的数据也就读不到了,

所以在读取的时候用 int 类型接收,像{{11111111:0}}会在其前面补上24个0,凑足4个字节,那么 byte 类型的 -1就变成 int 类型的 255 了。这样可以保证整个数据读完,而结束标记的-1就是 int 类型。

2)FileOutputStream

字节输出流 write() 一次写出一个字节

fb8c6b29f1fe33dad7af0120f166d2a3.png

把字节写入到文件 yyy.txt 中

注:

1)如果不存在 yyy.txt 这个文件,程序会自动创建一个 yyy.txt

2)因为在执行 FileOutputStream() 方法的时候,会先把文件里面的内容清空,然后再来把我们要写的东西写入~

如果我们想要不删出文件里面的内容而是追加内容该如何做呢?

在FileOutputStream的构造方法中,有一个构造方法,存在一个appen参数,表示追加的意思,我们在这边设置一个 true ,表示我们是追加内容就可以了~

be266b12a923f68c8d6e588d7b930df8.png

那么代码应该这样写~

f1eaadef0b18847543724b7c1f8066bc.png

字节流的拷贝

现在输入输出我们都掌握了,就可以搞事情了,我们来做一个拷贝图片的练习吧~

1)逐个字节的拷贝方式

这样就可以把图片copy了一份了~

上面这种通过逐个字节拷贝文件的方式,对小一点的文件还好,当对大一点文件进行拷贝的时候速度就会慢下来——效率太低~(在实际的开发中我们不考虑)

2)利用available()拷贝方法

查看API有如下的介绍

6c597382b5f36e2586f197100413dfbd.png

大致意思就是,available()方法可以获取到我们将要 copy 的文件的所有字节个数~这样我们就可以一次性读取需要copy的文件的数据,然后在一次性的输出出来~

00bbea9402615479d8c233799fe61870.png

但是这种方式也有一个弊端,比如我们想拷贝一个大一点的文件(像蓝光电影这种有10+G大~),那么我们在拷贝之前就需要创建一个10+G大小的数组,要知道这些程序都是放在Java虚拟机中运行的,而Java虚拟机是虚拟在计算机的内存中(内存也不会全给Java虚拟机,一般Java的虚拟机也就100+M)就可能会导致内存溢出~,所以一般也是不推荐的~

3)定义小数组拷贝方式

736ddfe8afdf6e8ef4fb224778438784.png

这个方法综合了上面的两种方式~

所以推荐这种方式来拷贝文件

4)利用缓冲思想进行拷贝

字节流一次读写一个数组的速度明显比一次读写一个字节的速度快很多,这是加入了数组这样的缓冲区效果,java本身在设计的时候,也考虑到了这样的设计思想,所以提供了字节缓冲区流

93fa20eea9e775a05137a2611b413771.png

带缓冲的拷贝

1)BufferedInputStream 内置了一个缓冲区(数组),BufferedInputStream 会一次性从文件中读取8*1024个,存在缓冲区中,程序在读取时,就不用找文件了,直接从缓冲区中获取,直到缓冲区中所有的数据都被读取过,BufferedInputStream才重新从文件中读取8*1024个。

2)BufferedOutputStream也内置了一个缓冲区(数组),程序向流中写出字节时,不会直接写到文件,先写到缓冲区中,直到缓冲区写满,BufferedOutputStream 才会把缓冲区中的数据一次性写到文件里。

那么小数组的读写和带Buffered的读取哪个更快?

定义小数组如果是8*1024个字节大小和B uffered 比较的话,定义小数组会略胜一筹,因为读和写操作的是同一个数组,而Buffered操作的是两个数组。

在缓冲中存在一个 flush() 刷新方法,可以把缓冲区中的内容输出来~

flush() 和 close() 方法的区别

(偷个懒,就不写代码演示了)

flush()方法

用来刷新缓冲区的,刷新后可以再次写出 。

close()方法

用来关闭流释放资源的的,如果是带缓冲区的流对象调用了 close() 方法,不但会关闭流,还会再关闭流之前刷新缓冲区,关闭后不能再进行写出操作~

流的标准处理异常代码

Java1.6版本及其以前的处理方式

try finally嵌套

原则就是当程序出现问题时,尽量把流关闭,不要占用资源~

bbdd0b66a492a3beba872abc73dafb5b.png

Java 1.7的版本以后的写法

4f27a8d770d506113c2241be26ac414c.png

原理

在 try() 中创建的流对象必须实现了 AutoCloseable 这个接口,实现了 AutoCloseable 接口以后 , 在 try 后面的大括号 {}中的读写代码执行后,就会自动调用流对象的 close 方法将流关掉~ 返回搜狐,查看更多

责任编辑:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/512234.shtml

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

相关文章

为什么大家都在抵制用定时任务实现「关闭超时订单」功能?

作者 | 阿Q来源 | 阿Q说代码前几天领导突然宣布几年前停用的电商项目又重新启动了,让我把代码重构下进行升级。让我最深恶痛觉的就是里边竟然用定时任务实现了“关闭超时订单”的功能,现在想来,哭笑不得。我们先分析一波为什么大家都在抵制用…

面对疾风吧,如何搭建高协同的精准告警体系?

简介: 想要实现AiOps,智能告警少不了。Arms 告警运维中心让面向告警的组织协同更加便捷高效! 作者|九辩 世上没有一个系统是百分之百尽善尽美的。如果想要保证可用性,那么技术团队就得对服务的各种状态了如指掌&…

KubeMeet|聊聊新锐开源项目与云原生新的价值聚焦点

简介: 10 月 16 日上海,OAM/KubeVela、OpenKruise、OCM 三大开源项目的社区负责人、核心贡献者和企业用户将齐聚 KubeMeet,和现场 100 名开发者聊聊新的技术环境和企业需求下,有关“云原生应用管理”的那些事儿。 随着云原生关注…

Redis 究竟适不适合当队列来用?

‍作者 | Magic Kaito来源 | 水滴与银弹我经常听到很多人讨论,关于「把 Redis 当作队列来用是否合适」的问题。有些人表示赞成,他们认为 Redis 很轻量,用作队列很方便。也些人则反对,认为 Redis 会「丢」数据,最好还是…

EDA 事件驱动架构与 EventBridge 二三事

简介: 事件驱动型架构 (EDA) 方兴未艾,作为一种 Serverless 化的应用概念对云原生架构具有着深远影响。当我们讨论到一个具体架构时,首当其冲的是它的发展是否具有技术先进性。这里从我们熟悉的 MVC 架构,SOA 架构谈起&#xff0c…

如果被问到分布式锁,应该怎样回答?

作者 | tech-bus.七十一来源 | 程序员巴士说到锁,在平时的工作中,主要是使用synchronized关键字,或者相关的一些类库来实现同步,但这都是基于单机应用而言的,当我们的应用多实例部署时,这时候就需要用到分布…

工业视觉智能实战经验之IVI算法框架2.0

简介: 工业视觉智能团队在交付了多个工业视觉智能质检项目后,发现了工业视觉智能的共性问题和解法,打造了工业视觉智能平台,通过平台的方式积累和提升工业视觉的通用能力。在平台建设上最核心的能力是算法能力。算法能力包括不断增…

技术干货 | jsAPI 方式下的导航栏的动态化修改

简介: 操作指导:通过 jsAPI 实现导航栏的动态修改。 很多开发同学在接入 H5 容器后都会对容器的导航栏进行深度定制,除了 Native 的定制化之外,还有很多场景是使用到 jsAPI 的方式,通过 jsAPI 实现导航栏的动态修改。 …

Gartner:企业机构需重新定义网络安全领导者角色

编辑 | 宋慧 供稿 | Gartner 根据Gartner的最新调查,由于网络风险责任已被转移到IT以外,并且日益分散的生态系统导致网络安全领导者正在失去对决策的直接控制权,企业机构需要重新定义网络安全领导者的角色。 如今,安全和风险管理…

成本直降50%,下一代网关震撼发布

简介: 在容器和K8s主导的云原生时代,网关的新形态变得逐渐清晰,阿里内部也孵化出了下一代的网关产品 - 云原生网关,已在支付宝、淘宝、优酷、口碑等业务成功上线,并且经历了2020双11大促海量请求的考验,目前…

备战“双11”,阿里云为企业提供一站式资源保障服务

简介: 阿里云弹性计算将上线资源保障服务,通过智能化资源诊断、推荐、资源预定及授权候补为用户提供一站式自助化资源保障服务,兼顾灵活,经济的同时还能获得时刻的确定性保障,为业务顺畅前行保驾护航。 报名体验资源保…

快速上手 Serverless | 入门第一课

简介: 本文从云计算抛砖引玉,详解 Serverless 的典型应用场景和一些产品介绍。 一、 从云计算到 Serverless 自世界上第一台通用计算机 ENIAC (图左)诞生以来,计算机科学与技术的发展就从未停止过前进的脚步。2003年-2006年,谷歌…

钉钉宜搭邵磊:钉钉宜搭低代码加速业务互联 让改变发生

简介: 近日,在2021“低代码技术发展与应用线上研讨会”上,钉钉宜搭产品总监邵磊带来了“钉钉宜搭低代码加速业务互联 让改变发生”的主题演讲,详细介绍了钉钉宜搭低代码产品的六大互联能力。 宜搭是今年1月份正式上线到钉钉&…

Cloudera发布全球企业数据成熟度报告,混合云趋势中有效数据战略是关键

编辑 | 宋慧 出品 | CSDN云计算 2022年3月初,企业数据云公司Cloudera近日发布与技术市场研究公司Vanson Bourne联合编写的全球企业数据战略研究报告,报告分别洞察了数据的使用和价值、企业数据战略、企业数据发展趋势、企业业务计划四大部分的内容&…

基于海量日志和时序数据的质量建设最佳实践

简介: 在云原生和DevOps研发模式的挑战下,一个系统从开发、测试、到上线的整个过程中,会产生大量的日志、指标、事件以及告警等数据,这也给企业质量平台建设带来了很大的挑战。本议题主要通过可观测性的角度来讨论基于海量日志和时…

阿里云RDS深度定制-XA Crash Safe

简介: 近几年,随着分布式数据库系统的兴起,特别是基于MySQL分布式数据库系统,会用到XA来保证全局事务的一致性。众所周知,MySQL对XA事务的支持是比较弱的,存在很多问题。为了满足分布式数据库系统对XA事务的…

java集合表_java集合类散列表

哈希表是种数据结构,它可以提供快速的插入操作和查找操作。第一次接触哈希表时,它的优点多得让人难以置信。不论哈希表中有多少数据,插入和删除(有时包括侧除)只需要接近常量的时间即0(1)的时间级。实际上,这只需要几条机器指令。…

庖丁解牛|图解 MySQL 8.0 优化器查询转换篇

简介: 本篇介绍子查询、分析表和JOIN的复杂转换过程 一 背景和架构 在《庖丁解牛-图解MySQL 8.0优化器查询解析篇》一文中我们重点介绍了MySQL最新版本8.0.25关于SQL基本元素表、列、函数、聚合、分组、排序等元素的解析、设置和转换过程,本篇我们继续…

Java 底层知识:什么是 “桥接方法” ?

作者 | 小志来源 | 程序员小灰导语笔者在最近的日常工作中,因业务需要,研究 Java 字节码层面的知识。具体是,需要根据类字节码,获取特定方法名的方法入参,此方法名在源码中只有一个。但是在实际使用中发现:…

ACMMM2021|在多模态训练中融入“知识+图谱”:方法及电商应用实践

简介: 随着人工智能技术的不断发展,知识图谱作为人工智能领域的知识支柱,以其强大的知识表示和推理能力受到学术界和产业界的广泛关注。近年来,知识图谱在语义搜索、问答、知识管理等领域得到了广泛的应用。 作者 | 朱渝珊 来源 |…