Использование текстовых файлов
| English | Русский |
|---|---|
| text file/tekst faɪl/ | текстовый файл |
Пустая строка не является невалидным токеном
- Текстовый файл содержит пустую строку, за которой следует
12. В начале обаhasNextLine()иhasNextInt()истинны: проверка на целочисленный токен пропускает пробельные символы, включая пустую строку, чтобы найти 12. - Сравните файл, содержащий
oops, за которым следует12: в нём есть ещё одна строка, но его следующий токен не является целым числом. Проверка наличия строки не может установить формат целого числа; выберите защитный оператор, соответствующий чтению.
При разделителе по умолчанию Scanner, содержащий пустую строку за которой следует 12, возвращает true для hasNextInt() в начале.
Проверка токена целого числа пропускает пробельные символы, включая пустую строку, и находит токен целого числа 12.
Подключите читатель к источнику
new Scanner(new File("scores.txt"))читает указанный файл, тогда какnew Scanner(System.in)читает ввод с клавиатуры. Оба предоставляют одни и те же методы Scanner; источник и его доступность различаются.- Открытие отсутствующего файла может вызвать
FileNotFoundException. Приведённый ниже полный пример объявляет его наmain; реальное приложение может вместо этого поймать его и сообщить полезное сообщение об ошибке. Ни один из вариантов не создаёт отсутствие данных.
Чтобы прочитать текстовый файл, вы привязываете Scanner к...
new Scanner(new File("...")) читает файл.
Те же методы Scanner (nextInt, nextLine) работают как для клавиатуры, так и для файлового ввода.
Отличается только источник (System.in против File).
Чтение полных строк
hasNextLine()проверяет наличие следующей строки, не извлекая её;nextLine()извлекает остаток этой строки и её разделитель. Пустая строка может дать пустую строку"".- Для строчных записей используйте
while (in.hasNextLine()) { String line = in.nextLine(); ... }. Явно решите, является ли пустая запись значимой, должна быть пропущена или сообщена как недопустимая.
Чтение текстового файла
Следуйте шагам, которые выполняет программа для чтения файла построчно.
Какой метод проверяет, есть ли еще одна строка для чтения?
hasNextLine() защищает вызов nextLine().
Вы должны проверять hasNextLine() перед каждым вызовом nextLine().
Чтение за пределами конца вызывает исключение.
Чтение токенов с проверками соответствия
- Разделитель по умолчанию для сканера — пробельные символы.
hasNext()проверяет наличие токена;next()извлекает его.hasNextInt()проверяет, можно ли следующий токен прочитать как целое число;nextInt()извлекает это целое число. while (in.hasNextInt())останавливается наoops, даже если за ним следует 12. Если политика заключается в пропуске недопустимых токенов и сохранении последующих целых чисел, используйте цикл сhasNext(), проверяйтеhasNextInt()и извлекайте недопустимый токен с помощьюnext().
Эта полная программа суммирует допустимые целочисленные токены и отчитывается о каждом пропущенном токене. Для файла, содержащего oops, за которым следует 12, она выводит Skipped: oops, а затем Total: 12. Пример предполагает, что сумма помещается в int.
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class ReadScores {
public static void main(String[] args) throws FileNotFoundException {
int total = 0;
try (Scanner in = new Scanner(new File("scores.txt"))) {
while (in.hasNext()) {
if (in.hasNextInt()) {
total += in.nextInt();
} else {
System.out.println("Skipped: " + in.next());
}
}
}
System.out.println("Total: " + total);
}
}
Match each read to the guard that checks that kind of input.
A line-presence check is not an integer-format check.
Извлечение входных данных и закрытие файла
- Каждая ветвь в цикле токенов извлекает токен. Повторная проверка недопустимого токена без его извлечения оставляет Сканер на той же позиции и может привести к бесконечному выполнению цикла.
- Конструкция try-with-resources закрывает этот файловый Сканер при выходе, включая аварийный выход. При ручном управлении вызывайте
close()после завершения; проверки не заменяют закрытие ресурса.
hasNextLine(), за которым следует nextInt(), не является проверкой соответствия. Недопустимый токен (не целое число) может вызвать InputMismatchException, и эта неудачная попытка чтения целого числа оставляет токен доступным. Выберите: отвергнуть файл, сообщить о записи или явно пропустить токен.
Когда вы заканчиваете чтение файла, вы должны...
in.close() освобождает ресурс файла.
Проверка политики данных перед циклом
- Для входных данных
8 oops 12цикл, читающий только покаhasNextInt(), дает сумму 8 и останавливается наoops. Показанная политика пропуска и отчета дает сумму 20. Неожиданный токен не обязательно означает конец файла. - Эти политики отвечают на разные вопросы. Для требуемого балла каждого студента молчаливый пропуск плохого токена может нарушить соответствие записей; предпочтительнее сообщить об этом и отклонить запись, чем рассматривать все последующие токены как взаимозаменяемые баллы.
Выберите чтение строк или токенов в зависимости от формата файла. Проверки осматривают ожидающие входные данные без их извлечения; чтение соответствия извлекает их. Обрабатывайте некорректные данные явно, продвигайтесь по каждой ветви цикла и закрывайте файловый читатель.
Для ввода 8 oops 12, какую сумму выведет показанная программа пропусков и отчетов?
Она потребляет и добавляет 8, потребляет и выводит oops, затем потребляет и добавляет 12. Итоговая сумма равна 20.