536.78K
Category: programmingprogramming

Курс «Программирование на Java - Работа с файлами»

1.

Курс «Программирование на Java - Работа с файлами»

2.

Курс «Программирование на Java - Работа с файлами»
Рассматриваемые вопросы
• Общая концепция потоков ввода-вывода
• Reader и InputStream
• Writer и OutputStream
• Особенности потоков ввода-вывода
• Буферизация
• Класс Scanner
• Сериализация объектов

3.

Курс «Программирование на Java - Работа с файлами»
Общая концепция

4.

Курс «Программирование на Java - Работа с файлами»
Reader и InputStream
Reader и InputStream предоставляют схожий набор методов, но оперируют различными типами данных
InputStream содержит следующие методы для чтения байт и массивов байт
int read();
int read(byte cbuf[]);
int read(byte cbuf[], int offset, int length);
Reader определяет такие же методы, но для чтения символов и массивов символов
int read();
int read(char cbuf[]);
int read(char cbuf[], int offset, int length);

5.

Курс «Программирование на Java - Работа с файлами»
Writer и OutputStream
Writer и OutputStream построены аналогично
OutputStream содержит следующие методы для записи байт и массивов байт
int write(int c);
int write(byte cbuf[]);
int write(byte cbuf[], int offset, int length);
Writer определяет такие же методы, но для записи символов и массивов символов
int write(int c);
int write(char cbuf[]);
int write(char cbuf[], int offset, int length);

6.

Курс «Программирование на Java - Работа с файлами»
Особенности потоков ввода-вывода
Все потоки чтения и записи (символьные и байтовые) автоматически открываются при их создании. После
использования необходимо принудительно закрывать потоки с помощью метода close()
Так же можно воспользоваться конструкцией try-with-resources, который умеет закрывать ресурсы с интерфейсом
AutoClosable
FileWriter fileWriter = null;
try {
fileWriter = new FileWriter("sample.txt");
fileWriter.write("Hello students");
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fileWriter != null) {
try {
fileWriter.close();
} catch (IOException ignored) { }
}
}
try (FileReader fileReader = new
FileReader("sample.txt")) {
int c;
while ((c = fileReader.read()) != -1) {
System.out.print((char) c);
}
} catch (IOException e) {
e.printStackTrace();
}

7.

Курс «Программирование на Java - Работа с файлами»
Буферизация
Буферизированные потоки как правило более эффективны, за счет буферизации данных при чтении или записи,
тем самым уменьшая количество обращений к источнику данных. Поэтому данные классы часто используют с
другими потоками.
Классы для буферизации:
• BufferedReader
• BufferedInputStream
• BufferedWriter
• BufferedOutputStream

8.

Курс «Программирование на Java - Работа с файлами»
Использование буферизации
try (BufferedWriter bw = new BufferedWriter(new
FileWriter("sample.txt"))) {
bw.write("line 1");
bw.newLine();
bw.write("line 2");
} catch (IOException e) {
e.printStackTrace();
}
try (BufferedReader br = new BufferedReader(new
FileReader("sample.txt"))) {
String line;
// если line = null -> конец файла
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}

9.

Курс «Программирование на Java - Работа с файлами»
Класс Scanner
Для чтения из консоли используется класс Scanner
Методы:
• boolean hasNext() - для проверки наличия лексемы в консоли
• boolean hasNextТип() - для проверки наличия значения конкретного типа
• тип nextТип() - считывание данных конкретного типа
• String next() - считывание произвольной лексемы

10.

Курс «Программирование на Java - Работа с файлами»
Serializable
Сериализация - это процесс сохранения состояния объекта в последовательность байт
Десериализация - это процесс восстановления объекта из этих байт
Процесс сериализации заключается в стерилизации каждого поля объекта, но только в том случае, если это поле
не имеет спецификатора static или transient. Поля, помеченные ими не могут быть предметом сериализации

11.

Курс «Программирование на Java - Работа с файлами»
Интерфейс Serializable
Для стерилизации объекта класс должен реализовывать интерфейс Serializable
import java.io.Serializable;
public class Employee implements Serializable {
private String firstName;
private String lastName;
private Integer age;
/*
...
*/
}

12.

Курс «Программирование на Java - Работа с файлами»
Сериализация объекта
Для сериализации объекта используется класс ObjectOutputStream
try (final FileOutputStream fos = new FileOutputStream("employees.data");
final ObjectOutputStream oos = new ObjectOutputStream(fos)){
oos.writeInt(300);
oos.writeObject("Test Message");
oos.writeObject(LocalDateTime.now());
oos.writeObject(new Employee("John", "Doe", 24));
} catch (Exception e) {
e.printStackTrace();
}

13.

Курс «Программирование на Java - Работа с файлами»
Десериализация объекта
Для десериализации объекта используется класс ObjectInputStream
try (final FileInputStream fis = new FileInputStream("employees.data");
final ObjectInputStream ois = new ObjectInputStream(fis)){
final int num = ois.readInt();
final String message = (String) ois.readObject();
final LocalDateTime time = (LocalDateTime) ois.readObject();
final Employee employee = (Employee) ois.readObject();
} catch (Exception e) {
e.printStackTrace();
}
English     Русский Rules