.RU

Описание исходных текстов аплета Rectangles - Конспект лекций по курсу Выбранные вопросы информатики



^ Описание исходных текстов аплета Rectangles

В этом приложении мы создаем на базе класса Thread три класса. Первый из них предназначен для создания потока рисования прямоугольников, второй - для создания потока рисования закрашенных эллипсов, а третий - для управления потоком рисования эллипсов.

Что же касается основного класса аплета, то он унаследован, как обычно, от класса Applet и не реализует интерфейс Runnable:

public class Rectangles extends Applet

{

. . .

}

^ Поля класса Rectangles

В классе Rectangles мы определили три поля с именами m_DrawRectThread, m_DrawEllipseThread и m_NotifyTaskThread:

DrawRectangles m_DrawRectThread = null;

DrawEllipse m_DrawEllipseThread = null;

NotifyTask m_NotifyTaskThread = null

Эти поля являются ссылками на классы, соответственно DrawRectangles, DrawEllipse и NotifyTask . Первый из них создан для рисования прямоугольников, второй - эллипсов, а третий - для управления потоком рисования эллипсов.

Указанные поля инициализируются занчением null, что соответствует неработающим или несозданным задачам.

^ Метод start класса Rectangles

Этот метод последовательно создает три потока и запускает их на выполнение:

if(m_DrawRectThread == null)

{

m_DrawRectThread = new DrawRectangles(this);

m_DrawRectThread.start();

}

if(m_DrawEllipseThread == null)

{

m_DrawEllipseThread = new DrawEllipse(this);

m_DrawEllipseThread.start();

}

if(m_NotifyTaskThread == null)

{

m_NotifyTaskThread = new NotifyTask(m_DrawEllipseThread);

m_NotifyTaskThread.start();

}

В качестве параметра конструкторам классов DrawRectangles и DrawEllipse мы передаем ссылку на аплет Rectangles. Эта ссылка будет нужна для получения контекста отображения и рисования геометрических фигур.

Поток класса NotifyTask будет управлять работой потока DrawEllipse, поэтому мы передаем его конструктору ссылку на соответствующий объект m_DrawEllipseThread.

^ Метод stop класса Rectangles

Когда пользователь покидает страницу сервера Web с аплетом, метод stop класса Rectangles последовательно останавливает gjnjrb рисования прямоугольников и эллипсов, а также управляющий поток:

if(m_DrawRectThread != null)

{

m_DrawRectThread.stop();

m_DrawRectThread = null;

}

if(m_DrawEllipseThread == null)

{

m_DrawEllipseThread.stop();

m_DrawEllipseThread = null;

}

if(m_NotifyTaskThread != null)

{

m_NotifyTaskThread.stop();

m_NotifyTaskThread = null;

}

^ Поля класса DrawRectangles

Класс DrawRectangles определен для потока рисования прямоугольников:

class DrawRectangles extends Thread

{

. . .

}

В поле g класа хранится контекст отображения окна аплета, а в поле dimAppWndDimension - размеры этого окна:

Graphics g;

Dimension dimAppWndDimension;

Значения этих полей определяются конструктором класса по ссылке на главный класс аплета.

^ Конструктор класса DrawRectangles

В качестве параметра конструктору передается ссылка на класс аплета. Конструктор использует эту ссылку для получения и сохранения в полях класса контекста отображения и размеров окна аплета:

public DrawRectangles(Applet Appl)

{

g = Appl.getGraphics();

dimAppWndDimension = Appl.getSize();

}

^ Метод run класса DrawRectangles

Программный код метода run работает в рамках отдельного потока. Он рисует в окне аплета закрашенные прямоугольники. Прямоугольники имеют случайные координаты, расположение и цвет.

Для того чтобы рисовать, необходимо получить контекст отображения. Этот контекст был получен конструктором класса DrawRectangles и может быть использован методом run.

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

