Конспект лекций по Java. Занятие 15
Стр 1 из 5Следующая ⇒ Конспект лекций по Java. Занятие 15
Ввод/вывод (I/O) в Java (продолжение) Иерархия OutputStream Рисунок 1. Принципы построения иерархии OutputStream те же, что и в InputStream. Т. е. вся основная функциональность определяется абстрактным базовым классом OutputStream. Рассмотрим основные методы этой иерархии, определенные в классе OutputStream. public abstract void write(int b) throws IOException Записывает в поток один байт — младший байт числа, заданного параметром b. public void write(byte[] b) throws IOException Записывает в поток массив байт. public void write(byte[] b, int off, int len) throws IOException Модификация предыдущего метода, позволяющая задать смещение в массиве и длину записываемой порции. public void flush() throws IOException Выталкивает из буфера в поток все, что в нем накоплено. public void close() throws IOException Закрывает поток. Класс ByteArrayOutputStream. Позволяет заполнять массив байт операциями вывода в поток. Класс FileOutputStream. Это основной класс для работы с файлами. Имеет такие основные конструкторы: public FileOutputStream(File file) throws FileNotFoundException public FileOutputStream(String name) throws FileNotFoundException public FileOutputStream(String name, boolean append) throws FileNotFoundException Смысл конструкторов, кроме, возможно, последнего понятен из их описания. Но имеется несколько нюансов.
Какой-либо дополнительной функциональности по сравнению с базовым классом класс FileOutputStream не добавляет.
Класс BufferedOutputStream. Служит для организации более эффективного буферизованного вывода в поток. Класс DataOutputStream. Содержит много хороших методов, но на практике, чаще всего, бесполезен ввиду того, что работает с кодировкой Unicode. Класс PrintStream. Содержит много полезных дополнительных методов. Это методы print и println для всех базовых типов. Наиболее часто используются следующие из этих методов public void print(String x) public void println(String x) и другие, в принципе, не нужны, т. к. оператор вида println(" строка" +число); позволяет вывести и числа. А println(" строка" +объект); формирует строку из объекта при помощи метода toString.
Класс ObjectOutputStream мы будем рассматривать позднее. Класс PipedOutputStream предназначен для передачи информации между программами через каналы ( pipes ). Иерархия Writer Рисунок 2. Как и в случае с иерархией Reader иерархия Writer сама по себе ничего не добавляет к функциональности иерархии OutputStream и отличается от нее всего несколькими нюансами. Так, вместо ByteArrayOutputStream в данной иерархии присутствует более полезный класс StringWriter, позволяющий выводить информацию в строку. Практическое использование иерархии Writer Основным способом создания потока вывода в файл является PrintWriter fout = new PrintWriter( new BufferedWriter(new FileWriter(имя_файла))); После создания такого потока в него можно выводить информацию при помощи методов print и println. Развернутый пример Рассмотрим содержательный пример, в котором используются те средства, что мы рассмотрели на данном и предыдущем занятии. Программа WordConverter. java предназначена для проведения поиска и замены слов в тексте. Она принимает три параметра вызова: имя файла, строку для поиска и строку для замены. В результате ее работы создается файл с именем res. txt , содержащий результаты замены и печатается краткий протокол.
Файл WordConverter. java: import java. util. *; import java. io. *; public class WordConverter { public static void main(String args[]) { if( args. length < 2 ) { System. out. println(" Формат вызова: " ); System. out. println(" java WordConverter < имя файла> < строка для поиска> < строка для замены> " ); return; } String thisLine; BufferedReader fin = null; PrintWriter fout = null; try { fin = new BufferedReader(new FileReader(args[0])); fout = new PrintWriter(new BufferedWriter(new FileWriter(" res. txt" ))); int lineCnt = 0, replCnt = 0; for (; (thisLine = fin. readLine())! = null; lineCnt++) { StringTokenizer st = new StringTokenizer(thisLine, , " \t,; +-[](). /*& =~! |:? < > {}" true); while (st. hasMoreTokens()) { String token = st. nextToken(); if ( token. equals(args[1]) ) { fout. print( args[2] ); replCnt++; } else fout. print( token ); } fout. println(); } System. out. println(); System. out. println(" === Результаты: ===" ); System. out. println(" Строк в файле: " +lineCnt); System. out. println(" Произведено замен: " +replCnt); } catch (FileNotFoundException e) { System. out. println(" Файл " + args[0] + " не найден" ); } catch (Exception e) { e. printStackTrace(); } finally { if ( fin! = null ) { try { fin. close(); //!!! Закрыть файл } catch ( IOException ex ) { System. out. println(" Ошибка закрытия файла " + args[0]); System. out. println(" Error: " + ex); } fin = null; } if ( fout! = null ) { fout. close(); //!!! Закрыть файл fout = null; } } Оттранслируем и запустим на выполнение данную программу. Для примера можно взять в качестве исходного файла текст самой программы WordConverter. java, в качестве строки поиска " thisLine", в качестве строки для замены " theLine". Здесь использованы те средства и приемы, которые мы рассмотрели на текущем и прошлом занятии. В частности, класс StringTokenizer, рассмотренный в 14-м занятии. Продолжим изучение библиотеки ввода/вывода Java.
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|