У меня большой файл, и я хочу сделать некоторые "операции" на нем (найти текст, проверить, существует ли какой-либо текст, получить смещение некоторого текста, возможно, изменить файл).
Мой нынешний подход:
public ResultSet getResultSet(String fileName) throws IOException {
InputStream in = new FileInputStream(fileName);
byte[] buffer = new byte[CAPACITY];
byte[] doubleBuffer = new byte[2 * CAPACITY];
long len = in.read(doubleBuffer);
while (true) {
String reconstitutedString = new String(doubleBuffer, 0 ,doubleBuffer.length);
//...do stuff
ByteArrayOutputStream os = new ByteArrayOutputStream();
os.write(doubleBuffer, CAPACITY, CAPACITY);
readUntilNow += len;
len = in.read(buffer);
if (len <= 0) {
break;
}
os.write(buffer, 0, CAPACITY);
doubleBuffer = os.toByteArray();
os.close();
}
in.close();
return makeResult();
}
Я хотел бы изменить String restore article в другое. Какая была бы лучшая альтернатива, учитывая, что я хочу получить некоторую информацию о содержании этих данных, информацию, которую я могу получить, обращаясь к IndexOf на строку
Вы можете использовать StringBuffer
или StringBuilder
. Этот два класса почти как класс String
с преимуществом изменчивости.
Кроме того, вы можете легко преобразовать их в String
всякий раз, когда вам нужна какая-то функциональность, которую предоставляет только String
. Чтобы преобразовать их, вы можете просто использовать метод toString()
.
Вы можете использовать другой тип данных в качестве альтернативы String
на основе вашей ситуации. Но в целом StringBuffer
и StringBuilder
- лучшая альтернатива вместо строки. Используйте StringBuffer
для синхронизации и StringBuilder
в другом случае.
split
их? Нет, ты не можешь.
Самым естественным выбором был бы CharBuffer
. Подобно String
и StringBuilder
он реализует interface
CharSequence
, поэтому его можно использовать с множеством текстовых API-интерфейсов, в первую очередь с механизмом регулярных выражений, который является CharSequence
для большинства операций поиска, разделения и замены.
Что делает CharBuffer
естественным выбором в том, что он также является типом, который используется пакетом charset, который обеспечивает необходимые операции для преобразования символов из и в байты. Имея дело с этим API, вы можете сделать преобразование непосредственно из и в CharBuffer
без дополнительных шагов копирования данных.
Обратите внимание, что Javas regex API подготовлен для обработки буферов, содержащих частично прочитанные файлы, и может сообщить, может ли чтение большего количества данных изменить результат (см. hitEnd()
и requireEnd()
).
Это необходимые инструменты для создания приложений, которые могут обрабатывать большие файлы в небольших кусках и без создания экземпляра String
из него (или только при необходимости, например, при извлечении соответствующей подпоследовательности).
Лучшим типом для split
или indexOf
on является String
. Просто используйте его.
String
. И, как я уже говорил в другом комментарии, мне нужен способ получить тот же результат, что и у indexOf, не очень заинтересованный в возможности вызвать indexOf для моей альтернативы.
StringBuilder
или StringBuffer
и легко конвертировать их в String
с помощью метода toString()
когда вам нужна какая-то только специфическая для String
операция. Доказано, что StringBuilder
и StringBuffer
намного быстрее, чем String