Метод available класса InputStream
Метод available класса InputStream возвращает
приблизительное количество байтов, которые можно прочитать
из текущего входного потока без блокировки. Метод не принимает
параметров. Возвращаемое значение имеет тип int.
Важно понимать, что это именно оценка: фактическое количество
доступных для чтения байтов может отличаться, особенно при
работе с сетевыми потоками или потоками, зависящими от
внешних источников.
Метод часто используется для проверки того, есть ли данные
во входном потоке перед вызовом метода read. Если
метод возвращает 0, это может означать, что данных
пока нет, но при этом не гарантирует, что поток завершен.
Для проверки конца потока метод available не подходит,
так как он не сигнализирует о достижении конца файла или потока.
Класс InputStream является абстрактным, поэтому метод
available часто переопределяется в классах-наследниках,
таких как FileInputStream или ByteArrayInputStream,
чтобы возвращать более точное значение. Базовая реализация
в классе InputStream всегда возвращает 0.
Синтаксис
public int available() throws IOException
Пример
Давайте создадим входной поток из массива байтов и проверим, сколько байтов доступно для чтения:
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
public class Main
{
public static void main(String[] args) throws IOException
{
byte[] data = {1, 2, 3, 4, 5};
InputStream is = new ByteArrayInputStream(data);
int available = is.available();
System.out.println(available);
is.close();
}
}
Результат выполнения кода:
5
Пример
Давайте прочитаем один байт из потока и снова проверим, сколько байтов осталось доступно:
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
public class Main
{
public static void main(String[] args) throws IOException
{
byte[] data = {1, 2, 3, 4, 5};
InputStream is = new ByteArrayInputStream(data);
is.read();
int available = is.available();
System.out.println(available);
is.close();
}
}
Результат выполнения кода:
4
Пример
Давайте проверим, что базовая реализация метода
available в классе InputStream возвращает
0. Для этого создадим анонимный подкласс:
import java.io.IOException;
import java.io.InputStream;
public class Main
{
public static void main(String[] args) throws IOException
{
InputStream is = new InputStream()
{
@Override
public int read()
{
return -1;
}
};
int available = is.available();
System.out.println(available);
is.close();
}
}
Результат выполнения кода:
0
Смотрите также
-
класс
InputStream,
который является базовым классом для всех входных потоков -
метод
read,
который читает один байт из входного потока -
метод
readAllBytes,
который читает все байты из входного потока -
метод
skip,
который пропускает указанное количество байтов