printBanner

news2025/1/22 5:40:54

主类

package com.example.demo;

import com.application.Application;

public class Demo {

    public static void main(String[] args) {
        Application application = new Application("application.properties");
        application.run();
    }

}

创建对象,需要的参数(配置文件相对类路径下的路径)

Application("application.properties")

 

Application类

package com.application;

public class Application {

    //配置文件路径 默认为application.properties
    private String path = "application.properties";

    public Application(String path){
        this.path = path;
    }
    public Application(){
    }

    public void  run(){
        //配置信息
        Environment environment = new Environment(this.path);

        ApplicationBannerPrinter bannerPrinter = new ApplicationBannerPrinter();

        //打印 banner
        bannerPrinter.print(environment,System.out);
    }

}

Environment类(存放配置信息) 

package com.application;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class Environment {

    //存放配置信息
    private Properties properties = new Properties();

    //配置文件路径
    private String path;

    public String getProperty(String key, String defualtValue){
        String value = this.properties.getProperty(key, defualtValue);
        return value;
    }

    public Environment(String path){
        this.path = path;
        getPropertiesFromPropertiesFile(path);
    }

    //读取配置文件
    public Properties getPropertiesFromPropertiesFile(String path){
        ClassPathResource classPathResource = new ClassPathResource(path,null);
        InputStream in = null;
        try {
            //获取配置文件的输入流
            in = classPathResource.getInputStream();
            //读取配置文件将信息存放到 properties 中
            this.properties.load(in);
            return this.properties;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }finally {
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
public Environment(String path){
    this.path = path;
    getPropertiesFromPropertiesFile(path);
}

通过这个构造方法创建对象时,调用getPropertiesFromPropertiesFile(path);读取配置文件

 

ClassPathResource类(通过该类加载类路径下的资源) 

package com.application;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;

//用于加载类路径下的资源
public class ClassPathResource {

     private String path;

    private ClassLoader classLoader;

    public ClassPathResource(String path, ClassLoader classLoader) {

        String pathToUse = path;
        if (pathToUse.startsWith("/")) {
            pathToUse = pathToUse.substring(1);
        }
        this.path = pathToUse;
        this.classLoader = (classLoader != null ? classLoader : Thread.currentThread().getContextClassLoader());
    }

    //判断资源是否存在
    public boolean exists() {
        return resolveURL() != null;
    }

    protected URL resolveURL() {
        try {
            if (this.classLoader != null) {
                return this.classLoader.getResource(this.path);
            }
            else {
                return ClassLoader.getSystemResource(this.path);
            }
        }
        catch (IllegalArgumentException ex) {
            return null;
        }
    }

    //获取资源的输入流
    public InputStream getInputStream() throws IOException {
        return this.classLoader.getResourceAsStream(this.path);
    }
}

 

 ApplicationBannerPrinter类(负责打印banner)

package com.application;

import java.io.PrintStream;

public class ApplicationBannerPrinter {

    //banner location 配置项的key
    static final String BANNER_LOCATION_PROPERTY = "application.banner.location";
    //默认的banner location
    static final String DEFAULT_BANNER_LOCATION = "banner.txt";

    // 默认banner
    private static final Banner DEFAULT_BANNER = new ApplicationBanner();

    public void print(Environment environment, PrintStream out){
        //根据情况获取不同的Banner实现类对象
        Banner banner = getBanner(environment);
        //打印banner(不同的Banner实现类对象的 printBanner方法不同)
        banner.printBanner(environment,  out);

    }

    private Banner getBanner(Environment environment){

        //获取资源文件中的banner图
        Banner banner = getTextBanner(environment);
        //成功获取banner图资源
        if(banner != null){
            return banner;
        }
        //否则 返回 默认banner
        return DEFAULT_BANNER;
    }

    private Banner getTextBanner(Environment environment) {
        // 根据key(第一个参数) 获取banner的location,获取失败(未配置该配置项),返回默认值(第二个参数)
        String location = environment.getProperty(BANNER_LOCATION_PROPERTY, DEFAULT_BANNER_LOCATION);
        //用于加载 location 资源文件的 resource
        ClassPathResource resource = new ClassPathResource(location,null);
        // 如果 location 资源文件存在,返回打印该 banner的 Banner实现类对象
        if ( resource.exists() ) {
            return new ResourceBanner(resource);
        }
        return null;
    }
}

 打印banner分为两种情况:

1.用户为提供banner图,打印默认的banner

2.用户提供了banner图,打印用户提供的banner图

根据情况获取不同的Banner实现类,不同的Banner实现类中对printBanner方法的具体实现不同,由此打印不同的banner 图

private Banner getBanner(Environment environment){

    //获取资源文件中的banner图
    Banner banner = getTextBanner(environment);
    //成功获取banner图资源
    if(banner != null){
        return banner;
    }
    //否则 返回 默认banner
    return DEFAULT_BANNER;
}

Banner接口,printBanner方法用于打印banner 

package com.application;

import java.io.PrintStream;

public interface Banner {
    void printBanner(Environment environment, PrintStream printStream);
}

 

ApplicationBanner实现Banner接口,负责打印默认Banner

package com.application;

import java.io.PrintStream;

public class ApplicationBanner implements Banner {

    //默认 banner
    private static final String[] BANNER = { "", "  .   ____          _            __ _ _",
            " /\\\\ / ___'_ __ _ _(_)_ __  __ _ \\ \\ \\ \\", "( ( )\\___ | '_ | '_| | '_ \\/ _` | \\ \\ \\ \\",
            " \\\\/  ___)| |_)| | | | | || (_| |  ) ) ) )", "  '  |____| .__|_| |_|_| |_\\__, | / / / /",
            " =========|_|==============|___/=/_/_/_/" };

    @Override
    public void printBanner( Environment environment,  PrintStream out) {
        for (String line : BANNER) {
            out.println(line);
        }
    }
}

 

 ResourceBanner实现Banner接口,负责打印用户提供的放在类路径下的banner

package com.application;

import java.io.PrintStream;
import java.nio.charset.StandardCharsets;

public class ResourceBanner implements Banner{
    //加载资源文件的resource
    private ClassPathResource resource;

    public ResourceBanner(ClassPathResource resource){
        this.resource = resource;
    }

    @Override
    public void printBanner(Environment environment, PrintStream out) {
            try {
                //StreamUtils.copyToString用于将输入流中的内容拷贝到字符串中,第二个参数指定要用的字符集
                //获取 banner 的字符串
                String banner = StreamUtils.copyToString(this.resource.getInputStream(), StandardCharsets.UTF_8);

                //输出banner字符串
                out.println(banner);
            }
            catch (Exception ex) {
                System.out.println("Banner not printable");
                ex.printStackTrace();
            }
    }
}

 

StreamUtils.copyToString用于将输入流中的内容拷贝到字符串中 

package com.application;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;

public class StreamUtils {
    //默认缓冲区大小
    public static final int BUFFER_SIZE = 4096;

    //用于将输入流中的内容拷贝到字符串中
    public static String copyToString(InputStream in, Charset charset) throws IOException {
        if (in == null) {
            return "";
        }

        //创建了一个初始容量为 BUFFER_SIZE 的 StringBuilder 对象
        StringBuilder out = new StringBuilder(BUFFER_SIZE);

        //将字节流in转换成字符流,所用的字符集为 charset
        InputStreamReader reader = new InputStreamReader(in, charset);

        char[] buffer = new char[BUFFER_SIZE];
        int charsRead;


        //reader.read(buffer) 将数据读到 buffer 中,返回值为读取到的字符 长度
        while ((charsRead = reader.read(buffer)) != -1) {
            //将读取的字符追加到 out 之后
            out.append(buffer, 0, charsRead);
        }

        return out.toString();
    }

}

 

 test1:

配置文件application.properties(没有内容)

public static void main(String[] args) {
    //Application application = new Application("application.properties");
    Application application = new Application();
    application.run();
}

 

打印默认banner 

 

test2:

配置文件 application1.properties(没有内容)

提供了banner.txt

public static void main(String[] args) {
    Application application = new Application("application1.properties");
    //Application application = new Application();
    application.run();
}

 

打印banner.txt 

 

 

test3:

在test2,上 改banner.txt 文件名 为 banner2.txt

打印默认banner(默认会先检查banner.txt是否存在,不存在则打印默认banner) 

 

test4:

public static void main(String[] args) {
    Application application = new Application("application1.properties");
    //Application application = new Application();
    application.run();
}

 

 application1.properties:

application.banner.location=banner2.txt

打印banner2.txt 

 

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

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

相关文章

第十三届蓝桥杯青少组省赛Python真题,包含答案

目录 一、选择题 二、编程题 第十三届蓝桥杯青少组省赛Python真题,包含答案 一、选择题 第 1 题 单选题 下列关于函数的说法正确的是 () 。 答案:C 第 2 题 单选题 十进制数55转换成十六进制是 () 。 答案:C 第 3题 单选题 下列方法中,哪…

Sysfs简介

Sysfs学习记录 主要参考文献:https://xuesong.blog.csdn.net/article/details/109522945 Sysfs(System File System)是一种虚拟文件系统,它提供了一种在Linux和Unix系统中管理设备和内核参数的机制。Sysfs基于内核,将底层硬件信息和内核参数…

WPF:WPF原生布局说明

前言 WPF在国内讨论度很小,我在这里记录一下WPF简单的原生控件是如何使用的,顺便回忆一下WPF的基础知识,有些忘记的比较厉害了 WPF简介 WPF是微软推出的桌面UI软件,是我觉得最早实现MVVM(数据驱动事务)&…

三、H3C-NE实验-配置管理实验

实验拓扑图: 实验描述: 1)把路由器R配置为FTP服务器; 2)在R上save配置文件后,主机登录FTP,把R的配置文件copy备份; 3)删掉R的配置文件后,利用主机恢复R的配…