В качестве генератора случайных чисел мы используем метод random из класса Math, который при каждом вызове возвращает новое случайное число типа double, лежащее в диапазоне значений от 0.0 до 1.0.

Координаты по осям X и Y рисуемого прямоугольника определяются простым умножением случайного числа, полученного от метода random, соответственно, на ширину и высоту окна аплета:

x = (int)(dimAppWndDimension.width * Math.random());

y = (int)(dimAppWndDimension.height* Math.random());

Аналогично определяются размеры прямоугольника, однако чтобы прямоугольники не были слишком крупными, мы делим полученные значения на 2:

width = (int)(dimAppWndDimension.width * Math.random()) / 2;

height = (int)(dimAppWndDimension.height * Math.random()) / 2;

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

Для случайного выбора цвета прямоугольника мы вычисляем отдельные цветовые компоненты, умножая значение, полученное от метода random, на число 255:

rColor = (int)(255 * Math.random());

gColor = (int)(255 * Math.random());

bColor = (int)(255 * Math.random());

Полученные значения цветовых компонент используются в конструкторе Color для получения цвета. Этот цвет устанавливается в контексте отображения методом setColor:

g.setColor(new Color(rColor, gColor, bColor));

Теперь все готово для рисования прямоугольника, которое мы выполняем при помощи метода fillRect:

g.fillRect(x, y, width, height);

После рисования прямоугольника метод run задерживает свою работу на 50 миллисекунд, вызывая метод sleep:

try

{

Thread.sleep(50);

}

catch (InterruptedException e)

{

stop();

}

Для обработки исключения InterruptedException, которое может возникнуть во время работы этого метода, мы предусмотрели блок try - catch. При возникновении указанного исключения работа потока останавливается вызовом метода stop.

^ Метод run класса DrawEllipse

Класс DrawEllipse очень похож на только что рассмотренный класс DrawRectangles. Отличие есть только в финальном фрагменте метода run, который мы и рассмотрим.

Вместо задержки на 50 миллисекунд метод run из класса DrawEllipse переходит в состояние ожидания извещения, вызывая метод wait:

try

{

this.wait();

}

catch (InterruptedException e)

{

}

Это извещение создается управляющим потоком класса NotifyTask, к описанию которого мы переходим.

^ Поля класса NotifyTask

В классе NotifyTask мы определили одно поле STask класса Thread. Это поле которое хранит ссылку на поток, работой которого управляет данный класс:

class NotifyTask extends Thread

{

Thread STask;

. . .

}

^ Конструктор класса NotifyTask

Конструктор класса NotifyTask записывает в поле STask ссылку на задачу рисования эллипсов:

public NotifyTask(Thread SynchroTask)

{

STask = SynchroTask;

}

^ Метод run класса NotifyTask

Метод run класса NotifyTask периодически разблокирует поток рисования эллипсов, вызывая для этого метод notify в цилке с задержкой 30 миллисекунд. Обращение к объекту STask, который хранит ссылку на поток рисования эллипсов, выполняется с использованием синхронизации:

public void run()

{

while (true)

{

try

{

Thread.sleep(30);

}

catch (InterruptedException e)

{

}

synchronized(STask)

{

STask.notify();

}

}

}


Лекция 4

Ввод – вывод и работа с файлами

^ Работа с файлами

Библиотека классов языка программирования Java содержит многочисленные средства, предназначенные для работы с файлами. И хотя аплеты не имеют доступа к локальным файлам, расположенным на компьютере пользователя, они могут обращаться к файлам, которые находятся в каталоге сервера Web. Автономные приложения Java могут работать как с локальными, так и с удаленными файлами (через сеть Internet или Intranet).

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


^ Классы Java для работы с потоками

Программист, создающий автономное приложение Java, может работать с потоками нескольких типов:

стандартные потоки ввода и вывода;

потоки, связанные с локальными файлами;

потоки, связанные с файлами в оперативной памяти;

потоки, связанные с удаленными файлами

