Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Java.doc
Скачиваний:
11
Добавлен:
20.04.2019
Размер:
936.45 Кб
Скачать

If ("женат".EqualsIgnoreCase(state) ||

"замужем".equalsIgnoreCase(state) ) return true;

If ("неженат".EqualsIgnoreCase(state) ||

"незамужем".equalsIgnoreCase(state) ) return false;

throw new IllegalArgumentException

("Неверно указано семейное состояние");

}

Классы пользовательских исключений описываются путем наследования от уже существующего наиболее подходящего класса исключений.

Пример.

class IllegalFamilyStatusException

extends IllegalArgumentException {

public IllegalFamilyStatusException() {

super("Неверно указано семейное состояние");

}

}

Потоковый ввод-вывод

В языке Java используется потоковая модель организации ввода-вывода.

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

Для организации потокового ввода-вывода в библиотеке Java имеется несколько десятков классов.

Почти все они являются потомками четырех абстрактных классов, размещенных в пакете java.io.

В абстрактных классах объявлена минимальная функциональность: ввод (вывод) одного байта (символа) или массива байтов (символов).

Базовые классы потоков ввода-вывода

 

Ввод

Вывод

Байтовый

InputStream

OutputStream

Символьный

Reader

Writer

Некоторые потомки базовых классов ввода-вывода

FileXXX классы для организации файлового ввода-вывода

BufferedXXX классы для буферизации ввода-вывода

DataXXX классы для ввода-вывода примитивных типов

ByteArrayXXX, CharArrayXXX классы для организации ввода-вывода из массивов байт (символов)

StringXXX классы для организации ввода-вывода из строк

ObjectXXX классы для ввода-вывода объектов

Основные методы класса InputStream

int read() возвращает значение очередного байта, прочитанного из потока.

int read(byte[] b) заполняет массив байтами, прочитанными из потока. Возвращаемое значение равно количеству прочитанных байтов.

int read(byte[] b, int offset, int length) начиная с индекса offset заполняет length элементов массива байтами, прочитанными из потока.

При попытке чтения после конца потока все методы возвращают значение –1.

Основные методы класса Reader

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

int read(char[] c) заполняет массив символами, прочитанными из потока. Возвращаемое значение равно количеству прочитанных символов.

int read(char[] c, int offset, int length) начиная с индекса offset заполняет length элементов массива символами, прочитанными из потока.

При попытке чтения после конца потока все методы возвращают значение –1.

Основные методы класса OutputStream

void write(int b) записывает один байт в поток.

void write(byte[] b) записывает все элементы массива в поток.

void write(byte[] b, int offset, int length) записывает в поток length элементов массива, начиная с индекса offset.

Основные методы класса Writer

void write(int b) записывает один символ в поток.

void write(char[] c) записывает все элементы массива в поток.

void write(char[] c, int offset, int length) записывает в поток length элементов массива, начиная с индекса offset.

void write(String str) записывает содержимое строки в поток

void write(String str, int offset, int length) записывает в поток length символов строки, начиная с индекса offset.

Типичная последовательность организации потокового ввода-вывода

1. создать объект-поток, указав необходимые параметры конструктора;

2. выполнить требуемые операции ввода-вывода, не забывая при этом обрабатывать исключительные ситуации типа IOException;

3. закрыть поток методом close().

Файловый ввод-вывод

Классы FileInputStream, FileOutputStream, FileReader, FileWriter используются для создания потоков, связанных с файлами.

При создании объекта-потока в качестве параметра указывается строка с именем файла, например:

FileInputStream fis = new FileInputStream("file.dat");

Пример. Копирование файла

FileInputStream fin=new FileInputStream("старый");

FileOutputStream fout=new FileOutputStream("новый");

byte bufer[]=new byte[4096];

int count;

do {

count=fin.read(bufer);

if (count>0) fout.write(bufer,0,count);

} while (count>0);

fin.close();

fout.close();

Буферизованный ввод-вывод

Классы BufferedInputStream, BufferedOutputStream, BufferedReader, BufferedWriter используются для повышения производительности при работе с другими потоками.

При создании потока в качестве параметра указывается уже существующий поток, например:

BufferedReader br = new BufferedReader( new FileReader("file.dat") );

Дальнейшая работа с потоком осуществляется как обычно.

Бинарный ввод-вывод

Классы DataInputStream, DataOutputStream используются для ввода-вывода значений примитивных типов данных с сохранением их двоичного представления.

При создании потока в качестве параметра указывается уже существующий байтовый поток, например:

DataInputStream dis = new DataInputStream( new FileInputStream("file.dat") );

При работе с потоками используются методы:

для чтения для записи

boolean readBoolean() void writeBoolean(boolean v)

byte readByte() void writeByte(int v)

char readChar() void writeChar(int v)

double readDouble() void writeDouble(double v)

float readFloat() void writeFloat(float v)

int readInt() void writeInt(int v)

long readLong() void writeLong(long v)

short readShort() void writeShort(short v)

Пример. Запись переменных в поток

DataOutputStream dos = new DataOutputStream(...);

dos.writeBoolean(b); // логическая

dos.writeDouble(d); // дробная

dos.writeInt(i); // целая

dos.close();

Пример. Чтение переменных из потока

DataInputStream dis = new DataInputStream(...);

b=dis.readBoolean(); // логическая

d=dis.readDouble(); // дробная

i=dis.readInt(); // целая

dis.close();

Ввод-вывод объектов

Классы ObjectInputStream, ObjectOutputStream используются для ввода-вывода объектов из байтовых потоков.

При создании потока в качестве параметра указывается уже существующий байтовый поток, например:

ObjectInputStream ois = new ObjectInputStream( new FileInputStream("file.dat") );

При работе с потоками могут использоваться те же методы, что и у классов DataInputStream, DataOutputStream, и два специальных метода:

Object readObject() для чтения объекта из потока

void writeObject(Object obj) для записи объекта в поток

Пример. Запись объекта (массива) в поток

ObjectOutputStream oos=new ObjectOutputStream(...);

int intmas[]=new int[]{1,2,3,4,5};

oos.writeObject(intmas);

oos.close();

Пример. Чтение объекта (массива) из потока

ObjectInputStream ois=new ObjectInputStream(...);

int intmas[]=(int []) ois.readObject();

ois.close();

Преобразователи потоков

Классы InputStreamReader, OutputStreamWriter осуществляют преобразование байтового потока в символьный и наоборот.

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

Reader r = new InputStreamReader(in,"cp866");

Writer w = new OutputStreamWriter(out,"cp866");

Таким образом, с байтовыми потоками можно работать используя инструментарий для обработки символьных потоков.

Форматированный ввод

Класс java.util.Scanner позволяет по текстовому представлению значений примитивных типов получить их внутреннее (двоичное) представление.

Методы вида hasNextXXX() позволяют определить наличие в потоке текстового представления значения указанного типа.

Методы вида nextXXX() позволяют считать из потока значения указанного типа.

Пример. Ввод значений с клавиатуры

Scanner scanner=new Scanner(System.in);

System.out.println("Введите строку");

String s=scanner.nextLine();

System.out.println("Введите целое число");

int n=scanner.nextInt();

System.out.println("Введите дробное число");

double d=scanner.nextDouble();

Форматированный вывод

Классы PrintStream, PrintWriter позволяют получить текстовое представление значений примитивных типов.

Методы вида print(...) выводят в поток значения примитивных типов.

Метод printf(…) работает аналогично одноименной функции языка С.

Пример. Форматированный вывод

System.out.println("Результаты расчетов:");

System.out.printf("x=%5.3f, y=%5.3f%n",x,y);

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]