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

0

 

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

 

public abstract int  read()  throws  lOException

Вводит один байт данных и возвращает его в виде целого числа из диапазона от 0 до 255 (но не от -128 до 127); иными словами, байтовое значение трактуется как целое без знака. Если байтов, готовых для ввода, не существует ввиду достижения конца потока, возвращается значение -1. Метод выполняет блокировку до тех пор, пока имеются доступные для ввода байты, не достигну конец потока либо не выброшено исключение. Метод возвращает именно i n . а не byte, поскольку необходимо обеспечить возможность получения как всех корректных значений типа byte, так и флага, свидетельствующего о достижении конца потока, и поэтому в качестве типа возвращаемого значения вмес byte используется более широкий тип i nt.

 

public int  read(byte[]   buf,   int offset,   int count)

 throws lOException

Вводит байты данных и сохраняет их в части массива buf типа byte. Максимальное количество байтов, подлежащих вводу, определяется значением count. Байты заносятся в элементы массива, начиная с buf [offset] и вплоть до buf [offset+count-1], если ранее не будет достигнут конец потока, — содержимое всех остальных элементов массива buf остается неизменным. Метод возвращает количество фактически введенных байтов. Если ввиду достижения конца потока не введен ни один байт, возвращается -1. Если значение count равно нулю, ввод не производится и возвращается 0. Метод выполняет блокировку до тех пор, пока имеются доступные для ввода байты, не достигнут конец потока либо не выброшено исключение. Если первый байт не может быть введен по причине, не связанной с достижением конца потока (например, из-за того, что поток уже закрыт), выбрасывается исключение типа lOException. Как только успешно введен хотя бы один байт, любая ошибка, возникающая при попытке ввода последующих данных, не приводит к выбрасыванию исключения, а трактуется как событие получения признака конца потока — метод завершает выполнение нормальным образом и возвращает число байтов, введенных до момента возникновения ошибки.

 

public int  read(byte[]   buf)  throws lOException

Метод аналогичен предыдущему при условии read (buf,   0,   buf. length).

 

 public long skipClong count)  throws  lOException

Пропускает, самое большее, count байтов либо часть последовательности байтов до конца потока. Возвращает количество фактически пропущенных байтов. Если значение count отрицательно, операция не выполняется, public int availableC)  throws lOException

Возвращает количество байтов,  которые могут быть введены или пропущены,   не   вызывая   блокировки.   Реализация   метода,   предлагаемая   по умолчанию, возвращает значение 0. public void close()  throws lOException

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

 При реализации InputStream требуется, чтобы производный класс обеспечил практическое воплощение варианта метода read, осуществляющего ввод единственного байта, поскольку остальные версии read основываются на первой. Во многих случаях, однако, производительность операций может быть улучшена за счет переопределения и других методов. Исходные версии методов available и close нуждаются в переопределении в соответствии с потребностями конкретных типов потоков.

Следующая программа демонстрирует приемы использования потоков ввода  подсчета общего количества байтов в указанном файле либо в стандартном пoтоке System.in, если имя файла не задано:

 

import java.io.*;

class CountBytes  {

  public static void main(String[]  args) throws  lOException

{

  inputstream in;

   if (args.length == 0)

    in = System.in;

  else

in = new FileinputStream(args[O]);

 

int total  = 0;

 while  (in.readO   != -1)

 total++;

System.out.print!n(t_otal  + " байтов");

  }

}

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

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

330 байтов

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

 

Источник: Арнолд, Кен, Гослинг, Джеймс, Холмс, Дэвид. Язык программирования Java. 3-е изд .. : Пер. с англ. – М. : Издательский дом «Вильяме», 2001. – 624 с. : ил. – Парал. тит. англ.

По теме:

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