Рассмотрим кратко классы, связанные с потоками.

Стандартные потоки

Для работы со стандартными потоками в классе System имеется три статических объекта: System.in, System.out и System.err. По своему назначению эти потоки больше всего напоминают стандартные потоки ввода, вывода и вывода сообщений об ошибках операционной системы MS-DOS.

Поток System.in связан с клавиатурой, поток System.out и System.err - с консолью приложения Java.

Базовые классы для работы с файлами и потоками

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

Все основные классы, интересующие нас в этой главе, произошли от класса Object (рис. 1).



Рис. 1. Основные классы для работы с файлами и потоками

^ Класс InputStream

Класс InputStream является базовым для большого количества классов, на основе которых создаются потоки ввода. Именно производные классы применяются программистами, так как в них имеются намного более мощные методы, чем в классе InputStream. Эти методы позволяют работать с потоком ввода не на уровне отдельных байт, а на уровне объектов различных классов, например, класса String и других.

^ Класс OutputStream

Аналогично, класс OutputStream служит в качестве базового для различных классов, имеющих отношение к потокам вывода.

Класс RandomAccesFile

С помощью класса RandomAccesFile можно организовать работу с файлами в режиме прямого доступа, когда программа указывает смещение и размер блока данных, над которым выполняется операция ввода или вывода. Заметим, кстати, что классы InputStream и OutputStream также можно использовать для обращения к файлам в режиме прямого доступа.

^ Класс File

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

^ Класс FileDescriptor

C помощью класса FileDescriptor вы можете проверить идентификатор открытого файла.

Класс StreamTokenizer

Очень удобен класс StreamTokenizer. Он позволяет организовать выделение из входного потока данных элементов, отделенных друг от друга заданными разделителями, такими, например, как запятая, пробел, символы возврата каретки и перевода строки.

Производные от класса InputStream

От класса InputStream производится много других классов, как это показано на рис. 2.



Рис. 2. Классы, производные от класса InputStream

^ Класс FilterInputStream

Класс FilterInputStream, который происходит непосредственно от класса InputStream, является абстрактным классом, на базе которого созданы классы BufferedInputStream, DataInputStream, LineNumberInputStream и PushBackInputStream. Непосредственно класс FilterInputStream не используется в приложениях Java, так как, во-первых, он является абстрактным и предназначен для переопределения методов базового класса InputStream, а во-вторых, наиболее полезные методы для работы с потоками ввода имеются в классах, созданных на базе класса FilterInputStream.

^ Класс BufferedInputStream

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

Класс BufferedInputStream может быть использован приложениями Java для организации буферизованных потоков ввода. Заметим, что конструкторы этого класса в качестве параметра получают ссылку на объект класса InputStream. Таким образом, вы не можете просто создать объект класса BufferedInputStream, не создав перед этим объекта класса InputStream. Подробности мы обсудим позже.

^ Класс DataInputStream

Составляя программы на языке программирования С, вы были вынуждены работать с потоками на уровне байт или, в лучшем случае, на уровне текстовых строк. Однако часто возникает необходимость записывать в потоки данных и читать оттуда объекты других типов, например, целые числа и числа типа double, числа в формате с плавающей десятичной точкой, массивы байт и символов и так далее.

Класс DataInputStream содержит методы, позволяющие извлекать из входного потока данные в перечисленных выше форматах или, как говорят, выполнять форматированный ввод данных. Он также реализует интерфейс DataInput, служащий для этой же цели. Поэтому класс DataInputStream очень удобен и часто применяется в приложениях для работы с потоками ввода.

Так же как и конструктор класса BufferedInputStream, конструктор класса DataInputStream должен получить через свои параметр ссылку на объект класса InputStream.

^ Класс LineNumberInputStream

С помощью класса LineNumberInputStream вы можете работать с текстовыми потоками, состоящими из отдельных строк, разделенных символами возврата каретки \r и перехода на следующую строку \n. Методы этого класса позволяют следить за нумерацией строк в таких потоках.

