网站平台选择,商务网站建设ppt模板,中企动力是外包公司吗,东莞网站设计与网站制作咦咦咦#xff0c;各位小可爱#xff0c;我是你们的好伙伴 bug菌#xff0c;今天又来给大家手把手教学Java SE系列知识点啦#xff0c;赶紧出来哇#xff0c;别躲起来啊#xff0c;听我讲干货记得点点赞#xff0c;赞多了我就更有动力讲得更欢哦#xff01;所以呀… 咦咦咦各位小可爱我是你们的好伙伴 bug菌今天又来给大家手把手教学Java SE系列知识点啦赶紧出来哇别躲起来啊听我讲干货记得点点赞赞多了我就更有动力讲得更欢哦所以呀养成先点赞后阅读的好习惯别被干货淹没了哦~ 本文收录于「滚雪球学Java」专栏专业攻坚指数级提升希望能够助你一臂之力帮你早日登顶实现财富自由同时欢迎大家关注收藏订阅持续更新中upupup 环境说明Windows 10 IntelliJ IDEA 2021.3.2 Jdk 1.8文章目录 前言摘要正文简介源代码解析InputStream类OutputStream类BufferedInputStream类BufferedOutputStream类 应用场景案例文件复制 优缺点讲解优点分析缺点分析 类常用方法介绍InputStream类OutputStream类BufferedInputStream类BufferedOutputStream类 测试用例测试代码测试代码分析测试结果 小结 全文总结附录源码 ☀️建议/推荐你关于我 前言 首先我们都知道输入输出流是Java SE开发中非常重要的一个组成部分它们可以让程序与外部环境进行数据的交互若无进行数据交换则无法动态展示数据。借此本文将深入探讨JavaSE中的输入输出流机制并通过详细的源代码解析和实际应用场景案例帮助大家全面理解JavaSE输入输出流的原理和用法这对日常工作中的你或者即将步入职场的你都及其有帮助。
摘要 JavaSE针对输入输出流它提供了非常丰富的类和方法供日常处理各种类型的数据流动。通过输入流我们可以读取外部数据到程序中拿到数据再进一步操作等而对应输出流我们可以将程序中的数据输出到外部环境。这里大家需要理解和灵活运用 Java之输入输出流这也是身为Java开发人员(程序猿)必备的技能毕竟我入社会也是从这些知识点学起的。
正文
简介 首先大家需要明确知道一点JavaSE的输入输出流它是属于面向字节的流是基于抽象类InputStream和OutputStream以及相应的子类来实现的。数据流动的核心是字节流而JavaSE中就提供了许多类和方法供大家可方便的操作字节流。下面我们将对JavaSE输入输出流的一些常用类进行源码解析及实战演示以便于同学们加深理解。
源代码解析
InputStream类 InputStream首先它是一个抽象类它定义了读取字节流的基本方法和属性比如read()、skip(long n)、read(byte[] b, int off, int len)、close()等除了这些基本的读取方法外InputStream还提供了一些其他方法比如mark(int readlimit)和reset()方法允许在流中标记一个位置并在需要时返回到该位置。它常用的子类有FileInputStream和ByteArrayInputStream。其中FileInputStream可以从文件中读取数据而ByteArrayInputStream则可以从字节数组中读取数据。
源码部分截图如下示意 需要注意的是由于InputStream是一个抽象类它是不能直接实例化只能通过其子类来实现具体的输入流。
OutputStream类 OutputStreamInputStream类一样也是一个抽象类它定义了写入字节流的基本方法。常用的子类有FileOutputStream和ByteArrayOutputStream我们可以使用它的子类来读取和写入字节流。其中FileOutputStream可以将数据写入到文件中而ByteArrayOutputStream则可以将数据写入到字节数组中这点我们在后面会直接演示给大家看这里就不详细赘述了。 对于OutputStream类它的主要子类有参考如下
FileOutputStream用于将数据写入文件。ByteArrayOutputStream用于将数据写入字节数组。FilterOutputStream用于添加过滤器功能例如数据压缩或加密。DataOutputStream用于将基本数据类型写入输出流。ObjectOutputStream用于将对象写入输出流。 接着OutputStream类定义了以下常用方法仅供参考
write(int b)将一个字节写入输出流。write(byte[] b)将一个字节数组写入输出流。write(byte[] b, int off, int len)将一个指定长度的字节数组的一部分写入输出流。flush()刷新输出流确保所有缓冲的字节都被写入输出流。close()关闭输出流释放相关的资源。
BufferedInputStream类 BufferedInputStream它是InputStream类的装饰者类它提供了带缓冲功能的读取方法可以提高读取效率。BufferedInputStream内部维护了一个缓冲区当需要读取数据时先从缓冲区读取如果缓冲区没有数据则从底层流中读取新的数据。
BufferedOutputStream类 BufferedOutputStream它是OutputStream的装饰者类它提供了带缓冲功能的写入方法可以提高写入效率。BufferedOutputStream内部维护了一个缓冲区当需要写入数据时先将数据写入到缓冲区当缓冲区满了或者需要刷新时再将缓冲区的数据写入到底层流中。
应用场景案例 接下来我们就通过几个案例由浅入深式的带着大家从理论过渡到实践中去帮助大家更好的通过实践来理解理论知识点“实践是检验真理的唯一标准”毛爷爷曾言接下来便开始实践部分。
文件复制 首先我们先通过使用输入输出流实现一个文件的复制功能这里大家可以先思考一下不太能想到的也没关系可以接着看下边的。 实现思路大致步骤如下首先我们可以使用FileInputStream类创建一个输入流然后再使用FileOutputStream创建一个输出流通过循环的方式依次读取输入流中的数据并将其写入到输出流中这样一个就可以实现文件的复制是不是很简单呢接着大家来参考下我写的代码。
package com.demo.javase.day74;import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;/*** Author bug菌* Date 2023-12-27 16:51*/
public class FileCopy {public static void main(String[] args) {try {FileInputStream in new FileInputStream(source.txt);FileOutputStream out new FileOutputStream(target.txt);byte[] buffer new byte[1024];int length;while ((length in.read(buffer)) ! -1) {out.write(buffer, 0, length);}in.close();out.close();System.out.println(文件复制成功);} catch (IOException e) {e.printStackTrace();}}
}
代码详细分析 如上代码它是一个文件复制的程序实现功能就是将source.txt文件内容复制到target.txt文件中具体实现思路如下不太懂的同学这里要着重听 首先是引入了java.io中的相关类用于文件的输入和输出操作这里大家肯定都能懂。 其次定义一个main函数在main方法中通过FileInputStream来创建一个输入流对象in并将源文件source.txt作为参数传递给它。 同样地再通过FileOutputStream来创建一个输出流对象out并将目标文件target.txt作为参数传递过去。 创建一个字节数组buffer用于存储读取到的文件数据。 依次循环使用in.read(buffer)方法来读取文件中的内容并将读取到的字节数保存在length变量中是不是能懂。 然后呢我们就要通过判断length的值如果值不为-1表示还有数据可以读取没读取完则使用out.write(buffer, 0, length)方法将读取到的数据继续写入目标文件即可。 然后这里循环继续那什么时候循环结束呢很简单就是判断length的值等于-1时即文件读取完这里直接跳过循环。 最后记得关闭输入流和输出流(如果不关呢其实大家也需要知道如下我单独给大家做个拓展。)。
拓展一下
如果不关闭输入流和输出流可能会导致以下问题 资源泄漏输入流和输出流占用系统资源如果不关闭它们将导致资源无法被释放和复用最终可能导致系统性能下降或崩溃。 内存泄漏输入流和输出流需要占用一定的内存空间如果不关闭它们可能会导致内存泄漏问题即占用的内存空间无法被释放导致内存溢出。 数据丢失如果未关闭输出流可能会导致数据未完全写入到磁盘或目标文件中从而导致数据丢失。 数据损坏如果未关闭输出流和输入流可能会导致数据在传输过程中发生错误或被破坏导致数据的完整性受到影响。 接着我们给个文字提示输出文件复制成功。 最后捕获可能抛出的IOException异常并打印异常信息。 以上就是该程序代码实现文件复制功能的思路了总的来说就是使用了字节数组作为中间存储器从输入流读取数据然后通过输出流写入数据到目标文件中非常的简单。
优缺点讲解
优点分析
输入输出流它提供了灵活的访问外部数据的方式可以读取和写入各种类型的数据。输入输出流它可以处理大数据量通过缓冲区的使用可以提高读写效率。输入输出流的接口和方法简单易用对于开发人员来说学习成本较低。
缺点分析
使用输入输出流操作文件需要处理异常繁琐而且容易出错这点实际操作中确实。输入输出流只能处理字节流对于字符数据需要进行字符编码的转换。
类常用方法介绍 接着我给同学们梳理下InputStream、BufferedInputStream等类的常用方法介绍方便大家对比及区分方法。
InputStream类
常用方法包括
int read()读取一个字节的数据。int read(byte[] buffer)读取一组字节的数据并存储到指定的字节数组中。void close()关闭输入流。long skip(long n)跳过n个字节的数据并返回实际跳过的字节数。如果已经到达流的末尾则返回0。int available()返回输入流中可以读取的字节数。 如上这些方法可以用来从输入流中读取数据并处理流的末尾、跳过字节、获取可读字节数等操作具体演示我们往下看。
OutputStream类
常用方法包括
write(int b)将一个字节写入输出流。write(byte[] b)将一个字节数组的所有字节写入输出流。write(byte[] b, int off, int len)将字节数组的一部分字节写入输出流从偏移量off开始写入len个字节。flush()刷新输出流将缓冲区中的数据强制写入输出流。close()关闭输出流释放与之关联的系统资源。flush()和close()方法都会自动调用write()方法将缓冲区中的数据写入输出流。
BufferedInputStream类
常用方法包括 public int read() throws IOException从输入流中读取一个字节并返回读取的字节的整数表示。如果已到达流的末尾则返回-1。 public int read(byte[] b, int off, int len) throws IOException从输入流中读取最多len个字节到字节数组b的指定偏移量off处返回实际读取的字节数。如果已到达流的末尾则返回-1。 public long skip(long n) throws IOException从输入流中跳过n个字节的数据并返回实际跳过的字节数。 public int available() throws IOException返回可以从输入流中读取的字节数。 public synchronized void mark(int readlimit)在当前位置设置一个标记点。 public synchronized void reset() throws IOException将流重置到上次设置的标记点。
BufferedOutputStream类
void write(int b)写入一个字节的数据。void write(byte[] buffer)写入一组字节的数据。void flush()刷新输出流将缓冲区的数据写入到底层流中。void close()关闭输出流。
测试用例 如下到了大家最激动人心的阶段实战环节检验下大家理论基础到底学习及掌握的如何所以这里我给大家通过几个测试用例尽可能的使用到它们的一些常规方法运用到实际代码中去以辅助大家理解。
测试代码 这里我定义了一个MyInputStream类具体测试代码如下在阅读我写的代码的同时可以思考下我写的内容有何目的性运用到了那些常规知识点代码如下
package com.demo.javase.day74;import java.io.IOException;
import java.io.InputStream;/*** Author bug菌* Date 2023-12-27 16:48*/
public class MyInputStream extends InputStream {private byte[] data {1, 2, 3, 4, 5};private int pos 0;Overridepublic int read() throws IOException {if (pos data.length) {return data[pos];} else {return -1;}}
}不知道大家看懂了我写的这段测试代码没其实很简单的无非就是模拟读取数据流。接着我来给大家详细分析一下这段代码的完整思路
代码分析 我先自定义了一个的InputStream类MyInputStream继承自java.io.InputStream。该类重写了InputStream的read()方法实现了从一个固定的byte数组data中读取数据的功能。 在MyInputStream类中定义了一个私有的byte数组data用于存储数据。还定义了一个私有的整型变量pos用于记录读取data中的位置。 在重写的read()方法中首先判断pos是否小于data的长度如果是表示还有数据可以读取就返回data[pos]对应的字节并将pos。如果pos等于或大于data的长度表示已经读取完所有数据返回-1。 总之则这个MyInputStream类功能就是用于模拟读取数据流在每次调用read()方法都可以读取data数组中的下一个字节仅此而已你们也可以拓展下。 接着我再定义一个MyOutputStream.java大家可以先看从代码中理解这段代码干了件什么事具体实现代码如下
package com.demo.javase.day74;import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;public class MyOutputStream extends OutputStream {private ByteArrayOutputStream buffer new ByteArrayOutputStream();Overridepublic void write(int b) throws IOException {buffer.write(b);}public byte[] getData() {return buffer.toByteArray();}
}
代码分析 这里我给大家也解读下理解这段代码实现了如何功能大家请看
首先在 MyOutputStream类中有一个成员变量buffer它是一个ByteArrayOutputStream类型的对象。ByteArrayOutputStream类是一个在内存中创建字节数组缓冲区的输出流可以将数据写入到内存中的字节数组中。MyOutputStream类重写了write方法该方法将传入的字节写入到buffer中。getData方法返回buffer的字节数组表示形式。 总之这段代码定义了一个自定义的输出流类MyOutputStream它可以将数据写入到内存中的字节数组中并可以获取该字节数组的数据你们学废了么。
测试3
最后再次给大家演示下测试输入流和输出流类的实际操作。
package com.demo.javase.day74;import java.io.IOException;/*** Author bug菌* Date 2023-12-27 16:49*/
public class Test {public static void main(String[] args) {try {MyInputStream in new MyInputStream();MyOutputStream out new MyOutputStream();int b;while ((b in.read()) ! -1) {out.write(b);}in.close();out.close();byte[] data out.getData();for (byte d : data) {System.out.print(d );}} catch (IOException e) {e.printStackTrace();}}
}测试代码分析 根据如上测试用例在此我给大家进行深入详细的解读一下测试代码以便于更多的同学能够理解并加深印象。 这段代码主要是测试自定义的输入流和输出流类。在主方法中首先创建一个MyInputStream对象和一个MyOutputStream对象。然后通过循环从输入流中读取字节并将其写入到输出流中。在读取和写入的过程中如果读取的字节等于-1即表示输入流已经读取完毕循环结束。接着调用输入流和输出流的close()方法关闭流。 然后通过调用输出流的getData()方法获取输出流中的数据并将数据以字节数组的形式存储在data数组中。最后通过遍历data数组将每个字节打印输出。 需要注意的是在上述代码中使用了try-catch块来捕获IOException异常。如果在读写过程中发生异常将会打印异常信息。
测试结果 根据如上的测试用例作者在本地进行测试结果如下仅供参考你们也可以自行修改测试用例或者添加其他的测试数据或测试方法以便于进行熟练学习以此加深知识点的理解。 小结 在此给大家做个小结本文着重演示了并深入理解JavaSE输入输出流的原理和用法通过源代码解析和实际应用案例的介绍可以帮助大家更好地掌握输入输出流的知识。输入输出流在Java开发中非常重要对于处理外部数据流动具有重要作用。
全文总结 总而言之JavaSE输入输出流作为Java开发中不可或缺的部分通过对InputStream、OutputStream、BufferedInputStream和BufferedOutputStream等类的源代码解析我们可以了解了它们的基本原理和用法。通过如上的应用场景案例讲解我们能够更加清楚输入输出流在实际开发中的应用价值。掌握输入输出流的知识对于Java开发人员来说是非常重要的所以说大家听我讲一定可以轻松掌握。 … … 好啦这期的内容就基本接近尾声啦若你想学习更多你可以看看专栏的导读篇《「滚雪球学Java」教程导航帖》本专栏致力打造最硬核 Java 零基础系列学习内容打造全网精品硬核专栏带你直线超车欢迎大家订阅持续学习。功不唐捐久久为功
「赠人玫瑰手留余香」咱们下期拜拜~~
附录源码 如上涉及所有源码均已上传同步在「Gitee」提供给同学们一对一参考学习辅助你更迅速的掌握。
☀️建议/推荐你 无论你是计算机专业的学生还是对编程感兴趣的跨专业小白都建议直接入手「滚雪球学Java」专栏该专栏不仅免费bug菌还郑重承诺只要你学习此专栏均能入门并理解Java SE以全网最快速掌握Java语言每章节源码均同步「Gitee」你真值得拥有学习就像滚雪球一样越滚越大带你指数级提升。 码字不易如果这篇文章对你有所帮助帮忙给bugj菌来个一键三连(关注、点赞、收藏) 您的支持就是我坚持写作分享知识点传播技术的最大动力。 同时也推荐大家关注我的硬核公众号:「猿圈奇妙屋」 以第一手学习bug菌的首发干货不仅能学习更多技术硬货还可白嫖最新BAT大厂面试真题、4000G Pdf技术书籍、万份简历/PPT模板、技术文章Markdown文档等海量资料你想要的我都有 关于我
我是bug菌CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家C站博客之星Top30华为云2023年度十佳博主掘金多年度人气作者Top4051CTO年度博主Top12掘金/InfoQ/51CTO等社区优质创作者全网粉丝合计 20w硬核微信公众号「猿圈奇妙屋」欢迎你的加入免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料你想要的我都有关键是你不来拿。