Можно ли использовать один объект сканера для чтения более одного файла?

#java #io #java.util.scanner

#java #io #java.util.сканер

Вопрос:

Что мне интересно, так это могу ли я создать один объект сканера и с его помощью прочитать один файл, закончить чтение его содержимого, а затем прочитать другой.

Так что вместо того, чтобы делать это:

 Scanner scan = new Scanner(file);
Scanner scan2 = new Scanner(file2);
 

У меня было бы что-то вроде

 Scanner scan = new Scanner(file);
*Code reading contents of file*
scan = Scanner(file2);
 

Заранее спасибо!

Комментарии:

1. Вы спрашиваете, как использовать одну переменную или один Scanner экземпляр?

2. Нет. Каждый объект сканера может принимать входные данные только из одного источника. Однако вы можете создать SequenceInputStream , который можно было бы использовать для получения входных данных из нескольких файлов и объединения их всех в один входной поток, а затем ваш сканер мог бы считывать их.

3. Вы можете делать все, что хотите, хотя и создаете второй сканер. Вы должны закрыть первый, прежде чем перезаписывать ссылку.

4. Почему вы хотите это сделать? В этом нет никакой пользы, и это просто усложняет ваш код.

Ответ №1:

Вы можете сделать это двумя разными способами. Один из них — просто создать новый объект сканера, который, по-видимому, является тем, что вам нужно. Для этого вы просто присваиваете новый объект сканера той же переменной, а затем можете считывать данные с нового сканера. Что — то вроде этого:

 Scanner scan = new Scanner(file);
// Code reading contents of file
scan.close();
scan = new Scanner(file2);
// Code reading contents of file2
scan.close();
 

Итак, вы на самом деле спрашивали об использовании одного объекта сканера для чтения из нескольких файлов, поэтому технически приведенный выше код не отвечает на ваш вопрос. Если вы посмотрите документацию для сканера, там нет способа изменить источники ввода. К счастью, в Java есть аккуратный маленький класс под названием SequenceInputStream. Это позволяет объединить два входных потока в один. Он считывает данные из первого входного потока до тех пор, пока он полностью не будет исчерпан, а затем переключается на второй. Мы можем использовать это для чтения из одного файла, а затем переключиться на второй файл, и все это в одном входном потоке. Вот пример того, как вы могли бы это сделать:

 // Create your two separate file input streams:
FileInputStream fis1 = new FileInputStream(file);
FileInputStream fis2 = new FileInputStream(file2);

// We want to be able to see the separation between the two files,
// so I stuck a double line separator in here (not necessary):
ByteArrayInputStream sep = new ByteArrayInputStream((System.lineSeparator()   System.lineSeparator()).getBytes());

// Combine the first file and the separator into one input stream:
SequenceInputStream sis1 = new SequenceInputStream(fis1, sep);

// Combine our combined input stream above and the second file into one input stream:
SequenceInputStream sis2 = new SequenceInputStream(sis1, fis2);

// Print it all out:
try (Scanner scan = new Scanner(sis2)) {
    scan.forEachRemaining(System.out::println);
}
 

Это приведет к чему-то вроде:

 Content
of
file
1

Content
of
file
2
 

Теперь вы действительно создали только один объект сканера и считываете с его помощью входные данные из двух разных файлов.

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

Комментарии:

1. Я знаю, как обрабатывать исключения, большое вам спасибо за помощь!