2015-04-01 2 views
1

У меня есть большой файл, и я хочу выполнить некоторые «операции» на нем (найти текст, проверить, существует ли какой-либо текст, получить смещение некоторого текста, возможно, изменить файл).Использование чего-то другого вместо строки

Мой текущий Подход заключается в следующем:

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(); 

} 

Я хотел бы изменить Струнный reconstitutedString в нечто другое. Что было бы лучшей альтернативой учитывая, что я хочу, чтобы иметь возможность получить информацию о содержании этих данных, информация, которую я могу получить вызов IndexOf на строке

+1

Поскольку это методы класса String, что заставляет вас предположить, что есть альтернатива? Вы можете использовать StringBuilder для его создания, но для выполнения этих действий вам все равно потребуется значение String. Если, конечно, вы не готовы создать свою собственную реализацию и переписать все эти методы. – Stultuske

+0

Ну, я не ищу альтернативу с теми же точными методами. До тех пор, пока у меня есть способ получить тот же результат, что и indexOf, я доволен. –

+0

Я только упоминал о методах, которые вы заявили, что вам нужно. Они очень специфичны для объектов String, поэтому вы не найдете их в другом классе, если только вы не создадите их. – Stultuske

ответ

0

Вы можете использовать StringBuffer или StringBuilder. Этот класс имеет почти класс String с преимуществом изменчивости.

Кроме того, вы можете легко конвертировать их в String всякий раз, когда вам требуется какая-то функциональность, которую предоставляет только String. Чтобы преобразовать их, вы можете просто использовать метод toString().

Вы можете использовать некоторые другие типы данных в качестве альтернативы String в зависимости от вашей ситуации. Но в целом StringBuffer и StringBuilder - лучшая альтернатива вместо строки. Используйте StringBuffer для синхронизации и StringBuilder в другом случае.

+0

Можете ли вы« разбить »их? Нет, ты не можешь. –

+0

Tichodroma: конечно, нет, но вы можете получить String от них и разделить на это. – Stultuske

+0

Спасибо за предложение, я рассмотрю его. –

0

Лучшего типа делать split или indexOf на это String. Просто используйте его.

+0

У меня действительно ** огромные ** файлы. И я действительно хочу избавиться от 'String'. И, как я уже сказал в другом комментарии, мне нужен способ получить тот же результат, что и indexOf, не очень заинтересованный в возможности вызвать indexOf на мою альтернативу. –

+0

Тогда вы должны пойти с 'StringBuilder' или' StringBuffer' и легко преобразовать их в 'String' с помощью метода' toString() ', когда вам понадобится только определенная операция' String'. Доказано, что 'StringBuilder' и' StringBuffer' намного быстрее, чем 'String' – Razib

0

Самым естественным выбором будет CharBuffer. Подобно String и StringBuilder, он реализует CharSequenceinterface, поэтому его можно использовать с большим количеством текстовых API-интерфейсов, в первую очередь regex engine, который является фоном для большинства операций поиска, разделения и замены.

Что делает CharBuffer, естественным выбором является то, что он также является типом, который используется charset package, который обеспечивает необходимые операции для преобразования символов из и в байты. Имея дело с этим API, вы можете сделать преобразование непосредственно с и до CharBuffer с без дополнительных шагов копирования данных.

Обратите внимание, что API регулярных выражений Java готов для обработки буферов, содержащих частично прочитанные файлы, и может сообщить, может ли чтение большего количества данных изменить результат (см. hitEnd() и requireEnd()).

Это необходимые инструменты для создания приложений, которые могут обрабатывать большие файлы в небольших кусках и не создавать из него экземпляр String (или только при необходимости, например, при извлечении соответствующей подпоследовательности).

Смежные вопросы