Главная » Java » Класс InputStream

0

В абстрактном классе InputStream объявляются методы для чтения из заданного источника. InputStream является базовым классом для большинства входных потоков в java.io и содержит следующие методы:

public InputStream()

содержит только безаргументный конструктор. public abstract int read() throws IOException

Читает из потока один байт данных и возвращает прочитанное значение, лежащее в диапазоне от 0 до 255 (не от –128 до 127). При достижении конца потока возвращается флаг –1. Метод блокирует работу программы до появления значения на входе.

public int read(byte[] buf) throws IOException

Читает данные в массив байтов. Метод блокирует работу программы до появления вводимого значения, после чего заполняет buf всеми прочитанными байтами, в количестве не более buf.length. Метод возвращает фактическое количество прочитанных байтов или –1 при достижении конца потока.

public int read(byte[] buf, int off, int len) throws IOException

Читает данные в байтовый подмассив. Метод блокирует работу программы до начала ввода, после чего заполняет часть массива buf, начиная со смещения off, в количестве до len байтов, если не встретится конец массива buf.

public long skip(long count) throws IOException

Пропускает до count байтов во входном потоке. Количество пропущенных байтов может быть меньше count из-за достижения конца потока. Возвращает фактическое количество пропущенных байтов.

public int available() throws IOException

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

public void close() throws IOException

Закрывает входной поток. Метод должен вызываться для освобождения любых ресурсов (например, файловых дескрипторов), связанных с потоком. Если не сделать это, то ресурсы будут считаться занятыми, пока сборщик мусора не вызовет метод finalize данного потока.

Приведенная ниже программа подсчитывает общее количество символов и разделителей

(white-space characters) в файле:

import java.io.*;

class CountSpace {

public static void main(String[] args)

throws IOException

{

InputStream in;

if (args.length == 0)

in = System.in;

else

in = new FileInputStream(args[0]);

int ch;

int total;

int spaces = 0;

for (total = 0; (ch = in.read()) != -1; total++) {

if (Character.isSpace((char)ch)

spaces++;

}

System.out.println(total + " chars, "

+ spaces + " spaces");

}

}

Программа либо берет имя файла из командной строки, либо читает данные из стандартного входного потока, System.in. Входной поток представлен переменной in. Если имя файла не задано, используется стандартный входной поток; если же оно указано, то создается объект FileInputStream, являющийся расширением InputStream.

Цикл for подсчитывает как общее количество символов в файле, так и количество символов-разделителей; для идентификации последних применяется метод isSpace класса Character. В конце происходит вывод результатов. Вот как они выглядят, если программа используется с файлом, содержащим ее собственный исходный текст:

434 chars, 109 spaces

Возможно, вам захочется присвоить значение total с помощью метода available, однако для потока System.in такой вариант не сработает. Метод available возвращает количество байтов, которые могут быть прочитаны без блокировки. Для файла оно обычно представляет собой его длину. Если же поток System.in будет связан с клавиатурой, то возвращаемое методом значение может быть равно нулю; если необработанные символы ввода отсутствуют, то следующий вызов read приведет к блокировке.

Источник: Арнольд К., Гослинг Д. – Язык программирования Java (1997)

По теме:

  • Комментарии