java StreamTokenizer - PullRequest
       15

java StreamTokenizer

0 голосов
/ 16 января 2012

Я использую метод quoteChar('"') для обработки строк. Обычные escape-последовательности, такие как \ n и \ t, распознаются и преобразуются в одиночные символы при разборе строки Есть ли способ получить строку такой, какая она есть, что означает, что если у меня есть строка:

Hello \ tworld

я хочу получить

Hello \ tworld

а не:

Привет, мир

. Спасибо

Ответы [ 2 ]

1 голос
/ 12 июня 2015

Вот что у меня сработало:

public class MyReader extends BufferedReader {
    // You can choose whatever replacement you'd like(one wont occur in your text)
    private static final char TAB_REPLACEMENT = '\u0000';

    public MyReader(Reader in) {
        super(in);
    }

    @Override
    public int read() throws IOException {
        int charVal = super.read();
        if (charVal == '\t') {
            return TAB_REPLACEMENT;
        }
        return charVal;
    }
}

и затем создайте токенизатор:

myTokenizer = new StreamTokenizer(new MyReader(new FileReader(file)));

и получите новый strval по

MyTokenizer.sval.replace(TAB_REPLACEMENT, '\t')
1 голос
/ 16 января 2012

Глядя на источник StreamTokenizer, выглядит, что поведение escape для строк жестко запрограммировано. Я могу только думать о нескольких способах обойти это:

  1. Повторно экранируйте строку, как только вернете ее. Проблема здесь в том, что это не будет точно соответствовать тому, что было в файле - \ t будет преобразовано обратно, но \ 040 не будет.
  2. Вставьте свой Reader между источником Reader и StreamTokenizer. Сохраните все символы, прочитанные для последнего токена, в буфере. Удалите пробелы из начала этого буфера, чтобы получить «сырой» токен.
  3. Если ваши правила токенизации достаточно просты, внедрите свой собственный токенизатор.
...