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

打印 上一主题 下一主题

主题 520|帖子 520|积分 1560

长字符串起因


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


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

解决想法


  • 网上还有一个说法,说是编译器问题,修改 idea 工具的编译为 eclipse 即可。
  • 但是结果我仍然不满意,所以我决定把他放在文件中,然后需要的时候读取出来即可。
  • 所以,我就把字符串放到了 resources 的某个 txt 文件下,然后再从文件中读取出来

遇到的问题


  • 在 spring boot 项目中,尝试了好多次读取 resources 下的 payload.txt 文件一直失败。
  • 报错一直是该文件不存在
一开始使用的是 hutool util 工具类去读取,但是不成功。
  1. String filePath = "payload.txt";
  2. String contentString = FileUtil.readUtf8String(Thread.currentThread().getContextClassLoader().getResource("").getPath() + filePath);
复制代码

  • 可以看到我的 target 编译后的文件里面确实是存在这个文件的。

最终解决办法
  1. // 先转为流
  2. InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(path);
  3. // 再把流转为 String
  4. String content = new BufferedReader(new InputStreamReader(inputStream))
  5.                             .lines().collect(Collectors.joining("\n"));
复制代码

  • 封装代码
  1. public final class ClassPathResourceReader {
  2.     /**
  3.      * path:文件路径
  4.      * @since JDK 1.8
  5.      */
  6.     private final String path;
  7.     /**
  8.      * content:文件内容
  9.      * @since JDK 1.6
  10.      */
  11.     private String content;
  12.     public ClassPathResourceReader(String path) {
  13.         this.path = path;
  14.     }
  15.     public String getContent() {
  16.         if (content == null) {
  17.             try {
  18.                 InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(path);
  19.                 if (inputStream!=null) {
  20.                     content = new BufferedReader(new InputStreamReader(inputStream))
  21.                             .lines().collect(Collectors.joining("\n"));
  22.                 }else {
  23.                     throw new RuntimeException("创建 lookLike-app 受众出现异常:File not exist");
  24.                 }
  25.             } catch (Exception e) {
  26.                 throw new RuntimeException(e);
  27.             }
  28.         }
  29.         return content;
  30.     }
  31. }
复制代码
这样相当于做了个本地缓存,就不用每次都去读取文件了,性能嘎嘎快。


  • 代码调用
  1. String content = new ClassPathResourceReader("payload.txt").getContent();
复制代码
出处:https://www.cnblogs.com/LoveBB/本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文链接,否则保留追究法律责任的权利。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

八卦阵

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表