Java的String和StringBuilder的长度限制为Integer.MAX_VALUE。在大多数用例中,这绰绰有余,但是我刚遇到一个用例,需要处理并返回大于2,684,354,560个字符的String。
这对于捕获传入的字符流是必需的,在该字符流中,我无法控制字符流的大小,也无法选择重新设计解决方案。我最多只能做的是替换现有模块中的方法,或引入一个新类替换该方法中的String和StringBuilder。
作为临时的解决方法,为防止在StringBuilder长度超过Integer.MAX_VALUE时抛出OutOfMemory异常,我实现了以下safeAppend():
private void safeAppend(StringBuilder ret, String current) {
if ((long)ret.length() + current.length() > Integer.MAX_VALUE) {
String truncateLeadingPart;
if (current.length() < ret.length()) {
truncateLeadingPart = ret.substring(current.length());
}
else {
int startIndex = (int)((long)ret.length()+current.length()-Integer.MAX_VALUE);
truncateLeadingPart = ret.substring(Math.min(ret.length(), startIndex));
}
ret.setLength(0);
ret.append(truncateLeadingPart);
}
ret.append(current);
}
Run Code Online (Sandbox Code Playgroud)
此方法会截断开头部分,并始终保留尾随的2147483483647个字符。但是,这种解决方法/保障措施不足以解决当前的任务,因为我们无法承受丢失从流中捕获的任何数据的风险。
什么是实现一个推荐的做法String和StringBuilder那些不局限于由一个int最大尺寸?
一个长的最大大小的限制可能就足够了。同样,LimitlessString可以像这样有效地附加一个类StringBuilder。
在要求我维护的一些Perl代码中,我遇到了以下构造:
myArray => ['id1', 'id2', 'id3', 'id4']
Run Code Online (Sandbox Code Playgroud)
我在网上搜索了一些定义/解释,但我所能找到的只是对标量哈希的引用:
https://www.guru99.com/perl-tutorials.html
这是我遇到的实际代码的片段:
$config = eval {
XMLin(
$inFile,
MyArray => [
'id1', 'id2',"id3", 'id4'
]
);
};
Run Code Online (Sandbox Code Playgroud)
散列整个数组(不包含散列值)的语法是什么意思?