^ Класс PushBackInputStream

Класс PushBackInputStream позволяет возвратить в поток ввода только что прочитанный оттуда символ, с тем чтобы после этого данный символ можно было прочитать снова.

^ Класс ByteArrayInputStream

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

Потоки в оперативной памяти могут быть использованы для временного хранения данных. Заметим, что так как аплеты Java не могут обращаться к локальным файлам, для создания временных файлов можно использовать потоки в оперативной памяти на базе класса ByteArrayInputStream. Другую возможность предоставляет класс StringBufferInputStream, рассмотренный ниже.

^ Класс StringBufferInputStream

Класс StringBufferInputStream позволяет создавать потоки ввода на базе строк класса String, используя при этом только младшие байты хранящихся в такой строке символов. Этот класс может служить дополнением для класса ByteArrayInputStream, который также предназначен для создания потоков на базе данных из оперативной памяти.

^ Класс FileInputStream

Этот класс позволяет создать поток ввода на базе класса File или FileDescriptor.

Класс PipedInputStream

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

^ Класс SequenceInputStream

Класс SequenceInputStream позволяет объединить несколько входных потоков в один поток. Если в процессе чтения будет достигнут конец первого потока такого объединения, в дальнейшем чтение будет выполняться из второго потока и так далее.

^ Производные от класса OutputStream

Класс OutputStream предназначен для создания потоков вывода. Приложения, как правило, непосредственно не используют этот класс для операций вывода, так же как и класс InputStream для операций ввода. Вместо этого применяются классы, иерархия которых показана на рис. 3.



Рис. 3. Классы, производные от класса OutputtStream

Рассмотрим кратко назначение этих классов.

Класс FilterOutputStream

Абстрактный класс FilterOutputStream служит прослойкой между классом OutputStream и классами BufferedOutputStream, DataOutputStream, а также PrintStream. Он выполняет роль, аналогичную роли рассмотренного ранее класса FilterIntputStream.

^ Класс BufferedOutputStream

Класс BufferedOutputStream предназначен для создания буферизованных потоков вывода. Как мы уже говорили, буферизация ускоряет работу приложений с потоками.

^ Класс DataOutputStream

С помощью класса DataOutputStream приложения Java могут выполнять форматированный вывод данных. Для ввода форматированных данных вы должны создать входной поток с использованием класса DataInputStream, о котором мы уже говорили. Класс DataOutputStream реализует интерфейс DataOutput.

^ Класс PrintStream

Потоки, созданные с использованием класса PrintStream, предназначены для форматного вывода данных различных типов с целью их визуального представления в виде текстовой строки. Аналогичная операция в языке программирования С выполнялась функцией printf.

^ Класс ByteArrayOutputStream

С помощью класса ByteArrayOutputStream можно создать поток вывода в оперативной памяти.

Класс FileOutputStream

Этот класс позволяет создать поток вывода на базе класса File или FileDescriptor.

^ Класс PipedOutputStream

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


^ Работа со стандартными потоками

Приложению Java доступны три стандратных потока, которые всегда открыты: стандартный поток ввода, стандартный поток вывода и стандартный поток вывода сообщений об ошибках.

Все перечисленные выше потоки определены в классе System как статические поля с именами, соответственно, in, out и err:

public static PrintStream err;

public static InputStream in;

public static PrintStream out;

Заметим, что стандратные потоки, как правило, не используются аплетами, так как браузеры общаются с пользователем через окно аплета и извещения от мыши и клавиатуры, а не через консоль.

^ Стандартный поток ввода

Стандартный поток ввода in определен как статический объект класса InputStream, который содержит только простейшие методы для ввода данных. Нужнее всего вам будет метод read:

public int read(byte b[]);

Этот метод читает данные из потока в массив, ссылка на который передается через единственный параметр. Количество считанных данных определяется размером массива, то есть значением b.length.

