Как читать как целые, так и символы, один за другим, из файла? - PullRequest
0 голосов
/ 28 июля 2011

Я пытаюсь обработать входной файл, содержащий числа, которые я должен использовать для расчетов, и символы, которые мне нужно использовать для сравнения. Быстрый пример - такой файл:

6
foobar

и такой код:

n = readInInt
  while n > 0
    c = readInSingleChar
    if (c = 'f')
      doSomething
    n--

В настоящее время я нахожу множество вариантов здесь и через Google, в том числе DataStream, BufferedReader и FileReader, но кажется, что существует слишком много способов, и я не уверен, что все они работают так, как они мне нужны. Пожалуйста, дайте мне знать, если моя потребность не ясна.

Короче говоря, мне нужно читать файл символ за символом и интерпретировать / использовать те, которые являются числами как целые числа, и те, которые являются буквами и символами как символы.

Какой самый простой способ сделать это? Я знаю, что есть профессиональные способы сделать что-то, и "хорошие" способы сделать что-то. Это одноразовая вещь для личного пользования, похожая на хобби, и я не ищу надежную или надежную функциональность. Это просто должно работать хорошо.

Спасибо!

Ответы [ 2 ]

1 голос
/ 28 июля 2011

Если вы ищете простое решение, java.util.scanner было бы полезно посмотреть.

Он имеет простые в использовании методы для чтения в различныхтипы данных (такие как int или String).

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

Пример, использующий пользовательский разделитель:

Scanner s = new Scanner(new File("txtfile.txt");
s.useDelimeter(Pattern.compile("\n|"); //The newline character (\n) and null 
                                       //character are the delimeters.
while (s.hasNext()) {
    if (s.hasNextInt() {
        //Do something
    } else {
        //Handle characters
    }
}

(Для справки: Pattern )

Проблема этого прямого подхода заключается в том, что он не будет принимать многозначные целые числа.

Другой подход заключается в использовании стандартного разделителя.Затем, когда вы хотите прочитать символы, прочитайте весь токен (в вашем примере вы читали бы в «foobar»), а затем обработайте каждый символ отдельно в цикле.

String str = s.next();
for(char c : str.toCharArray()) {
    //handle characters
}
1 голос
/ 28 июля 2011

Мне кажется, самый простой способ - это использовать StreamTokenizer Этот класс предоставляет вам утилиты, необходимые для разбора целочисленных значений или строк.

Я бы начал с чего-то вроде -

StreamTokenizer tokenizer = new StreamTokenizer(new BufferedReader(new FileReader("foo.in")));

while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) {

                if (tokenizer.ttype == StreamTokenizer.TT_WORD)
                    // use tokenizer.sval
                else if (tokenizer.ttype == StreamTokenizer.TT_NUMBER)
                   // use tokenizer.nval
            }

Вот пример о том, как его использовать.Выше приведен очень распространенный способ токенизации файлов и чтения char по char.Конечно, вы должны использовать FileReader или Buffer для повышения производительности.

Вы также можете использовать Сканер .Пример кода будет выглядеть как

Scanner s = new Scanner(file);
s.useDelimiter(""); // reads one char a time
while(s.hasNext()){
  if(s.hasNextInt(){
    // then do something with s.nextInt()
  }else{
    // then do something with s.next()
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...