Чтобы показать, как использовать Scanner для выполнения файлового ввода, давайте рассмотрим простую программу, которая открывает текстовый файл, читает файл построчно, а затем распечатывает строки ввода по одной в консоли.
Метод называется readStudentNamesFromFile.
Как я упоминал ранее, метод обрабатывает исключение ввода-вывода с помощью throws в сигнатуре метода, объявляя возможное исключение.
Внутри метода, объект файла inputFile объявляется чтобы быть связанным с файлом, с именем, заданным в качестве параметра в конструкторе класса File.
В этом примере, именем файла является studennames.txt. Это тот же файл, который мы видели ранее.
После того, как соответствие между объектом файла и самим файлом устанавливается, создается объект Scanner с именем input для входного файла.
При этом открывается файл. И содержимое можно прочитать из файла.
В этом методе, цикл for используется для чтения по одной строке за один раз из файла.
Обратите внимание, что в то время, как инициализация и обновление индекса цикла i сделаны, используя обычный способ, условие цикла проверяется без ссылки на индекс цикла.
Вместо этого, цикл проверяет, есть ли еще любая оставшаяся новая строка в исходном файле для чтения с помощью метода hasNextLine.
Поэтому, цикл будет продолжаться, пока не достигнет конца файла.
Я хочу отметить, что пустая строка в файле, это не то же самое, что конец файла, поскольку файл, вероятно, содержит пустые строки, которые разделяют различные разделы файла.
Внутри цикла, метод nextLine используется для чтения следующей строки, и результат присваивается переменной String inputStudentName.
Эта программа будет просто выводить каждую строку, извлеченную из файла, добавляя ее к строке Student # i.
Когда программа завершит цикл, входной файл должен быть закрыт перед выходом из метода.
Здесь показаны скриншоты двух окон, в том числе вывод программы, с соответствующим входом.
Подобно тому, что мы сделали с входными файлами, для того чтобы сделать теперь вывод файла, мы должны сначала связать объект File с файлом, указанным в имени файла.
После того, как устанавливается соответствие, объект PrintWriter может быть создан с помощью объекта File.
После того, как файл открыт, мы можем начать вывод данных в файл.
Вы можете использовать print или рrintln метод для печати значений различных типов, в том числе примитивных типов и строк в файле.
Разница между print и рrintln заключается в том, что print будет оставаться на той же строке после печати, в то время как рrintln будет двигаться к следующей позиции печати на новой строке.
Опять же, важно закрыть файл с помощью метода close, когда вы закончили работу с файлом.
В противном случае, вы можете потерять все данные в файле.
Здесь мы используем метод, который мы уже обсуждали, и который использовал Scanner для считывания данных из входного файла и выводил результаты в консоль.
В этом примере, мы изменим предыдущую программу, так что, вместо вывода результатов в окно терминала, вывод будет храниться в выходном файле.
Следуя четырехшаговому процессу, который мы только что описали, объект File и объект PrintWriter будут созданы для файла с именем output.txt, который используется в качестве параметра для конструктора файла, когда объект outputFile создается.
После создания outputFile, объект PrintWriter может использовать метод рrintln для вывода результатов.
Таким образом, здесь, метод writer.printIn() используется для замены IO.outputln, так что результаты будут напечатаны в файл, а не в консоль.
Когда вся работа сделана, перед выходом из программы, как выходные, а также входные файлы должны быть закрыты с помощью метода close.
Чтобы убедиться, что программа действительно закончила работу в соответствии с требованиями, вот скриншот содержания двух файлов с output.txt и studentnames.txt.
Оба открыты с помощью блокнота.
Вы можете видеть, что, вместо того чтобы отображать только имена, как в оригинальном studentnames файле, в выходном файле также печатается счетчик.
Таким образом, с помощью вывода результатов в файл, в отличие от предыдущего примера, где результаты просто печатаются на экране, результаты теперь могут быть сохранены и могут быть использованы, если это необходимо.
Мы уже видели, что числа могут быть представлены в виде штрих-кодов. И в настоящее время, 2D штрих-коды, такие как QR-коды, могут быть использованы для представления гораздо более богатого набора символов.
Другая важная технология ввода основана на оптическом распознавании символов, или optical character reader OCR.
OCR относится к автоматическому преобразованию печатного или рукописного текста в машиночитаемую форму.
Технология OCR используется для многих приложений, включая чтение почтовых адресов на конвертах, обработку банковских операций, чтение документов для слабовидящих, распознавание рукописного ввода с портативных устройств, например, для проверки подписи, чтение номерных знаков автомобилей, и многое другое.
Я не буду обсуждать здесь технологии, лежащие в основе OCR, потому что это выходит за рамки этого курса. Я просто дам вам простую демонстрацию того, как OCR может быть использовано.
Вот простая программа, которая принимает изображение некоторого текста, которое может быть получено различными средствами, включая цифровую камеру, сканер или скриншот экрана (https://github.com/novts/java-base).
В дополнение к принятию штрих-код в качестве входных данных, класс ввода-вывода IO может также принимать текстовые изображения в качестве входных данных.
Для программы сначала потребуется импортировать класс IO comp102x пакета.
Класс IO имеет встроенный метод для OCR, использующий пакет Java, который доступен в открытом доступе для бесплатного скачивания.
На самом деле есть две версии реализации OCR, одна для 32-битной архитектуры и другая для 64-битной, именно это мы должны проверить здесь с помощью класса Loader, для определения того, следует ли загружать 32-разрядную или 64-разрядную версию библиотеки.
Вам не нужно понимать, как это на самом деле сделано.
К сожалению, эта библиотека будет работать только для Windows.
Я просто даю вам картину здесь того, как OCR может работать.
Здесь метод readFromOCR будет выполнять работу, состоящую в чтении входного изображения с использованием OCR.
Это очень простой метод, он будет вызывать метод inputTextImage из класса IO.
Это похоже на то, что мы делали для целого числа с использованием inputInteger или double типа с помощью inputDouble.
Опять же, мы используем идею процедурной абстракции здесь, так как подробности того, как метод inputTextImage реализуется, скрыты от пользователя.
Все, что вам нужно знать, это то, что метод, как предполагается, выполняется.
В этом случае он будет рассматривать изображение, и пытаться извлечь текстовые данные из изображения. И результат присваивается символьной строке.
Важно отметить, что этот метод не может все время правильно выполнять задачу.
Я дам вам демонстрацию позже, чтобы показать вам, что это значит.
Затем результат отображается в консоли с использованием IO.outputln.
Прежде чем я покажу вам демонстрацию, сначала, я покажу вам некоторые изображения, которые я собираюсь использовать при тестировании программы.
Первое изображение, которое я собираюсь использовать, получается с помощью снимка экрана.
Откроем программу в IDEA.
Это метод, который мы только что видели.
Метод readFromOCR использует imputTextImage() из класса IO для выполнения OCR изображения текста.
Поместим в папку images файл изображения.
Вы можете создать экземпляр объекта и выбрать метод readFromOCR, затем выбрать файл изображения, и вы можете видеть, что результат отображается здесь в консоли, «Introduction to Computing with Java».
Все, кажется, в порядке. На самом деле вы заметили, что J здесь с маленькой буквы, а не с заглавной буквы.
Метод не может легко отличить маленькую букву j и заглавную букву J. И если вы будете распознавать другие изображения с текстом, вы также будете сталкиваться с ошибками. Но результат не так уж плох.
Я покажу вам здесь еще одно интересное применение OCR.
Посмотрим на номерные знаки этих двух автомобилей.
Наша зрительная система настолько хороша, что мы принимаем распознавание символов как должное, но такая задача является гораздо более трудной для компьютера.
Компьютер должен сначала найти положение номерного знака в изображении, а затем иметь дело с различными атрибутами изображения, такими как цвет, размер и условия освещения.
Распознавание автомобильных номеров используется во многих приложениях, в том числе мониторинге трафика и выявлении угнанных автомобилей.
Следующее демо, которое я собираюсь показать, не такое сложное, как то, что я только что описал.
Необходимые номерные знаки должны быть извлечены вручную, и результаты также не очень надежные, потому что наша реализация основана на бесплатной технологии.
Давайте запустим программу снова.
Давайте сначала попробуем использовать программу для одного из номеров.
Вы можете увидеть, что результат отображается здесь правильно.
Теперь давайте попробуем другой номер. Результат будет не правильный.
В домашнем задании, вы должны будете завершить реализацию класса SearchRecordDemo, который будет искать файл записи, в котором любая из строк записи соответствует строке ввода.
И этот метод searchFromRecord является методом, который вы должны завершить.
Текущая реализация позволяет пользователю вводить строку символов для поиска с консоли в методе searchWord ().
Но вы можете изменить программу, чтобы получать эту строку с помощью OCR.