首页 > 编程语言 >Java从入门到放弃之 IO (三)------- 绝对看的懂,看不懂欢迎私信

Java从入门到放弃之 IO (三)------- 绝对看的懂,看不懂欢迎私信

时间:2024-11-21 15:14:37浏览次数:3  
标签:私信 功能 Java 子类 InputStream ------- IO 装饰

Java从入门到放弃之 IO (三)

Java从入门到放弃之 IO (三)

装饰器模式

在上一篇我们引入了装饰器模式的定义。那么这一章我们进一步,装饰器模式解决什么问题? 以及为什么Java IO要使用装饰器模式。

问题背景

我们现在都知道inputstream是基类,有很多继承这个基类的派生类。比如FileInputstream 还有下面一些等等的类
Input stream
如果现在我们需要给FileInputstream加上缓冲功能,怎么做呢?

BufferedFileInputStream extends FileInputStream

增加一个这样的类 继承自FileInputStream即可,这样可以达到我们的目的,没问题。

那如果再需要增加一个加密功能?

EncodeFileInputStream extends FileInputStream

只需要再增加一个这样的类,也可以达成我们的目的。

那如果我们需要增加一个缓冲加上加密呢?
又要增加一个这样的类

BufferedEncodeFileInputStream extends FileInputStream

这样下去的话,我们每增加一个功能就要增加很多子类,因为不光要增加对应功能的子类,还要考虑功能组合的子类;还有一个问题我们增加的这些功能很多是通用的对于IO来说,其他的InputStream的子类可能也有类似的需求,这样的话,其实我们需要加的子类就更多了。

解决方案就是引入装饰器模式

对于Java IO来说,我们将InputStream分为两大类,一类提供基础的数据,一类提供额外功能。

提供基础数据的InputStream

  • SocketInputStream
  • FileInputStream
  • 。。。

提供额外功能的InputStream

  • BufferedInputStream
  • DigestInputStream
  • 。。。

这样我们首先使用提供基础数据的InputStream提供数据流来源,然后在使用我们需要的额外功能的InputStream包装InputStream。
而且提供额外功能的InputStream 也是可以被InputStream引用。

** 代码使用案例**

InputStream file = new FileInputStream("test.txt");
InputStream buffered = new BufferedInputStream(file );
InputStream  digest = new DigestInputStream(buffered );

Java中有很多装饰类,有两个基类:过滤器输入流FilterInputStream和过滤器输出流FilterOutputStream。过滤类只是增加功能不改变原有类型(就像上面这句话额外功能的InputStream包装InputStream,而且提供额外功能的InputStream 也是被InputStream所引用)

  • 缓冲装饰的子类是BufferedInputStream和BufferedOutputStream。
  • 可以将基本类型、对象输出为其字符串表示的子类有PrintStream。

IO流关闭问题

我们知道我们通过JavaIO读取或者写入数据。比如数据在硬盘上,Java程序没有办法操作硬盘,所以需要操作系统的支持。所以当我们使用JavaIO的时候,不关JVM做了特定的处理,操作系统 也做了对应的支持。用完IO之后,JVM的内存,有垃圾回收器进行回收,但是JVM是运行在操作系统上的,它没有权限回收操作系统的内存资源。所以使用完IO之后,我们一定要记得调用close方法。

