Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

СКТ - Лекция №2

.pdf
Скачиваний:
10
Добавлен:
09.05.2015
Размер:
374.2 Кб
Скачать

Чтение и запись в файлы

К файлам файловой системы можно обращаться с помощью потоков. На самом низком уровне потоки позволяют программе принимать байты из источника или направлять вывод в место назначения. Некоторые потоки обрабатывают все виды 16-битных символов (типы Reader и Writer). Другие обрабатывают только 8-битные байты (типы InputStream и OutputStream). В рамках этих иерархий существует несколько разновидностей потоков, и все они находятся в пакете java.io. На самом высоком уровне абстракции находятся потоки символов и потоки байтов.

Потоки байтов считывают (InputStream с подклассами) и записывают (OutputStream с подклассами) 8-битные байты.

FileInputStream/FileOutputStream: считывает байты из файла, записывает байты в файл;

ByteArrayInputStream/ByteArrayOutputStream: считывает байты из массива в памяти, записывает байты в массив в памяти.

Потоки символов

Потоки символов считывают (Reader с подклассами) и записывают (Writer с подклассами) 16-битные символы.

StringReader/StringWriter: чтение и запись символов в строки и из строк в памяти;

InputStreamReader/InputStreamWriter (и подклассы FileReader/ FileWriter): образуют мост между потоками байтов и потоками символов. Версии Reader считывают байты из потока и конвертируют их в символы. Версии Writer преобразовывают символы в байты и помещают их в потоки байтов.

BufferedReader/BufferedWriter: помещают данные в буфер,

считывая или записывая другой поток, что делает операции чтения и записи более эффективными.

Чтение из файла

Logger log = Logger.getAnonymousLogger(); StringBuilder sb = new StringBuilder(); try {

InputStream inputStream = new FileInputStream(new File("input.txt")); InputStreamReader reader = new InputStreamReader(inputStream);

try {

int c = reader.read(); while (c != -1) {

sb.append(c);

}

} finally { reader.close();

}

} catch (IOException e) {

log.info("Caught exception while processing file: " + e.getMessage());

}

Запись в файл

Logger log = Logger.getAnonymousLogger(); String data = "Some string";

try {

OutputStream outputStream = new FileOutputStream(new File( "output.txt"));

OutputStreamWriter writer = new OutputStreamWriter(outputStream); try {

writer.write(data); } finally {

writer.close();

}

} catch (IOException e) {

log.info("Caught exception while processing file: " + e.getMessage());

}

Потоки буферизации

Чтение и запись потоков символов по одному символу за раз не очень эффективны, поэтому в большинстве случаев вместо этого предпочитают использовать ввод/вывод с буферизацией.

Чтение файла

Logger log = Logger.getAnonymousLogger(); StringBuilder sb = new StringBuilder(); try {

InputStream inputStream = new FileInputStream(new File("input.txt")); BufferedReader reader = new BufferedReader(new InputStreamReader(

inputStream));

try {

String line = reader.readLine(); while (line != null) {

sb.append(line);

line = reader.readLine();

}

} finally { reader.close();

}

} catch (IOException e) {

log.info("Caught exception while processing file: " + e.getMessage());

}

Запись в файл

Logger log = Logger.getAnonymousLogger(); String data = "Some data";

try {

OutputStream outputStream = new FileOutputStream(new File( "output.txt"));

BufferedWriter writer = new BufferedWriter(new OutputStreamWriter( outputStream));

try { writer.write(data);

} finally { writer.close();

}

} catch (IOException e) {

log.info("Caught exception while processing file: " + e.getMessage());

}

Сериализация Java

Сериализация Java связана еще с одной важной библиотекой платформы Java. Сериализация в основном используется для персистенции объектов и взаимодействия с удаленными объектами - это два случая, когда нужно иметь возможность создать копию состояния объекта, чтобы позднее восстановить его.

Сериализация - это процесс, когда состояние объекта и его метаданные (например, имя класса объекта и имена его атрибутов) сохраняются в особом двоичном формате. Преобразование объекта в этот формат - сериализация - позволяет сохранить всю информацию, необходимую для восстановления (или десериализации) объекта в нужное время.

Существует два основных способа сериализации объекта:

Персистенция объекта - это хранение состояния объекта в постоянном механизме персистенции, таком как база данных.

Дистанцирование (remoting) объекта означает передачу объекта в другой компьютер или систему.

java.io.Serializable

Интерфейс Serializable помечает объекты класса для среды исполнения как сериализуемые. Каждый подкласс также помечается как сериализуемый.

public class PersonSerializableSample implements Serializable

{

/**

*

*/

private static final long serialVersionUID = -5320438329478382454L;

A

}

При попытке сериализовать объект любые несериализуемые атрибуты объекта вызовут выдачу средой исполнения Java исключения

NotSerializableException.

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