Студопедия
Главная страница | Контакты | Случайная страница

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

OutputStreamWriter

OutputStreamWriter(OutputStream out)

OutputStreamWriter(OutputStream out, String encoding)
throws UnsupportedEncodingException

 

Группа потоков Filter: FilterInputStream, FilterReader

FilterOutputStream, FiltrerWriter

· Обертки, позволяют объединять потоки в цепочки для получения сложных потоков, обладающих расширенным набором функций

· Обладают дополнительными защищенными конструкторами
protected FilterInputStream(InputStream in)

· В наследниках обычно переопределяются методы чтения/записи с добавлением новой функциональности

 

Группа потоков Buffered: BufferedInputStream, BufferedReader

BufferedOutputStream, BufferedWriter

· Обертки, осуществляют буферизацию данных на программном уровне

· Размер буфера можно задать в конструкторе

· Символьные версии имеют методы чтения и записи строк

 

Группа потоков Piped: PipedInputStream, PipedReader

PipedOutputStream, PipedWriter

1. Используются в виде пар ввода-вывода

2. Данные, переданные в поток вывода, служат источником для потока ввода

3. Например, реализуют механизм обмена данными между нитями

4. Поток-пара задается параметром конструктора либо с помощью метода connect()

 

Группа байтовых потоков ByteArray: ByteArrayInputStream, ByteArrayOutputStream

1)В качестве источника и получателя данных используются массивы байт

2)В потоке вывода размер буфера может меняться динамически

3)В потоке вывода существуют методы преобразования:

· к массиву байт
byte[] toByteArray()

· к строке
String toString()

· вывода в другой поток
void writeTo(OutputStream out)

 

Группы символьных потоков CharArray и String:

1)CharArrayReader и CharArrayWriter аналогичны ByteArrayInputStream и ByteArrayOutputStream, но оперируют с массивом символов.

2)StringReader и StringWriter имеют аналогичную функциональность, позволяют считывать символы из строки и записывать данные в строковый буфер.

 

Группа потоков Print:

1. Обертки PrintStream и PrintWriter содержат методы, упрощающие задачу вывода данных простых типов в текстовом виде

2.Методы print() и println() не выбрасывают исключений

3. System.out и System.err – единственные потоки PrintStream

 

Класс StreamTokenizer: 1)Не является потоком чтения, но позволяет обрабатывать информацию из них.

2)Содержит методы лексической обработки текста

3)Ряд методов предназначен для настройки работы анализатора

4)Метод nextToken() производит обработку очередной лексемы, после чего:

a)Поле ttype содержит константу типа лексемы

b)Поля nval и sval содержат числовое и строковое представление лексемы

 

Группа байтовых потоков Data:

1. Интерфейсы DataInput и DataOutput содержат объявления методов ввода и вывода значений простых типов
void writeLong(long v), void writeFloat(float v)
boolean readBoolean(), String readUTF()

2.Обертки DataInputStream и DataOutputStream, соответственно, реализуют эти интерфейсы

3.Класс RandomAccessFile реализует оба интерфейса Data и позволяет работать с файлами в режиме произвольного доступа

 

Класс File:

1)Инкапсулирует платформенно-независимые методы работы с файлами и директориями:

· создание

· проверка атрибутов

· удаление

· переименование

2)Позволяет создавать временные файлы, удаляемые при завершении работы программы

3)API класса изучите самостоятельно

 

Группа потоков File: FileInputStream, FileReader

FileOutputStream, FileWriter

1)Позволяют трактовать файл как поток, предназначенный для ввода и вывода данных

2)Связаны с исключениями FileNotFoundException и SecurityException

3)Конструкторы могут получать параметры:

· Строку String, задающую имя файла

· Объект класса File

· Объект FileDescriptor
(возвращается методом getFD() байтовых потоков)

 

Пример записи в текстовый файл:

import java.io.*;

public class TextWrite {

public static void main(String[] args) {

int[] values = {1, 2, 3, 4, 5};

try {

PrintWriter out = new PrintWriter(new

BufferedWriter(new FileWriter("out.txt")));

for (int i = 0; i < values.length; i++) {

out.println(values[i]);

}

out.close();

}

catch(IOException e) {

System.out.println("Some error occurred!");

}

}

}

 

Пример чтения из текстового файла и из консоли:

import java.io.*;

public class TextRead {

public static void main(String[] args) {

int[] values = new int[5];

try {

BufferedReader in = new BufferedReader(new

FileReader("in.txt")); //InputStreamReader(System.in));

for (int i = 0; i < values.length; i++) {

values[i] = Integer.parseInt(in.readLine());

}

in.close();

}

catch(IOException e) {

System.out.println("Some error occurred!");

}

}

}

