Класс Java InputStream

InputStream — это абстрактный базовый класс в системе Java I/O для чтения байтовых данных, расположенный вjava.ioпакете.

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

InputStream — это абстрактный класс, что означает, что вы не можете создать его экземпляр напрямую, но можете создавать конкретные объекты входного потока через его подклассы (такие как FileInputStream, ByteArrayInputStream и т. д.).


Анализ основных методов

InputStream является частью потоков Java IO, используется для чтения данных в байтах (8-битных).

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

Вы можете представить его как "водопроводную трубу", в которой данные текут от источника к вашей программе, как вода.

Основные методы

Название методаОписание
int read()Читает байт, возвращаемое значение — int от 0 до 255, возвращает при достижении конца потока-1
int read(byte[] b)Читает не более из потокаb.lengthбайтов данных и сохраняет их в байтовый массивb
int read(byte[] b, int off, int len)fromoffЧитает не более, начиная с позиции offsetlenбайтов в массивb
void close()Закрывает поток и освобождает связанные ресурсы

Чтение одного байта

public abstract int read() throws IOException

Это самый базовый метод в InputStream, используемый для чтения следующего байта данных из входного потока. Возвращаемое значение — int от 0 до 255, и -1 возвращается, если достигнут конец потока.

Пример кода

Пример

InputStream input = new FileInputStream("example.txt");
int data = input.read();
while(data != -1) {
    System.out.print((char)data);
    data = input.read();
}
input.close();

Чтение массива байтов

Пример

public int read(byte[] b) throws IOException

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

Пример кода

Пример

InputStream input = new FileInputStream("example.txt");
byte[] buffer = new byte[1024];
int bytesRead;
while((bytesRead = input.read(buffer)) != -1) {
    System.out.println("Read " + bytesRead + " bytes");
}
input.close();

, прочитать до 500 байт

Пример

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

Этот метод позволяет указать позицию (off) для начала сохранения считанных данных и максимальное количество байтов (len) для чтения.

Пример кода

Пример

InputStream input = new FileInputStream("example.txt");
byte[] buffer = new byte[1024];
int bytesRead = input.read(buffer, 10, 500); // Сохранять начиная с buffer
input.close();

Пропуск байтов

Пример

public long skip(long n) throws IOException

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

Проверка доступных байтов

Пример

public int available() throws IOException

Возвращает оценку количества байтов, которое можно прочитать (или пропустить) из этого входного потока без блокировки.

2.6 Закрытие потока

Пример

public void close() throws IOException

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


Введение в часто используемые подклассы

  • FileInputStream: Используется для чтения данных из файлов.
  • ByteArrayInputStream: Позволяет использовать массив байтов в памяти в качестве входного потока.
  • FilterInputStream: Класс-декоратор, который предоставляет дополнительную функциональность другим входным потокам.
  • ObjectInputStream: Используется для десериализации объектов, ранее сериализованных с помощью ObjectOutputStream.
  • PipedInputStream: Используется вместе с PipedOutputStream для организации обмена данными через канал между потоками.

Лучшие практики

Использование try-with-resources

В Java 7 была представлена конструкция try-with-resources, которая позволяет автоматически закрывать ресурсы, реализующие интерфейс AutoCloseable.

Пример

try (InputStream input = new FileInputStream(example.txt)) {
    int data;
    while ((data = input.read()) != -1) {
        System.out.print((char)data);
    }
} catch (IOException e) {
    e.printStackTrace();
}

Буферизованное чтение для повышения производительности

Для больших файлов или частых операций чтения рекомендуется обернуть в BufferedInputStream для повышения производительности.

Пример

try (InputStream input = new BufferedInputStream(new FileInputStream("largefile.dat"))) {
    // Операция чтения
} catch (IOException e) {
    e.printStackTrace();
}

Правильная обработка исключений

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


5. Часто задаваемые вопросы

Почему метод read() возвращает int, а не byte?

Потому что для обозначения конца потока требуется специальное значение (-1), а тип byte не может представить -1.

Как преобразовать InputStream в String?

Пример

public static String convertToString(InputStream input) throws IOException {
    try (BufferedReader reader = new BufferedReader(new InputStreamReader(input))) {
        StringBuilder stringBuilder = new StringBuilder();
        String line;
        while ((line = reader.readLine()) != null) {
            stringBuilder.append(line);
        }
        return stringBuilder.toString();
    }
}

Как скопировать InputStream?

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


6. Итоги

Класс InputStream — один из основных компонентов системы Java I/O, предоставляющий базовые функции для чтения байтовых данных. Понимание InputStream и его подклассов крайне важно для работы с различными источниками ввода (такими как файлы, сетевые соединения, буферы памяти и т. д.). В практических приложениях следует обращать внимание на управление ресурсами, обработку исключений и оптимизацию производительности.

Другие расширения