代码案例一

        OutputStream output = null;
        try{
            output =  new FileOutputStream("hello.txt");
            String data = "hello, world";
            byte[] bytes = data.getBytes(Charset.forName("UTF-8"));
            output.write(bytes);
        } catch (IOException e) {
            e.printStackTrace();
        } finally{
            try {
                output.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

代码案例二
JDK 1.7为了简化这种代码结构,引入了trywithresources的新特性

        try (InputStream inputStream = Test9.class.getResourceAsStream("/application.yml")) {
            if (inputStream == null) {
                System.out.println("null");
            }else {
                Properties properties = new Properties();
                properties.load(inputStream);
                System.out.println(properties);
            }
        } catch (Exception e) {

        } finally {
            System.out.println("finally");
        };

标签:私信,功能,Java,子类,InputStream,-------,IO,装饰
From: https://blog.csdn.net/Zongkunxue/article/details/143944341

相关文章

  • JAVA ClassLoader机制
    概要说明注:本篇文章是网上多篇文章的缝合,把我觉得写的不错的,对我理解ClassLoader有帮助的内容写到博客中,同时我尽量让一些学Java安全的同学更详细的学习ClassLoader。参考文章(1):https://www.cnblogs.com/luckforefforts/p/13642685.html-简短,可以快速了解ClassLoader概念和双......
  • vxe-table 集成 echarts 实现单元格图表功能,柱状图、饼图、折线图、右键菜单加载表格
    实现表格通过右键菜单渲染折线图、饼图、柱状图等<template><div><vxe-gridv-bind="gridOptions"@menu-click="menuClickEvent"></vxe-grid></div></template><script>exportdefault{data(......
  • Blender 4.3 (Linux, macOS, Windows) - 开源 3D 创意软件 (渲染 建模 雕刻)
    Blender4.3(Linux,macOS,Windows)-开源3D创意软件(渲染建模雕刻)Open-Source3DGraphicsAppIntroducesExperimentalVulkanBackend请访问原文链接:https://sysin.org/blog/blender/查看最新版。原创作品,转载请保留出处。作者主页:sysin.org创造的自由Blender......
  • Java爬虫与淘宝API接口:高效数据采集的结合
    目录引言一、淘宝API接口介绍二、请求淘宝API接口三、解析淘宝API返回的JSON数据四、存储淘宝商品数据五、注意事项结语引言在数字化时代,数据的价值日益凸显,尤其是在电商领域。淘宝作为中国最大的电商平台之一,拥有海量的商品数据。对于开发者而言,如何高效、准确地从......
  • Language:Solution must be completed in Java assignment contact me
    AssignmentDetailscotactmeonhelp-assignmentwe-we-chatDuedate:6thofDecember2024Language:SolutionmustbecompletedinJavaGameDescriptionDefenderisaclassicarcadegamewheretheplayerfiesaspaceshipdestroyingalieninvadersoverap......
  • Z-library免费图书下载网站使用指南与最新地址分享(长期更新)
    Z-Library(也被称为Z-Lib)是一个大型的在线数字图书馆和文件共享网站,有各种各样的书籍和学术文章提供免费下载。它的藏书量极其庞大,涵盖了多种语言和学科领域。zlibrary电脑客户端/安卓appzlibrary(windows/mac/安卓/ipad)安装包下载:https://pan.quark.cn/s/45d1c03ef62b(随......
  • VINS-Mono配置记录
    Ceres要安装与现有的Eigen3.3.7和CMake3.16.3兼容的CeresSolver,可以按照以下步骤操作:1.下载与Eigen3.3.7兼容的CeresSolver根据Eigen版本和CeresSolver的兼容性要求,推荐使用CeresSolver1.14,因为它支持Eigen3.3.x。你已经下载了CeresSolver1.14,因......
  • 分享个人在项目中使用过最强的企业级表格、顶级表格控件推荐 vxe-table
    专业的表格控件SpreadJS、ad-grid、vxe-table对比评测,仅对个人实际使用中的开发体验分享、仅供参考做过很多大型项目,ERP、企业内部管理系统,一个系统好不好用基本就是看表格做得好不好了。一般业务的列表页面、增删改查页面、表单页面等。总结实现Excel在线协同功能就选Spr......
  • SAP B1 重要单据字段介绍 - 常规设置(一)
    目录背景一、业务伙伴1.客户活动限制2.佣金设置依据3.审批流程4.默认值设定5.付款条件首选项6.其他设定7.一揽子协议背景在新建账套时往往需要对【常规设置】单据进行个性化定义,维护界面语言和颜色、新业务伙伴的缺省值、预算管理等常规设置。本系列文章将......
  • 国标GB28181-2016平台LiteGBS国标GB28181公网直播接入设备端怎么配置GB28181参数
    LiteGBS国标GB28181公网直播是一款强大的基于国标GB28181协议的视频云服务平台,它支持多路设备同时接入,在安防领域发挥着重要作用。LiteGBS国标GB28181-2016平台可进行解码、处理、分发等服务,能将接入的视频流转换为多种格式,如RTSP、RTMP、FLV、HLS、WebRTC等,兼容全平台、全终端,满......