Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП(для очников).doc
Скачиваний:
36
Добавлен:
26.03.2016
Размер:
191.49 Кб
Скачать

Организация ввода/вывода

Пакет java.io используется для организации операций ввода/вывода. В пакетеjava.ioопределяются несколько типов потоков. Обычно они составляют пары ввода/вывода:

  • Конвейерные потоки Pipedспроектированы для парного использования, при котором байты, записываемые вPipedOutputStream, могут читаться изPipedInputStream.

  • Байтовые потоки ByteArrayосуществляют ввод/вывод в массив байтов.

  • Фильтрующие потоки Filteredпредставляют собой абстрактные классы байтовых потоков, в которых с читаемыми байтами выполняются некоторые операции-фильтры. ОбъектFilterInputStreamполучает ввод от другого объектаInputStream, некоторым образом обрабатывает (фильтрует) байты и возвращает результат. Фильтрующие потоки могут объединяться в последовательности, при этом несколько фильтров превращаются в один сквозной фильтр. Аналогичным образом осуществляется и фильтрация вывода – для этого применяются различные классыFilterOutputStream.

  • Буферизованные потоки Bufferedрасширяют понятие фильтрующих потоков, добавляя буферизацию, чтобы при каждом вызовеreadиwriteне приходилось обращаться к файловой системе.

  • Потоки данных Data разделяются на две категории. ИнтерфейсыDataInputиDataOutputопределяют методы для чтения и записи данных встроенных типов. Эти интерфейсы реализуются классамиDataInputStreamиDataOutputStream.

  • Файловые потоки Fileрасширяют понятие фильтрующих потоков, байтовый поток в них связывается с определенным файлом. В них встроены некоторые методы, относящиеся к работе с файлами.

InputStream– абстрактный класс, задающий используемую в Java модель входных потоков. Все методы этого класса при возникновении ошибки возбуждают исключениеIOException.

read() возвращает представление очередного доступного символа во входном потоке в виде целого.

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

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

skip(число байтов) пытается пропустить во входном потоке указанное число байтов. Возвращает количество пропущенных байтов.

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

close() закрывает источник ввода. Последующие попытки чтения из этого потока приводят к возбуждениюIOException.

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

reset() возвращает указатель потока на установленную ранее метку.

markSupported() возвращаетtrue, если данный поток поддерживает операцииmark/reset.

OutputStreamявляется классом, задает модель выходных потоков Java. Все методы этого класса имеют типvoidи возбуждают исключениеIOExceptionв случае ошибки. Ниже приведен список методов этого класса:

write(поле целого типа) записывает один байт в выходной поток. Обратите внимание на то, что аргумент этого метода имеет типint, что позволяет вызыватьwrite, передавая ему выражение, при этом не нужно выполнять приведение его типа кbyte.

write(массив байтов) записывает в выходной поток указанный массив байтов.

write(массив байтов, смещение, число символов) записывает в поток часть массива – число символов, начиная с указанного смещения массива.

flush() очищает любые выходные буферы, завершая операцию вывода.

close() закрывает выходной поток. Последующие попытки записи в этот поток будут возбуждатьIOException.

Файловые потоки.КлассFileInputStreamиспользуется для ввода данных из файлов. При создании объекта классаFileInputStreamфайл открывается для чтения.

FileInputStreamзамещает шесть первых методов абстрактного классаInputStream. Попытки применить к объекту этого класса методыmarkиresetприводят к возбуждению исключенияIOException. Класс имеет конструкторFileInputStream(строка с именем файла).

В приведенном ниже примере показано, как можно читать одиночные байты, массив байтов и поддиапазон массива байтов. В этом примере также показано, как методом availableможно узнать, сколько еще осталось непрочитанных байтов, и как с помощью методаskipможно пропустить те байты, которые Вы не хотите читать.

import java.io.*;

import java.util.*;

class FileInputStreamS {

public static void main(String args[]) {

int size;

InputStream f1 = new FileInputStream("default.htm");

size = f1.available();

System.out.println("Total Available Bytes: " + size);

System.out.println("First 1/4 of the file: read()");

for (int i=0; i < size/4; i++) {

System.out.print((char) f1.read());

}

System.out.println("Total Still Available: " +

f1.available());

System.out.println("Reading the next"+

"1/8: read(b[])");

byte b[] = new byte[size/8];

if (f1.read(b) != b.length) {

System.err.println("Something bad happened");

}

String tmpstr = new String(b, 0, 0, b.length);

System.out.println(tmpstr);

System.out.println("Still Available: " +

f1.available());

System.out.println("Skipping another 1/4: skip()");

f1.skip(size/4);

System.out.println( "Still Available: " +

f1.available());

System.out.println("Reading 1/16 into the end"+

" of array");

if (f1.read(b, b.length-size/16, size/16) !=

size/16) {

System.err.println("Something bad happened");

}

System.out.println("Still Available: " +

f1.available());

f1.close();

}

}

У класса FileOutputStream – такой же конструктор, что и у FileInputStream. Создавать объекты этого класса можно независимо от того, существует файл или нет. При создании нового объекта классFileOutputStreamперед тем, как открыть файл для вывода, сначала создает его.

В примере символы, введенные с клавиатуры, считываются из потока System.inпо одному, до тех пор, пока не заполнится 12-байтовый буфер. После этого создаются три файла. В первый из них,file1.txt, записываются через один символы из буфера (нулевой, второй и так далее). Во второй,file2.txt, записывается весь буфер. В третий файл записывается половина буфера, расположенная в середине.

import java.io.*;

class FileOutputStreamS {

public static byte getlnput() {

byte buffer[] = new byte[12];

for (int i=0; i<12; i++) {

buffer[i] = (byte) System.in.read();

}

return buffer;

}

public static void main(String args[]) {

byte buf[] = getlnput();

OutputStream f0 = new FileOutputStream("file1.txt");

OutputStream f1 = new FileOutputStream("file2.txt");

OutputStream f2 = new FileOutputStream("file3.txt");

for (int i=0; i < 12; i += 2) {

f0.write(buf[i]);

}

f0.close();

f1.write(buf);

f1.close();

f2.write(buf, 12/4, 12/2);

f2.close();

}

}

Потоки данных DataInput и DataOutput.Хотя возможность чтения и записи байтовых потоков достаточно полезна, часто бывает необходимо пересылать в потоке данные определенного типа. ИнтерфейсыDataInputиDataOutputопределяют методы для пересылки примитивных типов Java в потоке. Реализация этих интерфейсов по умолчанию представлена классамиDataInputStreamиDataOutputStream.

Интерфейсы для входных и выходных потоков данных являются практически зеркальными отражениями друг друга. В таблице содержатся параллельные методы чтения и записи для каждого из типов:

Read

Write

Тип

readBoolean

writeBoolean

boolean

readChar

writeChar

char

readByte

writeByte

byte

readShort

writeShort

short

readInt

writeInt

int

readLong

writeLong

long

readFloat

writeFloat

float

readDouble

writeDouble

double

readUTF

writeUTF

String в формате UTF