首页 > 编程语言 >java 处理常量字符串过长 & springboot 项目读取 resouces 文件夹下的文件内容

java 处理常量字符串过长 & springboot 项目读取 resouces 文件夹下的文件内容

时间:2023-04-13 21:35:29浏览次数:46  
标签:文件 读取 java springboot content new resouces path String

长字符串起因

  • 项目里面有一长串的加密字符串(最长的万多个字符),需要拼接作为参数发送给第三方。

  • 如果我们使用 枚举 定义的话,idea 编译的时候就会出现编译报错
Error: java:常量字符串过长


解决想法

  • 网上还有一个说法,说是编译器问题,修改 idea 工具的编译为 eclipse 即可。

  • 但是结果我仍然不满意,所以我决定把他放在文件中,然后需要的时候读取出来即可。

  • 所以,我就把字符串放到了 resources 的某个 txt 文件下,然后再从文件中读取出来


遇到的问题

  • 在 spring boot 项目中,尝试了好多次读取 resources 下的 payload.txt 文件一直失败。
  • 报错一直是该文件不存在

一开始使用的是 hutool util 工具类去读取,但是不成功。

String filePath = "payload.txt";
String contentString = FileUtil.readUtf8String(Thread.currentThread().getContextClassLoader().getResource("").getPath() + filePath);
  • 可以看到我的 target 编译后的文件里面确实是存在这个文件的。

最终解决办法

// 先转为流
InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(path);
// 再把流转为 String
String content = new BufferedReader(new InputStreamReader(inputStream))
                            .lines().collect(Collectors.joining("\n"));
  • 封装代码
public final class ClassPathResourceReader {
    /**
     * path:文件路径
     * @since JDK 1.8
     */
    private final String path;
    /**
     * content:文件内容
     * @since JDK 1.6
     */
    private String content;
    public ClassPathResourceReader(String path) {
        this.path = path;
    }
    public String getContent() {
        if (content == null) {
            try {
                InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(path);
                if (inputStream!=null) {
                    content = new BufferedReader(new InputStreamReader(inputStream))
                            .lines().collect(Collectors.joining("\n"));
                }else {
                    throw new RuntimeException("创建 lookLike-app 受众出现异常:File not exist");
                }
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
        return content;
    }
}

这样相当于做了个本地缓存,就不用每次都去读取文件了,性能嘎嘎快。

  • 代码调用
 String content = new ClassPathResourceReader("payload.txt").getContent();

标签:文件,读取,java,springboot,content,new,resouces,path,String
From: https://www.cnblogs.com/LoveBB/p/17316469.html

相关文章

  • JavaScript 变量、标识符和四则运算
    JavaScript基础第二天变量什么是变量?变量由四个部分组成:1.var:声明变量的关键字2.变量名字1.变量的名字可以包含:字母,数字2.不能以数字开头3.不能使用关键字保留字比如var、if、for、列:web、_001、_number3.等于号=在js中它叫做赋值号4.值,赋值号后面的叫做值(变......
  • java捡基础
    ++与--写在前后有什么区别?++或--写在变量前后有区别?*1.如果不参与运算的话,它们是没有区别。*2.如果参与了运算,区别就是很大了。*参与运算时两者的区别:累加的结果要不要参与本次的运算,(使用累加之后值运算,还是使用累加之前的值进行运算......
  • 使用java实现音乐播放
    使用java实现音乐播放的具体代码调用有参构造器,构造器中传入需要播放的音乐路径,文件需要是.wav格式调用start方法播放音乐,设置为从头开始循环播放暂停调用pause方法暂停,暂停保存当前播放进度的毫秒值继续播放调用recommence方法,会读取刚才保存的音乐播放进度的毫秒值调......
  • SpringBoot 自定义对象映射器的使用
    SpringBoot底层默认使用Jackson进行Java实体对象与Json之间的转换,有时转换的效果并不是我们所期望的,需要进行额外的处理工作,有经验的小伙伴们,肯定遇到过下面两种典型的情况:当对象的属性是日期类型时,转换成json后的结果并不是我们想要的效果,还需要我们额外进行显示格式......
  • JAVAWEB-项目搭建准备工作八步骤-2023-04-13
    第一步:生成一个javamavenweb项目第二步:配置TOMCAT第三步:测试项目是否可以跑起来第四步:导入maven各个jar包+增加build解决资源导出问题<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://ww......
  • Java面试题
    面试题面向过程和面向对象的区别面向过程和面向对象的主要区别在于思想方式和实现方法。面向过程重视步骤和函数,通过分解问题并设计函数来解决问题;面向对象则更注重对象和类之间的关系,将程序中的各种元素组织成一个有机整体,在实现上更加灵活和可扩展。同时,面向对象的程序具......
  • java数据类型
    标志符标志符就是类名、方法(函数)名、变(常)量名、包名等的名字。Java规定,标识符是由字母、下划线(“”)或美元符“$”)开头,后面跟0个或多个字母、下划线(“”)、美元符(“$”)或数字组成的符号序列。根据此定义,下列单词都是合法的标识符:icountnumdayScollLock$a789a89J......
  • java -- 线程
    线程与进程进程:是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间,一个应用程序可以同时运行多个进程;进程也是程序的一次执行过程,是系统运行程序的基本单位;系统运行一个程序即是一个进程从创建、运行到消亡的过程。线程:是进程中的一个执行单元,负责当前进程中程序的执......
  • Java POI 拆分excel单元格并填充内容
    publicvoidtest(Sheetsheet){intnumMergedRegions=sheet.getNumMergedRegions();for(intz=0;z<numMergedRegions;z++){CellRangeAddressmerge=sheet.getMergedRegion(z);//System.out.println("Numbe......
  • 【Java】wait、await、sleep的区别和联系
     (200条消息)Java之wait、await、sleep的区别和联系_javawait和await区别_wotu__的博客-CSDN博客 一、wait()notify()notifyAll()调用wait()使得线程等待某个条件满足,线程在等待时会被挂起,当其他线程运行时使得这个条件满足时,其他线程会调用notify()或者notifyAll()来唤......