FileReader против FileInputReader. Сплит против Pattern - PullRequest
1 голос
/ 16 июня 2010

Я работаю с файлом около 2G. Я хочу прочитать файл построчно, чтобы найти некоторые конкретные термины. Какой класс я могу лучше использовать: FileReader или FileInputStream? И как я могу найти конкретные слова эффективно. Я просто использую метод split (), но может быть, я могу использовать класс java.util.regex.Pattern в сочетании с классом java.util.regex.Matcher.

Итак, вопросы таковы: какой класс я могу использовать: FileReader или FileInputStream? можно использовать метод split или классы регулярных выражений

Есть ли у кого-нибудь ответ на этот вопрос? Thans.

Ответы [ 3 ]

4 голосов
/ 16 июня 2010

Лучшим вариантом было бы использовать BufferedReader (для его readLine() метода), обертывающий InputStreamReader (для его возможности указать кодировку), обертывающий FileInputStream (для фактического чтения файла):

BufferedReader br = new BufferedReader(new InputStreamReader(
    new FileInputStream(name), encoding));

FileReader использует кодировку платформы по умолчанию, что, как правило, является плохой идеей, что делает класс в основном ловушкой для разработчиков, которые не знают о потенциальных проблемах.

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

0 голосов
/ 16 июня 2010

BufferedReader имеет метод readLine(), который можно использовать для чтения построчно.Классы ReaderWriter) могут использоваться для данных String, где InputStreamOutputStream) должны использоваться для двоичных данных (байтовые массивы).

BufferedReader reader = new BufferedReader(new FileReader(file));
String line = null;
while((line = reader.readLine()) != null) {
    // Do something with the line
}
0 голосов
/ 16 июня 2010

Вы захотите использовать Reader (вероятно, обернутый в BufferedReader ), так как вы работаете с данными String, а не с двоичными данными. Вы должны предварительно скомпилировать ваш шаблон (Pattern.compile). Кроме того, из вашего описания неясно, следует ли вам использовать Pattern.split или более подходящим является использование Matcher.

Обратите внимание, что str.split(regex, limit) эквивалентно Pattern.compile(regex).split(str, limit)

...