Самая важная функция компьютера — обработка данных. Полезный компьютерный язык должен иметь хорошие возможности ввода-вывода, чтобы необработанные данные поступали в программу, а обработанные данные выходили наружу.
По сравнению с другими языками функции ввода-вывода Java сложны. В других языках многие функции ввода-вывода (например, чтение файлов) инкапсулированы и могут быть реализованы с помощью одной или двух строк программы. В Java программистам часто требуется несколько уровней оформления для чтения файлов.
Преимущество относительной сложности — гибкость ввода-вывода. В Java программисты могут контролировать весь процесс ввода-вывода, чтобы разработать лучший метод ввода-вывода. Мы увидим больше ниже.
пример ввода-вывода
Ниже приведен файл file.txt, который я использовал для демонстрации.
Привет, мир! Привет, ботаник!
Давайте сначала изучим пример чтения файла:
import java.io.*;public class Test {public static void main(String[] args) { try {BufferedReader br = new BufferedReader(new FileReader("file.txt") String line = br.readLine(); while (line!= null) { System.out.println(line); line = br.readLine(); } br.close(); e) { System.out.println("Проблема ввода-вывода" } }};
Эта программа содержит обработчик исключений try...catch...finally. Пожалуйста, обратитесь к расширенному руководству по Java по обработке исключений.
Декораторы и комбинации функций
Ключом к программному вводу-выводу является создание объекта BufferedReader br:
BufferedReader br = новый BufferedReader(новый FileReader("file.txt"));
В процессе создания мы сначала создали объект FileReader. Функция этого объекта — прочитать поток байтов из файла «file.txt» и преобразовать его в текстовый поток. В Java стандартной кодировкой текста является Unicode. BufferedReader() получает объект FileReader, расширяет функции FileReader и создает новый объект BufferedReader. Помимо вышеупомянутых функций чтения и преобразования файлов, этот объект также предоставляет функции кэшированного (буферизованного) чтения. Наконец, мы можем прочитать файл построчно, вызвав метод readLine() объекта br.
(Чтение кэша означает открытие области в памяти в качестве кэша, в которой хранится текстовый поток, считанный FileReader. Когда содержимое кэша считывается (например, с помощью команды readLine()), кэш загружает последующий текстовый поток.)
BufferedReader() — декоратор, который принимает примитивный объект и возвращает декорированный объект с более сложными функциями. Преимущество декораторов в том, что с их помощью можно украшать разные предметы. Здесь мы модифицируем текстовый поток, считываемый из файла. Другие текстовые потоки, такие как стандартный ввод, потоки сетевой передачи и т. д., могут быть изменены с помощью BufferedReader() для обеспечения кэшированного чтения.
На диаграмме ниже показано, как работает br: данные передаются снизу вверх:
Описанный выше процесс оформления очень похож на идею текстового потока в Linux. В Linux мы используем функциональный подход для обработки и передачи текстовых потоков. В Java мы используем декораторы. Но их цели схожи: добиться модульности и свободного комбинирования функций.
больше комбинаций
Фактически, Java предоставляет богатый набор декораторов. FileReader сочетает в себе два этапа чтения и преобразования и принимает часто используемые настройки по умолчанию, такие как Юникод, для кодирования. Мы можем использовать комбинацию FileInputStream + InputStreamReader для замены FileReader, разделив таким образом два этапа чтения байтов и преобразования и получив лучший контроль над двумя процессами.
(Конечно, FileReader удобнее использовать. InputStreamReader преобразует FileInputStream в Reader для обработки текста в формате Unicode)
Стрелки указывают направление потока данных
Потоковые чтения и записи происходят из четырех базовых классов: InputStream, OutputStream, Reader и Writer. InputStream и Reader обрабатывают операции чтения, а OutputStream и Writer обрабатывают операции записи. Оба они находятся в пакете java.io. Отношения наследования заключаются в следующем:
java.io
Кроме того, IOException имеет следующие производные классы:
Исключение IO
Reader и Writer и их производные классы обрабатывают текст в формате Unicode. Как мы видим, Buffered Reader, InputStreamReader или FileReader.
InputStream и OutputStream и их производные классы обрабатывают потоки байтов. Данные в компьютере можно рассматривать в байтовой форме, поэтому InputStream и OutputStream можно использовать для обработки более широкого диапазона данных. Например, мы можем использовать следующую комбинацию для чтения данных (например, целых чисел), содержащихся в сжатом файле:
Стрелки указывают направление потока данных
Мы читаем поток байтов из сжатого файла, затем распаковываем его и, наконец, читаем данные.
писать
Операции записи аналогичны операциям чтения. Мы можем реализовать сложные функции письма, используя украшения. Вот простой пример написания текста:
import java.io.*;public class Test{ public static void main(String[] args) { try { String content = "Спасибо за вашу рыбу."; File file = new File("new.txt"); / создать файл, если он не существует, если (!file.exists()) { file.createNewFile() } FileWriter fw = new FileWriter(file.getAbsoluteFile()); BufferedWriter bw = new BufferedWriter(fw); bw.write(content); bw.close() } catch(IOException e) { System.out.println("Проблема ввода-вывода" } }}
Файловый объект создан выше для обработки путей к файлам.
Подвести итог
Это всего лишь базовое введение в Java IO. Ввод-вывод в Java относительно сложен. Java-программистам необходимо потратить некоторое время на ознакомление с классами java.io и их функциональностью.