Javaの文字列とStringBuilderのは Integer.MAX_VALUEの長さに制限されています。ほとんどのユースケースでは、これは、より適切なよりですが、私はちょうど私が2684354560文字より文字列の大きなを処理して返すために必要のあるユースケースに遭遇しました。
これは、私は、ストリームの大きさを制御することはできません、また私は、ソリューションを再設計するためのオプションを持っていないした文字の入力ストリームを、捕捉するために必要とされます。私はせいぜいできることは、既存のモジュールでメソッドを置き換えるか、その方法では文字列と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);
}
この方法は、主要な部分を切り捨て、常に末尾2,147,483,647文字の一部を保持します。ただし、この回避策/予防措置は、我々は、ストリームから取り込んだデータを失う余裕がないので、手元の作業には不十分であることが判明しました。
実装に推奨されるアプローチは何であるString
とStringBuilder
それがされている限定されない int型の最大サイズでは?
長い最大サイズの制限が十分である可能性があります。また、単一LimitlessString
のように効率的に追加することができるクラスはStringBuilder
また、適切です。
次のことができるように習慣String
またはStringBuffer
32ビット長がインタフェースに焼成されます。それはまた、配列やNIOバッファの本当、残念ながら(この問題を解決する提案が、執筆時点で何がありました)。
それが可能であれば明らかにストリーミングまたはランダムなファイルアクセスを使用すると、良い解決策でしょう。
あなたは何か他のものを実装して残っています。ロープは、文字列部分の組成を表現するために二分木を使用します。より一般的には、以上GCに直接割り当てられた(またはメモリマップドファイル)NIOバッファの配列を配列の配列を使用することです。誰かがコンピュータサイエンスのこの領域は、まだ多くの博士号のためのスコープを持っていることを数年前に述べました。