对于常量池来说, 字符串 *** 的 UTF8 表示过长怎么解决

首先说一下为什么会出现这种情况。

1.解释长度问题:
定义一个字符类型的变量究竟能有多长?

答案:65536,也就是二的16次方,因为常量在class文件的规范中,
CONSTANT_Utf8_info表中使用一个16位的无符号整数来记录字符串的长度的,最多能表示65536个字节,而javaclass文件是使用一种变体UTF-8格式来存放字符的,null值使用两个字节来表示,因此只剩下65536-2=65534个字节。
如果字符串中含有中文等非ASCII字符,那么双引号中字符的数量会更少(一个中文字符占用三个字节)。如果超出这个数量,在编译的时候编译器会报错。

在这里插入图片描述
既然知道了原因是这样,那么就好办了,我不让你成为常量,解决办法如下:

       <dependency>
           <groupId>com.google.guava</groupId>
           <artifactId>guava</artifactId>
           <version>27.0-jre</version>
       </dependency>

然后

String result = Files.asCharSource(new File("/Users/luziyuan/Desktop/aaa.txt"), Charsets.UTF_8).read();

直接就可以将字符串读出来了,只适用于线下跑跑程序。

如果解决了你的问题,点个赞吧。

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值