java 处理常量字符串过长 & springboot 项目读取 resouces 文件夹下的文件内容
Posted 天下没有收费的bug
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 处理常量字符串过长 & springboot 项目读取 resouces 文件夹下的文件内容相关的知识,希望对你有一定的参考价值。
长字符串起因
- 项目里面有一长串的加密字符串(最长的万多个字符),需要拼接作为参数发送给第三方。
- 如果我们使用 枚举 定义的话,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();
作者:天下没有收费的bug
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文链接,否则保留追究法律责任的权利。
Java中如何由枚举常量的ordinal值获得枚举常量对象
Java1.5提供了关键字enum,可以通过该关键字方便得定义自己需要的枚举类型,比如- enum Season
- SPRING, SUMMER, AUTUMN, WINTER
在本例中,对于Season.SPRING这个对象,Season.SPRING.name()可以得到该对象的字符串,即“SPRING”;反之,由Season.valueOf(“SPRING”)则可以得到该对象,即Season.SPRING。也就是说,使用name()方法和valueOf(String)方法可以在枚举类型对象和字符串之间方便得转换。当然,如果valueOf(String)方法的参数不是该枚举类型合法的字符串,则会抛出IllegalArgumentException异常。
对于枚举类型,Java内部实际上还是转换为java.lang.Enum的子类,可以通过“javap -c Season”命令反编译来观察这一点。Enum类提供了一个ordinal()方法,用来返回枚举对象的序数,比如本例中SPRING, SUMMER, AUTUMN, WINTER的序数就分别为0, 1, 2, 3。在有些情况下,我们需要使用这个序数,而且还有可能再根据这个序数生成所需要的枚举对象,可是Enum并没有提供valueOf(int)这样的方法,那是不是就做不到呢?
对于这个问题,实际上可以利用枚举类型的values()方法间接的做到。values()方法返回一个枚举对象数组,比如本例就是Season[],数组元素按照序数排列。在自定义的枚举类型中,我们只要定义自己的valueOf(int)方法,并返回该数组下标对象的对象就可以了。代码如下:
- enum Season
- SPRING, SUMMER, AUTUMN, WINTER;
- public static Season valueOf(int ordinal)
- if (ordinal < 0 || ordinal >= values().length)
- throw new IndexOutOfBoundsException("Invalid ordinal");
- return values()[ordinal];
以上是关于java 处理常量字符串过长 & springboot 项目读取 resouces 文件夹下的文件内容的主要内容,如果未能解决你的问题,请参考以下文章