работа с потоками ввода вывода

22
Работа с потоками ввода/вывода Чтение и запись в файлы www.spro-club.ru

Upload: metaform

Post on 15-Jun-2015

960 views

Category:

Documents


4 download

TRANSCRIPT

Page 1: работа с потоками ввода вывода

Работа с потоками ввода/выводаЧтение и запись в файлы

www.spro-club.ru

Page 2: работа с потоками ввода вывода

План Актуальность ввода и вывода

информации при создании программ Концепция потоков ввода/вывода Пакет java.io. Классы потоков

ввода/вывода в Java. Их иерархия. Базовые классы InputStream и

OutputStream. Работа с символьными данными с

помощью иерархий Reader и Writer Реализация потоков. Ввод и вывод из

файлов. Сериализация, чтение и запись

объектов.

Page 3: работа с потоками ввода вывода

Описание задачи Подавляющее большинство программ

обменивается данными с внешним миром. Это делают любые сетевые приложения -

они передают и получают информацию от других компьютеров и специальных устройств, подключенных к сети.

Оказывается удобным точно таким же образом представлять обмен данными между устройствами внутри одной машины.

Так, например, программа может считывать данные с клавиатуры и записывать их в файл, или же наоборот - считывать данные из файла и выводить их на экран

Page 4: работа с потоками ввода вывода

Описание задачи Т.о., устройства, откуда может

производиться считывание информации, могут быть самыми разнообразными - файл, клавиатура, (входящее) сетевое соединение и т.д.

То же самое касается и устройств вывода - это может быть файл, экран монитора, принтер, (исходящее) сетевое соединение и т.п.

В конечном счете, все данные в компьютерной системе в процессе обработки передаются от устройств ввода к устройствам вывода

Page 5: работа с потоками ввода вывода

Система ввода/вывода Обычно часть вычислительной платформы,

которая отвечает за обмен данным, так и называется - система ввода/вывода. В Java она представлена пакетом java.io (input/output).

Реализация системы ввода/вывода осложняется не только широким спектром источников и получателей данных, но еще и различными форматами передачи информации.

Ею можно обмениваться в двоичном представлении, символьном или текстовом с применением некоторой кодировки (только для русского языка их насчитывается от 4 штук) или передавать числа в различных представлениях.

Page 6: работа с потоками ввода вывода

Виды доступа Доступ к данным может

потребоваться как последовательный (например, считывание HTML страницы), так и произвольный (сложная работа с несколькими частями одного файла).

Зачастую для повышения производительности применяется буферизация

Page 7: работа с потоками ввода вывода

Потоки данных В Java для описания работы по

вводу/выводу используется специальное понятие поток данных (stream).

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

Page 8: работа с потоками ввода вывода

Потоки ввода и вывода потоки делятся на входные -

читающие данные, и на выходные - передающие (записывающие) данные.

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

Page 9: работа с потоками ввода вывода

Объекты потоков В Java потоки представляются объектами. Входят в пакет java.io. Разнообразны и отвечают за различную

функциональность. Разделены на две части - входные и

выходные (для ввода и вывода данных) Базовые универсальные классы позволяют

считывать и записывать информацию именно в виде набора байт

Если требуется записать в поток данные других типов или целый объект, он сначала преобразуется в набор байт (сериализуется)

При считывании происходит обратное преобразование

Page 10: работа с потоками ввода вывода

Иерархия классов для ввода

Page 11: работа с потоками ввода вывода

Иерархия классов для вывода

Page 12: работа с потоками ввода вывода

Класс InputStream Абстрактный базовый класс для потоков ввода

(чтения) двоичных данных Основные методы:

int read() - читает 1 байт из потока и возвращает его значение. Если достигнут конец потока (нет больше информации для чтения), возвращает значение -1.

int read(byte[] arr) - считывает данные в массив. Пытается считать arr.length байт. Возвращает число реально считанный байт.

int read(byte[] arr, int offset, int count) - позволяет считать count байт в массив, начиная с позиции offset (если мы хотим заполнить не весь массив).

int available() - возвращает кол-во доступных для чтения байт

void close() - закрывает поток Если чтение невозможно, выбрасывается

исключение java.io.IOException

Page 13: работа с потоками ввода вывода