Метод read возвращает количество прочитанных байт данных или -1, если достигнут конец потока. При возникновении ошибок создается исключение IOException, обработку которого необходимо предусмотреть.

^ Стандартный поток вывода

Стандартный поток вывода out создан на базе класса PrintStream, предназначенного, как мы это отмечали раньше, для форматированного вывода данных различного типа с целью их визуального отображения в виде текстовой строки.

Для работы со стандартным потоком вывода вы будете использовать главным образом методы print и println, хотя метод write также доступен.

В классе PrintStream определено несколько реализаций метода print с параметрами различных типов:

public void print(boolean b);

public void print(char c);

public void print(char s[]);

public void print(double d);

public void print(float f);

public void print(int i);

public void print(long l);

public void print(Object obj);

public void print(String s);

Как видите, вы можете записать в стандартный поток вывода текстовое представление данных различного типа, в том числе и класса Object.

Метод println аналогичен методу print, отличаясь лишь тем, что он добавляет к записываемой в поток строке символ перехода на следующую строку:

public void println();

public void println(boolean b);

public void println(char c);

public void println(char s[]);

public void println(double d);

public void println(float f);

public void println(int i);

public void println(long l);

public void println(Object obj);

public void println(String s);

Реализация метода println без параметров записывает только символ перехода на следующую строку.

^ Стандартный поток вывода сообщений об ошибках

Стандартный поток вывода сообщений об ошибках err так же, как и стандартный поток вывода out, создан на базе класса PrintStream. Поэтому для записи сообщений об ошибках вы можете использовать только что описанные методы print и println.


^ Создание потоков, связанных с файлами

Если вам нужно создать входной или выходной поток, связанный с локальным файлом, следует воспользоваться классами из библиотеки Java, созданными на базе классов InputStream и OutputStream. Мы уже кратко рассказывали об этих классах в разделе "Классы Java для работы с потоками". Однако методика использования перечисленных в этом разделе классов может показаться довольно странной.

В чем эта странность?

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

Поясним сказанное на примере.

Пусть, например, нам нужен выходной поток для записи форматированных данных (скажем, текстовых строк класса String). Казалось бы, достаточно создать объект класса DataOutputStream, - и дело сделано. Однако не все так просто.

В классе DataOutputStream предусмотрен только один конструктор, которому в качестве параметра необходимо передать ссылку на объект класса OutputStream:

public DataOutputStream(OutputStream out);

Что же касается конструктора класса OutputStream, то он выглядит следующим образом:

public OutputStream();

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

Что же делать?

Создание потока для форматированного обмена данными

Оказывается, создание потоков, связанных с файлами и предназначенных для форматированного ввода или вывода, необходимо выполнять в несколько приемов. При этом вначале необходимо создать потоки на базе класса FileOutputStream или FileInputStream, а затем передать ссылку на созданный поток констркутору класса DataOutputStream или DataInputStream.

В классах FileOutputStream и FileInputStream предусмотрены конструкторы, которым в качестве параметра передается либо ссылка на объект класса File, либо ссылка на объект класса FileDescriptor, либо, наконец, текстовая строка пути к файлу:

public FileOutputStream(File file);

public FileOutputStream(FileDescriptor fdObj);

public FileOutputStream(String name);

Таким образом, если вам нужен выходной поток для записи форматированных данных, вначале вы создаете поток как объект класса FileOutputStream. Затем ссылку на этот объект следует передать конструктору класса DataOutputStream. Полученный таким образом объект класса DataOutputStream можно использовать как выходной поток, записывая в него форматированные данные.

Добавление буферизации

А что, если нам нужен не простой выходной поток, а буферизованный?

Здесь нам может помочь класс BufferedOutputStream. Вот два конструктора, предусмотренных в этом классе:

public BufferedOutputStream(OutputStream out);

public BufferedOutputStream(OutputStream out, int size);

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

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

создается поток, связанный с файлом, как объект класса FileOutputStream;

