
Потоковый
ввод/вывод. Сериализация
Лекция
5
по дисциплине: Технология разработки
ТК сервисов
7,
2015
СибГути
Автор: е.В. Кокорева
1. Понятия ввода и вывода
Понятие ввода относится к различным способам получения информации:
- из файла на диске;
- с клавиатуры;
- из сети и пр.
Аналогично можно определить понятие вывода.
В Java существует абстракция – Stream (поток), для работы с вводом/выводом, которая реализована в классах пакета java.io и служит для того чтобы каждой части кода не нужно было понимать разницу между клавиатурой и сетью.
Потоковый ввод в Java реализован в классе InputStream
вывод – в классе OutputStream.
2. Класс File
File —класс в java.io, который работает непосредственно с дисковыми файлами.
Файлы остаются основными ресурсами для постоянного хранения и совместного использования информации.
Кроме того, класс File определяет средства для работы с каталогами.
Каталог в Java трактуется как обычный файл, но с дополнительным свойством — списком имен файлов, который можно просмотреть с помощью метода list().
Конструкторы класса File
-
File(File dir, String name) – указывается имя объекта класса File (каталог) и имя файла;
-
File(String dirPath) – указывается путь к файлу без указания имени файла;
-
File(String dirPath, Sring name) – указывается путь к файлу и имя файла;
-
File(URI uri) – указывается имя объекта URI, описывающего файл.
Методы класса File
-
getAbsolutePath() – абсолютный путь файла, начиная с корня системы;
-
canRead() – доступно для чтения;
-
canWrite() – доступно для записи;
-
exists() – существует ли файл (true или false);
-
getName() – возвращает имя файла;
-
getParent() – возвращает имя родительского каталога;
-
getPath() – путь;
-
lastModified() – дата последнего изменения;
-
isFile() – объект является файлом;
-
isDirectory() – объект является каталогом;
-
isAbsolute() – возвращает true, если файл имеет абсолютный путь;
-
renameTo(File newPath) – переименовывает файл. В параметре указывается имя нового имени файла. Если переименование прошло неудачно, возвращает false;
-
length() – возвращает размер файла;
-
delete() – удаляет файл или пустой каталог.
Пример:
…
File f = new File("d:/java/test.txt");
System.out.println("Имя файла:" + f.getName());
System.out.println("Путь:" + f.getPath());
…
Пример работы с каталогом:
String dirName = "d:/java"; // имя каталога
File f = new File(dirName);
if (f.isDirectory()) { // является ли f каталогом?
System.out.println("Directory of' + dirName);
String s[]=f.list(); // Содержимое каталога
}
3. InputStream
InputStream — абстрактный класс, задающий используемую в Java модель входных потоков.
Все методы этого класса при возникновении ошибки возбуждают исключение IOException.
Методы класса InputStream
-
int read() – возвращает представление очередного доступного символа во входном потоке в виде целого;
-
int read(byte b[]) – пытается прочесть максимум b.length байтов из входного потока в массив b. Возвращает количество байтов, в действительности прочитанных из потока;
-
int read(byte b[], int off, int len) – пытается прочесть максимум len байтов, расположив их в массиве b, начиная с элемента off. Возвращает количество реально прочитанных байтов;
-
int skip(long n) – пытается пропустить во входном потоке n байтов. Возвращает количество пропущенных байтов;
-
int available() – возвращает количество байтов, доступных для чтения в настоящий момент;
-
void close() – закрывает источник ввода. Последующие попытки чтения из этого потока приводят к возбуждению IOException.
4. OutputStream
OutputStream — абстрактный класс. Он задает модель выходных потоков Java.
Все методы этого класса имеют тип void и возбуждают исключение IOException в случае ошибки.
Методы класса OutputStream
-
void write(int b) – записывает один байт в выходной поток. Аргумент этого метода имеет тип int;
-
void write(byte b[]) – записывает в выходной поток весь указанный массив байтов;
-
void write(byte b[], int off, int len) – записывает в поток часть массива в размере len байтов, начиная с элемента b[off];
-
void flush() – очищает любые выходные буферы, завершая операцию вывода;
-
void close() – закрывает выходной поток. Последующие попытки записи в этот поток будут возбуждать IOException.
5. Наследники класса InputStream
-
ByteArrayInputStream – позволяет использовать буфер в памяти (массива байтов) в качестве источника данных для входного потока;
ByteArrayInputStream(byte[] buf);
ByteArrayInputStream(byte[] buf, int offset, int length);
-
FileInputStream – источником данных является файл;
FileInputStream (File file);
FileInputStream (String path);
-
FilterInputStream – абстрактный класс, предоставляющий интерфейс для классов-«декораторов», которые добавляют к существующим потокам дополнительные свойства;
-
PipedInputStream – производит данные, которые были записаны в соответствующий выходной поток PipedOutputStream, реализует концепцию канала (между потоками);
PipedInputStream()
PipedInputStream(int pipeSize)
PipedInputStream(PipedOutputStream src)
PipedInputStream(PipedOutputStream src, int pipeSize)
-
SequenceInputStream – сливает два или более потоков InputStream в единый поток;
SequenceInputStream(Enumeration e)
SequenceInputStream(InputStream s0, InputStream s1)
-
StringBufferInputStream – превращает строку (String) во входной поток данных.
StringBufferInputStream( String s)
Примеры использования входных потоков:
String tmp = "abcdefghijklmnopqrstuvwxyz";
byte b[] = new byte [tmp.length()];
tmp.getBytes(tmp.length());//кодирует строку в //последовательность байт
ByteArrayInputStream input = new ByteArrayInputStream(b);
…
InputStream is = new FileInputStream(file);
int val;
while ((val = is.read()) != -1) { }
…
6. Наследники класса OutputStream
-
ByteArrayOutputStream – создаёт буфер в памяти. Все данные из этого потока помещаются в буфер;
ByteArrayOutputStream();
ByteArrayOutputStream(int size);
-
FileOutputStream – помещает данные в файл;
FileOutputStream (File file);
FileOutputStream (String path);
-
FilterOutputStream – абстрактный класс, предоставляющий интерфейс для классов-«декораторов», которые добавляют к существующим потокам дополнительные свойства;
-
PipedOutputStream – данные, записываемые в данный поток, автоматически появляются в ассоциированном с ним входном потоке PipedInputStream, реализует концепцию канала;
PipedOutputStream()
PipedOutputStream(InputStream in)
Пример использования FileOutputStream:
…
byte b = (byte)System.in.read();
OutputStream f = new FileOutputStream("file1.txt");
f.write(b);
…