Читайте также:
|
|
Начнем изучение системы ввода-вывода Java с байтовых потоков. Как было сказано ранее, на вершине иерархии байтовых потоков находятся классы InputStream и OutputStream. Методы класса InputStream приведены в таблице 3, а методы класса OutputStream — в таблице 4. В процессе выполнения методы классов InputStream и OutputStream могут генерировать исключения IOException. Методы, определенные в указанных двух абстрактных классах, доступны во всех подклассах. Таким образом, они формируют минимальный набор функций ввода-вывода, общий для всех байтовых потоков.
Таблица 3. Методы, определенные в классе InputStream
Метод | Описание |
int available() | Возвращает число байтов, доступных для чтения |
void close() | Закрывает источник входных данных. В дальнейшем при попытке чтения генерируется исключение IOException |
void mark(int numBytes) | Помещает маркер в текущую позицию потока. Маркер доступен до тех пор, пока на будет прочитано numBytes байтов |
boolean markSupported() | Возвращает значение true, если методы mark() и reset () поддерживаются потоком |
int read() | Возвращает целочисленное представление следующего байта в потоке. Если достигнут конец файла, возвращается значение -1 |
int read(byte buffer[]) | Предпринимает попытку прочитать buffer.length байтов в массив buffer и возвращает реальное число байтов, которые были успешно прочитаны. При достижении конца файла возвращается значение -1 |
int read(byte buffer[], int offset, int numBytes) | Предпринимает попытку прочитать numBytes байтов в мaccив buffer, нaчинaя c элeмeнтa buffer[offset]. Если достигнут конец файла, возвращается значение -1 |
void reset () | Устанавливает указатель ввода в позицию, ранее помеченную маркером |
long skip(long numBytes) | Пропускает numBytes байтов во входном потоке. Возвращает реальное число пропущенных байтов |
Таблица 4. Методы, определенные в классе OutputStream
Метод | Описание |
void close() | Закрывает выходной поток. В дальнейшем при попытке записи генерируется исключение IOException |
void flush() | Записывает содержимое буфера. После выполнения данной операции буфер очищается |
void write (int b) | Записывает один байт в выходной поток. Параметр имеет тип int, это позволяет использовать выражение, не преобразуя результат его выполнения в тип byte |
void write (byte buffer [ ]) | Записывает массив в выходной поток |
void write(byte buffer [ ], int offset, int numBytes) | Записывает часть массива buffer длиной numBytes байтов, начиная с элемента buffer[offset] |
Консольный ввод
Первоначально единственным способом реализации консольного ввода было использование байтовых потоков, и во многих Java-программах до сих пор пользуются исключительно потоки данного типа. В настоящее время разработчикам доступны как байтовые, так и символьные потоки. В коммерческих приложениях для чтения данных с консоли в основном используются символьные потоки. Такой подход упрощает интернационализацию программ и их поддержку. Гораздо удобнее оперировать непосредственно с символами и не тратить усилия на организацию преобразования символов в байты, а байты — в символы. Однако в простых утилитах и приложениях, которые непосредственно обрабатывают данные, полученные с клавиатуры, бывает целесообразно использовать байтовые потоки. По этой причине мы уделяем им внимание.
Поскольку System.in — это экземпляр InputStream, используя данную ссылку, вы автоматически получаете доступ к методам, определенным в InputStream. К сожалению, в классе InputStream определен только один метод ввода, read (), предназначенный для чтения байтов. Варианты этого метода приведены ниже.
int read() throws IOException
int read(byte data[ ]) throws IOException
int read(byte data[], int start, int max) throws IOException
Первый вариант метода read() можно использовать для чтения отдельных символов с клавиатуры (из потока System.in). Достигнув конца потока, данный метод возвращает значение -1. Второй вариант метода read () читает данные из входного потока и помещает их в массив. Чтение оканчивается либо по достижении конца потока, либо при заполнении массива, либо при возникновении ошибки. Метод возвращает число прочитанных байтов, либо -1, если был достигнут конец потока. Третий вариант метода помещает прочитанные данные в массив data, начиная с элемента, определяемого индексом start. Максимальное число байтов, которые могут быть записаны в массив, определяется параметром max. Метод возвращает число прочитанных байтов, либо -1, если был достигнут конец потока. При возникновении ошибок каждый из рассмотренных выше методов генерирует исключение IOException. Конец потока формируется после нажатия клавиши <Enter>.
Ниже приведена программа, демонстрирующая чтение байтов из потока System.in и помещение их в массив. Заметьте, что исключения, которые могут быть сгенерированы при работе данной программы, обрабатываются за пределами метода main(). Данный подход часто используется при чтении данных с консоли. При необходимости вы можете самостоятельно организовать обработку ошибок.
// Чтениебайтов с клавиатуры и помещениеих в массив
import java.io.*;
class ReadBytes
{
public static void main(String args[]) throws IOException
{
byte data[] = new byte [10];
System. out. println("Enter some characters.");
// Чтениеданных, введенных с клавиатуры,
// и помещениеих в байтовыймассив
System. in. read(data);
System. out. print("You entered: ");
for (int i=0; i < data.length; i++)
System. out. print((char) data[i]);
}
}
Вывод на консоль
Как и в случае консольного ввода, в Java для консольного вывода первоначально были предусмотрены только байтовые потоки. B Java 1.1 были реализованы символьные потоки. Именно их рекомендуется применять в приложениях, особенно в тех случаях, когда необходимо добиться переносимости кода. Однако, поскольку System.out ссылается на байтовый поток, он по-прежнему нередко использует байтовый ввод с консоли. Таким образом, в этом модуле имеет смысл уделить внимание данному вопросу.
Вывести данные на консоль проще всего с помощью уже знакомых вам методов print() и println(). Эти методы определены в классе PrintStream (на объект данного типа ссылается переменная System.out). Несмотря на то, что System.out ссылается на байтовый поток, использовать ее для организации вывода данных на консоль вполне допустимо.
Поскольку PrintStream — это выходной поток, являющийся подклассом IntputStream, в нем доступен также низкоуровневый метод write(). Таким образом, этот метод может быть использован для вывода данных на консоль. Самый простой вариант метода write(), определенный в PrintStream, имеет следующий вид:
void write(int byteval)
Данный метод записывает в поток байтовое значение, указанное в качестве параметра. Несмотря на то, что параметр объявлен как int, учитываются только его младшие 8 битов. Ниже приведен простой пример кода, в котором метод write() используется для вывода символа X и новой строки.
// Использованиеметода System.out.write().
class WriteDemo
{
public static void main(String args[])
{
int b;
b = 'X';
// Выводбайтовнаэкран
System. out. write(b);
System. out. write('\n');
}
}
На практике для вывода на консоль метод write () применяется достаточно редко. Гораздо удобнее использовать методы print () и println ().
В классе PrintStream реализованы два дополнительных метода, printf() и format(), которые позволяют управлять форматом выводимых данных. Например, вы можете указать количество десятичных цифр, минимальную ширину поля или способ представления отрицательного числа. И хотя мы не будем использовать эти методы в примерах, вам стоит обратить пристальное внимание на данные средства, так как они могут оказаться очень полезными при написании приложений.
Вопросы для текущего контроля
1. Какой метод надо использовать для чтения байта из System.in?
2. Какой метод, кроме print() и println(), можно использовать для записи данных в поток System.out?
Чтение и запись файлов с использованием байтовых потоков
Java предоставляет большое число классов и методов, позволяющих читать данные из файлов и записывать их. Наиболее часто используемыми типами файлов являются файлы, расположенные на дисках. В Java все файлы байтово-ориентированы; разработчику предоставляются методы для чтения и записи. Таким образом, решать задачу чтения и записи файлов с использованием байтовых потоков приходится очень часто. Java также позволяет создавать для байтово-ориентированных файлов оболочки, представляющие собой символьные объекты. Такие оболочки будут рассмотрены далее в этом модуле.
Для того чтобы создать байтовый поток и связать его с файлом, надо использовать класс FileInputStream или FileOutputStream. Чтобы открыть файл, достаточно создать экземпляр одного из этих классов, передав имя файла конструктору в качестве параметра. В открытый файл можно записывать данные или осуществлять чтение из него.
Ввод данных из файла
Объект FileInputStream позволяет открыть файл для ввода. Наиболее часто используется приведенный ниже вариант конструктора данного класса.
Дата добавления: 2015-07-10; просмотров: 222 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Классы символьных потоков | | | FileInputStream(String fileName) throws FileNotFoundException |