42个网工高效率工具,我只告诉你(一)

晚上好,我是老杨。 不知道上一篇书单总结,你是否觉得干货 今天更新第四篇,也是最后一篇总结——2022年全年,我安利给你的网工好用工具,整整42个。 它是什么,为什么好用,哪里下载,…

【Linux】进程信号详解(二)

文章目录 前言一、信号阻塞1.信号其他相关常见概念信号递达:信号未决:信号阻塞:信号阻塞vs信号递达的忽略动作 2. 在内核中的表示3. sigset_t4. 信号集操作函数5.sigprocmask函数6.sigpending 二、深入理解捕捉信号1. 虚拟地址空间2.用户态和…

mybatis是如何集成到spring的?

文章目录 1 前言1.1 集成spring前使用mybatis的方式1.2 集成mybatis到spring的关键步骤 2 SqlSessionFactoryBean对象分析2.1 buildSqlSessionFactory做了什么事情?2.2 为什么是SqlSessionFactoryBean却可以使用SqlSessionFactory? 3 验证demo4 举一反三…

【Python 爬虫之BeautifulSoup】零基础也能轻松掌握的学习路线与参考资料

BeautifulSoup是一种Python库,用于解析HTML和XML文档,并从中提取数据。它提供了Pythonic的解决方案来处理非结构化数据,因此可以轻松地从网页上提取数据。 使用BeautifulSoup编写爬虫,你可以自动化许多任务,比如数据抓…

