Нет смысла делать это на строке, потому что строка может содержать до 2^31 - 1
символов. Внутри символы строки хранятся в char [], и все методы API используют int
в качестве типа для длин, позиций и смещений.
- То же ограничение применяется к StringBuffer или StringBuilder; то есть длина
int
.
- StringReader поддерживается строкой, так что это не поможет.
- И CharBuffer, и ByteBuffer имеют одинаковое ограничение; то есть длина
int
.
- Голый массив примитивного типа ограничен длиной
int
.
Короче говоря, вам придется реализовать свой собственный тип "длинной строки", который внутренне содержит свои символы в (например) массиве символов.
(Я попробовал поиск в Google, но не смог найти существующую реализацию длинных строк, которая выглядела заслуживающей доверия. Я думаю, что в Java не так много вызовов чудовищно больших строк ...)
Кстати, если вы ожидаете, что строки никогда не будут такими большими, вам просто нужно преобразовать свои long
смещения в int
. Приведение будет работать, но вы можете проверить диапазон и выдать исключение, если вы когда-нибудь получите смещение> = 2^31
.