ссылка на этот поток передается конструктору класса BufferedOutputStream, в результате чего создается буферизованный поток, связанный с файлом;

ссылка на буферизованный поток, созданный на предыдущем шаге, передается конструктору класса DataOutputStream, который и создает нужный поток

Вот фрагмент исходного текста программы, который создает выходной буферизованный поток для записи форматированных данных в файл с именем output.txt:

DataOutputStream OutStream;

OutStream = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("output.txt")));

Аналогичным образом создается входной буферизованный поток для чтения форматированных данных из того же файла:

DataInputStream InStream;

InStream = new DataInputStream(new BufferedInputStream(new FileInputStream("output.txt")));

^ Исключения при создании потоков

При создании потоков на базе классов FileOutputStream и FileInputStream могут возникать исключения FileNotFoundException, SecurityException, IOException.

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

Исключение SecurityException возникает при попытке открыть файл, для которого запрещен доступ. Например, если файл можно только читать, а он открывается для записи, возникнет исключение SecurityException.

Если файл не может быть открыт для записи по каким-либо другим причинам, возникает исключение IOException.


^ Запись данных в поток и чтение данных из потока

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

^ Простейшие методы

Создав выходной поток на базе класса FileOutputStream, вы можете использовать для записи в него данных три разновидности метода write, прототипы которых представлены ниже:

public void write(byte b[]);

public void write(byte b[],

int off, int len);

public void write(int b);

Первый из этих методов записывает в поток содержимое массива, ссылка на который передается через параметр, начиная с текущей позиции в потоке. После выполнения записи текущая позиция продвигается вперед на число записанных байт, которое при успешном завершении операции равно длине массива (b.length).

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

Третий метод просто записывает в поток один байт данных.

Если в процессе записи происходит ошибка, возникает исключение IOException.

Для входного потока, созданного на базе класса FileInputStream, определены три разновидности метода read, выполняющего чтение данных:

public int read();

public int read(byte b[]);

public int read(byte b[],

int off, int len);

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

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

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

Если при чтении происходит ошибка, возникает исключение IOException.

Методы для чтения и записи форматированных данных

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

Вот, например, какой набор методов можно использовать для записи форматированных данных в поток класса DataOutputStream:

public final void writeBoolean(boolean v);

public final void writeByte(int v);

public final void writeBytes(String s);

public final void writeChar(int v);

public final void writeChars(String s);

public final void writeDouble(double v);

public final void writeFloat(float v);

public final void writeInt(int v);

public final void writeLong(long v);

public final void writeShort(int v);

public final void writeUTF(String s);

Хотя имена методов говорят сами за себя, сделаем замечания относительно применения некоторых из них.

Метод writeByte записывает в поток один байт. Это младший байт слова, которое передается методу через параметр v. В отличие от метода writeByte, метод writeChar записывает в поток двухбайтовое символьное значение (напомним, что в Java символы хранятся с использованием кодировки Unicode и занимают два байта).

Если вам нужно записать в выходной поток текстовую строку, то это можно сделать с помощью методов writeBytes, writeChars или writeUTF. Первый из этих методов записывает в выходной поток только младшие байты символов, а второй - двухбайтовые символы в кодировке Unicode. Метод writeUTF предназначен для записи строки в машинно-независимой кодировке UTF-8.

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

В классе DataInputStream определены следующие методы, предназначенные для чтения форматированных данных из входного потока:

public final boolean readBoolean();

public final byte readByte();

public final char readChar();

public final double readDouble();

public final float readFloat();

public final void readFully(byte b[]);

public final void readFully(byte b[],

int off, int len);

public final int readInt();

public final String readLine();

public final long readLong();

public final short readShort();

public final int readUnsignedByte();

public final int readUnsignedShort();

public final String readUTF();

public final static String readUTF(

DataInput in);

public final int skipBytes(int n);

Обратите внимание, что среди этих методов нет тех, что специально предназначены для четния данных, записанных из строк методами writeBytes и writeChars класса DataOutputStream.