实验三 Spark SQL基础编程

实验三 Spark SQL基础编程 1.实验目的 1. 掌握 Spark SQL 的基本编程方法; 2. 熟悉 RDD 到 DataFrame 的转化方法; 3. 熟悉利用 Spark SQL 管理来自不同数据源的数据。 2.实验内容 1.Spark SQL 基本操作 将下列 JSON 格式数据复制到 Li…

CF1245D Shichikuji and Power Grid 题解

CF1245D Shichikuji and Power Grid 题解 题目链接字面描述题面翻译样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 提示 思路点拨代码实现 题目 链接 https://www.luogu.com.cn/problem/CF1245D 字面描述 题面翻译 已知一个平面上有 n n n 个城市&#x…

计网笔记 数据链路层 (1-2) 封装成帧、差错控制、流量控制与可靠传输、停止等待协议、后退N帧协议(GBN)、选择重传协议(SR)

文章目录 前言在这里插入图片描述 零、数据链路层基本概念一、功能0、数据链路层功能概述1、封装成帧和透明传输1.1封装成帧1.2 透明传输1.3组帧方法 2、数据链路层的差错控制2.0差错从何而来2.1位错(比特错,1变成0,0变成1)2.2帧错…

干货 | ChatGPT使用指南,让你轻松上车AI世界!