Пример записи в байтовый файл:

import java.io.*;

public class ByteWrite {

public static void main(String[] args) {

int[] values = {1, 2, 3, 4, 5};

try {

DataOutputStream out = new DataOutputStream(new FileOutputStream("out.bin"));

for (int i = 0; i < values.length; i++) {

out.writeInt(values[i]);

}

out.close();

}

catch(IOException e) {

System.out.println("Some error occurred!");

}

}

}

 

Пример чтения из байтового файла:

import java.io.*;

public class ByteRead {

public static void main(String[] args) {

int[] values = new int[5];

try {

DataInputStream in = new DataInputStream(new

FileInputStream("out.bin"));

for (int i = 0; i < values.length; i++) {

values[i] = in.readInt();

}

in.close();

}

catch(IOException e) {

System.out.println("Some error occurred!");

}

}

}

 

Сериализация объектов:

1)Сериализация – процесс преобразования состояния объекта в поток байтов

2)Десериализация – восстановление состояния объекта из данных потока

3)Не все объекты могут быть сериализованы

4)Класс должен быть подготовлен к сериализации

 

Группа байтовых потоков Object:

1. Класс ObjectOutputStream реализует сериализацию

2. Класс ObjectInputStream реализует десериализацию

3.Классы позволяют выводить и вводить графы объектов с сохранением структуры

4.Результатом десериализации является объект, равнозначный исходному

 

Пример сериализации в файл:

import java.io.*;

public class SerializationWrite {

public static void main(String[] args) {

int[] values = {1, 2, 3, 4, 5};

try {

ObjectOutputStream out = new

ObjectOutputStream(new

FileOutputStream("out.bin"));

out.writeObject(values);

out.close();

}

catch(IOException e) {

System.out.println("Some error occurred!");

}

}

}

 

Пример десериализации из файла:

import java.io.*;

public class SerializationRead {

public static void main(String[] args) {

int[] values;

try {

ObjectInputStream in = new ObjectInputStream(new

FileInputStream("out.bin"));

values = (int[])in.readObject();

in.close();

}

catch(IOException e) {

System.out.println("Some error occurred!");

}

catch(ClassNotFoundException e) {

System.out.println("Wrong object type");

}

}

}

 

Подготовка классов к сериализации:

1)Должен реализовываться интерфейс-маркер java.io.Serializable

2)Все сериализуемые поля должны иметь сериализуемый тип

3)Родительский класс должен иметь конструктор по умолчанию (без параметров) или быть подготовленным к сериализации

4)Сериализуются поля объекта, не обозначенные как transient или static

 

Порядок сериализации и десериализации:

1. В нисходящем порядке по древовидной иерархии типов: от первого сериализуемого класса до частного типа

2.Объекты, на которые ссылаются поля, сериализуются в порядке обнаружения

3.Перед десериализацией выполняется загрузка участвующих классов (возможен выброс исключения ClassNotFoundException)

 

Пример иерархии классов:

class Class1 extends Object {

private int state1 = 1;

}

class Class2 extends Class1 implements java.io.Serializable {

protected int state21;

private int state22;

public Class2(int s1, int s2) {

state21 = s1 + 15;

state22 = s2 - 1;

}

}

class Class3 extends Class2 {

public int state 3 = 3;

}

Порядок сериализации:

 

 

Порядок десериализации:

Настройка сериализации: 1)Для изменения работы механизма сериализации на уровне вашего класса в самом классе надо описать методы:

реализация сериализации
private void writeObject(ObjectOutputStream out) throws IOException

реализация десериализации
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException

2)Уровень доступа методов позволяет им независимо существовать в различных классах в иерархии наследования.

3)Можно не переписывать чтение/запись полностью, а лишь изменить порядок записи полей и их формат (см. методы ObjectOutputStream.writeFields() и ObjectInputStream.readFields())

 

Контроль версий: Каждый класс имеет уникальный идентификатор номера версии – 64 битовое значение long

По умолчанию значение рассчитывается как функция от кода класса (включая методы)

Несовпадение версий при десериализации объекта выбрасывает исключение InvalidClassException

Проблему можно обойти, явно введя в класс поле
private static final long
serialVersionUID =...;


 




Дата добавления: 2015-09-11; просмотров: 76 | Поможем написать вашу работу | Нарушение авторских прав

Лекция №1 | Локальные переменные | Легальные значения | Объявление, инициализация, заполнение | Встроенный в язык механизм проверки и обработки | Особый синтаксис описания обработчиков исключений | Виды наследования | Super(...) | Виды наследования | Параметризованные фабричные методы |


lektsii.net - Лекции.Нет - 2014-2025 год. (0.022 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав