|
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 | Поможем написать вашу работу | Нарушение авторских прав |