Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Конспект лекций по Java. Занятие 15




Конспект лекций по 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

Смысл конструкторов, кроме, возможно, последнего понятен из их описания. Но имеется несколько нюансов.

  • При открытии файла на запись, если файл не существует, то он создается.
  • Если файл существует, то он будет полностью обновлен. Т. е. если открыть и сразу закрыть файл, то реальный файл на диске будет нулевой длины.
  • Исключением из предыдущего правила является последний из конструкторов. Если в нем в качестве третьего параметра ( append ) указать true , то файл будет дописываться.

Какой-либо дополнительной функциональности по сравнению с базовым классом класс FileOutputStream не добавляет.

Класс BufferedOutputStream.

Служит для организации более эффективного буферизованного вывода в поток.

Класс DataOutputStream.

Содержит много хороших методов, но на практике, чаще всего, бесполезен ввиду того, что работает с кодировкой Unicode.

Класс PrintStream.

Содержит много полезных дополнительных методов. Это методы print и println для всех базовых типов. Наиболее часто используются следующие из этих методов

public void print(String x)

public void println(String x)

и другие, в принципе, не нужны, т. к. оператор вида

println(" строка" +число);

позволяет вывести и числа. А

println(" строка" +объект);

формирует строку из объекта при помощи метода toString.

  • Существуют два стандартных (предопределенных) потока вывода типа PrintStream: System. out и System. err. Оба они по умолчанию направляют информацию на консоль, но их можно перенаправить в файлы.

Класс 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 Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...