неправильное использование токенайзера строк в Java - PullRequest
0 голосов
/ 10 декабря 2011

Мне кажется, я не правильно использую String Tokenizer.Вот мой код:

  buffer = new byte[(int) (end - begin)];
                fin.seek(begin);
                fin.read(buffer, 0, (int) (end - begin));

                StringTokenizer strk = new StringTokenizer(new String(buffer),
                                DELIMS,true);

Как видите, я читаю кусок строки из файла (конец и начало - номера строк), и я передаю данные в строковый токенизатор.Мои разделители:

DELIMS = "\r\n ";

, потому что я хочу отделить слова, между которыми есть пробел, или которые находятся на следующей строке.Однако этот код иногда также разделяет целые слова.Что может быть объяснением?Моя строка DELIMS задана неверно?

Также я передаю "true" в качестве аргумента токенизатору, потому что я хочу, чтобы разделители также обрабатывались как токены. (Я хочу это, потому что хочу подсчитать строкуЯ в настоящее время на

1010 * Не могли бы вы помочь мне.Большое спасибо.

Ответы [ 2 ]

2 голосов
/ 10 декабря 2011

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

Вам необходимо использовать StringTokenizer? Если нет, я бы настоятельно рекомендовал использовать Scanner. Я приведу вам пример, но попрошу вас просто сослаться на Javadocs, которые являются достаточно полными и уже содержат хорошие примеры. Тем не менее, он также принимает разделители - но как регулярные выражения, так что имейте в виду.

1 голос
/ 10 декабря 2011

Вы всегда можете заключить ваш входной поток в LineNumberReader. Это будет отслеживать номер строки для вас. LineNumberReader расширяет BufferedReader, который имеет метод readLine(). При этом вы можете использовать обычный StringTokenizer, чтобы получить ваши слова в качестве токенов. Вы можете использовать регулярные выражения или Scanner, но для этого случая StringTokenizer проще для начинающих понять и быстрее.

У вас должен быть файл RandomAccessFile. Вы не указали это, но я полагаю, основываясь на методах, которые вы использовали. Попробуйте что-то вроде:

byte [] buffer = ...; // you know how to get this.
ByteArrayInputStream stream = new ByteArrayInputStream(buffer);

// if you have java.util.Scanner
{
    int lineNumber = 0;
    Scanner s = new Scanner(stream);

    while (s.hasNextLine()) {
        lineNum++;
        String line = s.nextLine();
        System.out.format("I am on line %s%n", lineNum);
        Scanner lineScanner = new Scanner(line);

        while (lineScanner.hasNext()) {
            String word = lineScanner.next();
            // do whatever with word
        }
    }
}

// if you don't have java.util.Scanner, or want to use StringTokenizer
{
    LineNumberReader reader = new LineNumberReader(
                          new InputStreamReader(stream));
    String line = null;

    while ((line = reader.nextLine()) != null) {
        System.out.println("I am on line " + reader.getLineNumber());
        StringTokenizer tok = new StringTokenizer(line);

        while (tok.hasMoreTokens()) {
            String word = tok.nextToken();
            // do whatever with word
        }
    }
}
...