Абстрактные классы Reader и Writer


Абстрактный класс Reader предоставляет функционал для чтения текстовой информации. Рассмотрим его основные методы:

· absract void close(): закрывает поток ввода;

· int read(): возвращает целочисленное представление следующего символа в потоке. Если таких символов нет, и достигнут конец файла, то возвращается число -1;

· int read(char[] buffer): считывает в массив buffer из потока символы, количество которых равно длине массива buffer. Возвращает количество успешно считанных символов. При достижении конца файла возвращает -1;

· int read(CharBuffer buffer): считывает в объект CharBuffer из потока символы. Возвращает количество успешно считанных символов. При достижении конца файла возвращает -1;

· absract int read(char[] buffer, int offset, int count): считывает в массив buffer, начиная со смещения offset, из потока символы, количество которых равно count;

· long skip(long count): пропускает количество символов, равное count. Возвращает число успешно пропущенных символов;

Класс Writer определяет функционал для всех символьных потоков вывода. Его основные методы:

· Writer append(char c): добавляет в конец выходного потока символ c. Возвращает объект Writer;

· Writer append(CharSequence chars): добавляет в конец выходного потока набор символов chars. Возвращает объект Writer;

· abstract void close(): закрывает поток;

· abstract void flush(): очищает буферы потока;

· void write(int c): записывает в поток один символ, который имеет целочисленное представление;

· void write(char[] buffer): записывает в поток массив символов;

· absract void write(char[] buffer, int off, int len) : записывает в поток только несколько символов из массива buffer. Причем количество символов равно len, а отбор символов из массива начинается с индекса off;

· void write(String str): записывает в поток строку;

· void write(String str, int off, int len): записывает в поток из строки некоторое количество символов, которое равно len, причем отбор символов из строки начинается с индекса off;

Функционал, описанный классами Reader и Writer, наследуется непосредственно классами символьных потоков, в частности классами FileReader и FileWriter соответственно, предназначенными для работы с текстовыми файлами.

Теперь рассмотрим конкретные классы потоков.

Закрытие потоков

При завершении работы с потоком его надо закрыть с помощью метода close(), который определен в интерфейсе Closeable. Метод close имеет следующее определение:

void close() throws IOException

Этот интерфейс уже реализуется в классах InputStream и OutputStream, а через них и во всех классах потоков.

При закрытии потока освобождаются все выделенные для него ресурсы, например, файл. В случае, если поток окажется не закрыт, может происходить утечка памяти.

Есть два способа закрытия файла. Первый традиционный заключается в использовании блока try..catch..finally. Например, считаем данные из файла:

import java.io.*;

 

public class FilesApp {

 

public static void main(String[] args) {

 

FileInputStream fin=null;

try

{

fin = new FileInputStream("C://SomeDir//Hello.txt");

 

int i=-1;

while((i=fin.read())!=-1){

 

System.out.print((char)i);

}

}

catch(IOException ex){

 

System.out.println(ex.getMessage());

}

finally{

 

try{

 

if(fin!=null)

fin.close();

}

catch(IOException ex){

 

System.out.println(ex.getMessage());

}

}

}

}

Поскольку при открытии или считывании файла может произойти ошибка ввода-вывода, то код считывания помещается в блок try. И чтобы быть уверенным, что поток в любом случае закроется, даже если при работе с ним возникнет ошибка, вызов метода close()помещается в блок finally. И, так как метод close() также в случае ошибки может генерировать исключение IOException, то его вызов также помещается во вложенный блок try..catch

Начиная с Java 7 можно использовать еще один способ, который автоматически вызывает метод close. Этот способ заключается в использовании конструкции try-with-resources (try-с-ресурсами). Данная конструкция работает с объектами, которые реализуют интерфейс AutiCloseable. Так как все классы потоков реализуют интерфейс Closeable, который в свою очередь наследуется отAutoCloseable, то их также можно использовать в данной конструкции

Итак, перепишем предыдущий пример с использованием конструкции try-with-resources:

import java.io.*;

 

public class FilesApp {

 

public static void main(String[] args) {

 

try(FileInputStream fin=new FileInputStream("C://SomeDir//Hello.txt"))

{

int i=-1;

while((i=fin.read())!=-1){

 

System.out.print((char)i);

}

}

catch(IOException ex){

 

System.out.println(ex.getMessage());

}

}

}

Синтаксис конструкции следующий: try(название_класса имя_переменной = конструктор_класса). Данная конструкция также не исключает использования блоков catch.

После окончания работы в блоке try у ресурса (в данном случае у объекта FileInputStream) автоматически вызывается метод close().

Если нам надо использовать несколько потоков, которые после выполнения надо закрыть, то мы можем указать объекты потоков через точку с запятой:

try(FileInputStream fin=new FileInputStream("C://SomeDir//Hello.txt");

FileOutputStream fos = new FileOutputStream("C://SomeDir//Hello2.txt"))

{

//..................

}



Дата добавления: 2017-01-26; просмотров: 1616;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.01 сек.