СКТ - Лекция №2
.pdfЧтение и запись в файлы
•К файлам файловой системы можно обращаться с помощью потоков. На самом низком уровне потоки позволяют программе принимать байты из источника или направлять вывод в место назначения. Некоторые потоки обрабатывают все виды 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, которое указывает среде времени выполнения, можно указать, что пытаться сериализовать те или иные атрибуты не нужно.