Тем не менее, если входной поток состоит из отдельных строк, разделенных символами возврата каретки и перевода строки, то такие строки можно получить методом readLine. Вы также можете воспользоваться методом readFully, который заполняет прочитанными данными массив байт. Этот массив потом будет нетрудно преобразовать в строку типа String, так как в классе String предусмотрен соответствующий конструктор.

Для чтения строк, записанных методом writeUTF вы должны обязательно пользоваться методом readUTF.

Метод skipBytes позволяет пропустить из входного потока заданное количество байт.

Методы класса DataInputStream, предназначенные для чтения данных, могут создавать исключения IOException и EOFException. Первое из них возникает в случае ошибки, а второе - при достижении конца входного потока в процессе чтения.


ouli-azastan-respublikasi-blm-zhne-ilim-ministrlg-bektken-alamati-2011-075-8.html
ouli-debiet-6-sinip-dajir-ajtaliev-sh-berkmbaeva.html
ouli-saba-zhospariinternet-kz3-degej-nsaulii-t-b-ou-ntizhes.html
oulitardi-ou-dstemelk-keshendern-raldarini-zhne-basa-da-osimsha-debietterd-oni-shnde-elektrondi-zhetkzgshteglern-tzbesn-bektu-turali.html
oun-upa-i-novodvorskaya-v-razvale-yaltinsko-potsdamskoj-sistemi-mezhdunarodnih-otnoshenij.html
our-university-uchebno-metodicheskoe-posobie-dlya-studentov-i-ii-kursov-zaochnogo-otdeleniya-neyazikovih-fakultetov.html
  • school.bystrickaya.ru/08092009-g-s-10-tema-stroitelstvo-stroitelen-kontrol.html
  • university.bystrickaya.ru/glava-20-na-rubezhe-postaraemsya-teper-podvesti-obshie-itogi-chto-poluchila-sovetskaya-aviaciya-posle-togo-kak-v.html
  • notebook.bystrickaya.ru/i-bil-bayard-luchshij-iz-luchshih-kniga-vtoraya.html
  • shpargalka.bystrickaya.ru/usilitelnie-kaskadi-peremennogo-toka-na-bipolyarnih-tranzistorah.html
  • ekzamen.bystrickaya.ru/references-uchebno-metodicheskij-kompleks-po-programme-minimum-kandidatskogo-ekzamena-po-specialnosti.html
  • tests.bystrickaya.ru/konspekt-uroka-po-fizike-v-9-klasse-na-temu-dlya-chego-nuzhni-zakoni-nyutona.html
  • lektsiya.bystrickaya.ru/prikaz-ot-26-iyunya-1997-g-n-134-o-merah-po-sovershenstvovaniyu-sistemi-kontrolya-za-sohraneniem-letnoj-godnosti-vs-na-osnove.html
  • paragraf.bystrickaya.ru/zaochnoereshenie.html
  • school.bystrickaya.ru/422-specifika-processa-socializacii-detej-i-podrostkov-v-usloviyah-sovremennogo-rossijskogo-obshestva.html
  • crib.bystrickaya.ru/iso-90002005-konspekt-lekcij-po-discipline-sistemi-upravleniya-kachestvom-dlya-studentov-inzhenernih-specialnostej.html
  • urok.bystrickaya.ru/prikaz-21-maya-2012-goda-290-ob-organizacii-i-provedenii-otdiha-ozdorovleniya-detej-i-zanyatosti-podrostkov-v-period-letnih-shkolnih-kanikul.html
  • desk.bystrickaya.ru/organizacionno-pravovie-osnovi-deyatelnosti-rossijskoj-sistemi-preduprezhdeniya-i-likvidacii-chrezvichajnih-situacij-zadanie-1-stranica-3.html
  • znanie.bystrickaya.ru/aviatarif-stoimost-perevozki-odnogo-passazhira-na-samolete-na-opredelennoe-rasstoyanie-v-mezhdunarodnih-perevozkah-razlichayut-individualnie-gruppovie-obichnie-i-specialnie-aviatarifi.html
  • university.bystrickaya.ru/glava-viii-osobennosti-rechi-pered-mikrofonom-i-televizionnoj-kameroj-n-t-svidinskaya-kollektiv.html
  • prepodavatel.bystrickaya.ru/tema-4-nalogi-i-nalogooblozhenie-1-sushnost-i-funkcii-deneg-denezhnoe-obrashenie.html
  • shkola.bystrickaya.ru/otstupnichestvo-lyutera-i-romanticheskoe-pokayanie.html
  • laboratornaya.bystrickaya.ru/razvlekatelnaya-programma-dva-royalya-21-30-diskoteka-dlya-znakomstva5-yanvarya-vtornik-30-velikolepnij.html
  • holiday.bystrickaya.ru/obespechennost-rossii-razvedannimi-zapasami-nekotorih-vidov-po-moemu-mne-udalos-najti-otvet-na-interesuyushie.html
  • uchenik.bystrickaya.ru/eho-moskvi-eho-28092007-vorobev-aleksej-1500-gosduma-rf-monitoring-smi-29-sentyabrya-1-oktyabrya-2007-g.html
  • student.bystrickaya.ru/22direktivi-rukovodstvo-po-gigiene-i-sanitarii-v-aviacii-trete-izdanie.html
  • universitet.bystrickaya.ru/strategicheskij-plan-predstavlenie-nacionalnih-dokladov-i-funkcionirovanie-konvencii-ocenka-informacii-privedennoj-vo-vtorih-nacionalnih-dokladah.html
  • knigi.bystrickaya.ru/selskohozyajstvennoe-proizvodstvo-na-urale-v-konce-1920-h-nachale-1940-h-gg.html
  • literature.bystrickaya.ru/brend-menedzhment-v-innovacionnih-otraslyah-ekonomiki.html
  • paragraf.bystrickaya.ru/zaklyuchenie-sovershenstvovanie-upravleniya-deyatelnosti-marketingovoj-sluzhbi-na-primere-ooo-shparmann.html
  • learn.bystrickaya.ru/glava-vi-hristianskaya-zhizn-m-v-bahtin-istoriya-hristianskoj-cerkvi-do-1054-goda-moskva-izdatelstvo-moskovskogo.html
  • knigi.bystrickaya.ru/salyut-energiya.html
  • testyi.bystrickaya.ru/acarkina-ta-moskva-tekst-perevodchik-chitatel-materiali-nauchnih-chtenij-pamyati-zasluzhennih-professorov.html
  • education.bystrickaya.ru/16-09-2005-krilatij-priz-venecii-evropejskij-lev-ili-aziatskij-drakon.html
  • prepodavatel.bystrickaya.ru/tablica-52-var-342-sistemnij-analiz-i-issledovanie-operacij.html
  • znaniya.bystrickaya.ru/rabochaya-programma-i-metodicheskie-ukazaniya-po-diplomnomu-proektirovaniyu-i-zashite-vipusknoj-kvalifikacionnoj-raboti-dlya-studentov-vseh-form-obucheniya-specialnost-080105-finansi-i-kredit-stranica-3.html
  • literature.bystrickaya.ru/dom-intermediya-mariam-petrosyan-dom.html
  • ucheba.bystrickaya.ru/programma-po-discipline-stilistika.html
  • shpargalka.bystrickaya.ru/vipusk-ii-novouralskij-gorodskoj-okrug-stranica-10.html
  • assessments.bystrickaya.ru/diplomant-i-stepeni-konkurs-festival-na-krilyah-talanta.html
  • studies.bystrickaya.ru/lichnostnij-rost-voennosluzhashih-v-gruppe-chast-5.html
  • © bystrickaya.ru
    Мобильный рефератник - для мобильных людей.