Класс OutputStream Абстрактный базовый класс для потоков

вывода (записи) двоичных данных Основные методы:

void write(int char) - запись в поток 1 байта. void write(byte[] arr) - запись всех байтов

из массива void write(byte[] arr, int offset, int count) -

запись count байтов из массива, начиная с позиции offset.

void flush() - принудительная запись данных из буфера в поток.

void close() - закрывает поток Если чтение невозможно, выбрасывается

исключение java.io.IOException

Page 14: работа с потоками ввода вывода

Реализации потоков ByteArrayInputStream и ByteArrayOutputStream FileInputStream и FileOutputStream PipedInputStream и PipedOutputStream StringBufferInputStream SequenceInputStream FilterInputStreeam и FilterOutputStream BufferedInputStream и BufferedOutputStream LineNumberInputStream PushBackInputStream PrintStream DataInputStream и DataOutputStream ObjectOutputStream

Page 15: работа с потоками ввода вывода

Пример – работа с файламиString inputFileName = "d:\\input.txt";

String outputFileName = "d:\\output.txt";

try {

FileInputStream fis = new FileInputStream(inputFileName);

System.out.println("Файл " + inputFileName + " открыт для чтения");

System.out.println("Содержимое файла:");

int size = fis.available();

byte mas[] = new byte [size];

int count = fis.read(mas);

for (byte b : mas) {

System.out.print((char)b);

}

System.out.println("Считано байт: " + count);

fis.close();

// запись в файл

DataOutputStream dos = new DataOutputStream(new

FileOutputStream(outputFileName));

dos.writeDouble(3.14);

dos.writeInt(55);

dos.writeUTF("Тестовая строка 1\n");

dos.writeUTF("Тестовая строка 2\n");

dos.close();

} catch (FileNotFoundException ex) {

System.err.println("Ошибка: файл не найден");

} catch (IOException ex) {

System.err.println("Ошибка ввода/вывода");

}

Page 16: работа с потоками ввода вывода

DataInputStream и DataOutputStream При чтении и записи часто неудобно

бывает оперировать байтами (тип byte[] и int)

Для более удобной работы с потоками существуют указанные классы

Имеют методы для чтения и записи данных различных типов: writeInt, writeDouble, writeUTF и т.п.

Являются классами-обёртками для потоков, т.е. их конструкторы принимают в качестве параметров уже созданные потоки:

FileInputStream fis = new FileInputStream(inputFileName);

DataInputStream dis = new DataInputStream(fis);

Page 17: работа с потоками ввода вывода

Класс File Изучить самостоятельно

Page 18: работа с потоками ввода вывода

Чтение и запись объектов Механизм сериализации:

class User implements Serializable {

private String login;

public String passwd;

… геттеры/сеттеры

}

public class UserFrame extends javax.swing.JFrame {

ObjectInputStream ois;

ObjectOutputStream oos;

String fileName = "d:\\users.dat";

ois = new ObjectInputStream(new FileInputStream(fileName));

User u = (User)ois.readObject();

jTextField1.setText(u.getLogin());

jTextField2.setText(u.getPasswd());

ois.close();

oos = new ObjectOutputStream(new FileOutputStream(fileName));

User u = new User();

u.setLogin(jTextField1.getText());

u.setPasswd(jTextField2.getText());

oos.writeObject(u);

oos.close();

System.out.println(u);

Page 19: работа с потоками ввода вывода

Классы Reader и Writer Абстрактные базовые классы потоков

для чтения/записи символьных данных

Page 20: работа с потоками ввода вывода

Классы Reader и Writer

Page 21: работа с потоками ввода вывода

Классы Reader и Writer

Page 22: работа с потоками ввода вывода

Д/З Изучить презентацию и Лекцию № 15 Самостоятельно разобраться с классами File

и RandomAccessFile 1) создать программу решения квадратных

уравнений, кот. считывает 3 вещественных числа из файла и записывает результат в другой файл.

2) создать программу подсчёта среднего арифметического элементов массива. Считывает из файла кол-во элементов и сами элементы, записывает в другой файл результат.

3) создать программу сохранения информации о нескольких сотрудниках в файл и извлечение этой информации. Использовать поток ObjectOutputStream