Hello,大家好! 这里是壹脑云科研圈,我是喵君姐姐~ 聊天机器人(Chatbot)是一种人工智能应用,可以模拟人类对话行为,以自然语言进行交互。 在过去的几年里,随着自然语言处理技术和深…

Springboot +Flowable,定时器的简单使用

一.流程定义定时激活 之前介绍流程定义的时候,流程都是定义好之后立马就激活了,其实在流程定义的这个过程中,我们还可以设置一个激活时间,也就是流程定义好之后,并不会立马激活(不激活就不能据此流程定义创…

操作系统作业 第37-40章

第四次作业 第37章 本章作业需要使用提供的disk.py程序。该程序可以模拟磁盘的工作。在默认情况下,磁盘调度方法为FIFO。对于时间的计算,假设旋转一度为1个时间单位,旋转完整一圈需要360个时间单位,而一个磁道上默认有12个扇区&…

实验二 RDD基础编程

实验二 RDD基础编程 前提是配置好大数据环节。 hadoop,spark,scala等必须的软件 以及下载pyshark 1.实验目的 1. 掌握 RDD 基本操作; 2. 熟悉使用 RDD 编程解决实际具体问题的方法; 2.实验内容 本人仅提供测试代码!…

策划专业技能提升攻略,让你在职场中脱颖而出

作为一个10多年的老策划,刚入行的时候也走过很多弯路,后来加入到一家在国内比较知名的策划公司(老板也是当年的十大知名策划人)才真正让我实现水平的跃升。 当时公司经常有内训,新人的第一课就是策划人应该如何快速入…

FreeRTOS-事件组详解

✅作者简介:嵌入式入坑者,与大家一起加油,希望文章能够帮助各位!!!! 📃个人主页:rivencode的个人主页 🔥系列专栏:玩转FreeRTOS 💬保持…

深入理解JVM读书笔记与实战_01_Java内存区域与内存溢出异常

文章目录 运行时数据区域问题引入 运行时数据区域 Java虚拟机在执行Java程序的过程中会把所管理的内存划分为若干个不同的数据区。运行时数据区包括了程序计数器、虚拟机栈、本地方法栈、方法区和堆。 程序计数器:程序计数器是线程私有的内存,用来记住…

vue:组件使用v-model实现2个组件间的数据双向绑定

一、需要实现的需求: 子组件输入框的数据发生改变,父组件的数据跟着实时改变; 父组件的数据发生改变,子组件的数据跟着实时改变。 二、实现思路: 1、(1)在父组件引入子组件。(2&…

CAN总线要点总结(CAN2.0A/B)

个人博客原文链接:CAN总线要点总结(CAN2.0A/B) 前言 工作也有几年了,在项目中也接触过几次CAN总线,但总是止步于会用即可,对于很多细节上的东西有时还是稀里糊涂的状态,这几天正好有点时间&am…