Класс InputStream

Класс InputStream является базовым классом для всех потоков ввода байтов. Он предоставляет методы для чтения данных из файла в виде байтов. Для работы с файлами обычно используется FileInputStream, который наследует от InputStream.

Импорт

kotlinimport java.io.InputStream
import java.io.FileInputStream

Синтаксис

kotlin// Создание через FileInputStream
val stream: InputStream = FileInputStream("file.txt")

// Создание через расширяющую функцию File
val stream2: InputStream = File("file.txt").inputStream()

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

Метод read читает один байт и возвращает его как Int или -1 если достигнут конец файла:

kotlinval stream = FileInputStream("file.txt")
val byte = stream.read()

while (byte != -1) {
  print(byte)
  byte = stream.read()
}

stream.close()

Метод read с массивом байтов читает данные в массив и возвращает количество прочитанных байтов:

kotlinval stream = FileInputStream("file.txt")
val buffer = ByteArray(1024)
var bytesRead = stream.read(buffer)

while (bytesRead != -1) {
  println("Read $bytesRead bytes")
  bytesRead = stream.read(buffer)
}

stream.close()

Пример

Чтение всего файла в массив байтов:

kotlinval stream = FileInputStream("data.bin")
val bytes = stream.readBytes()
stream.close()

println("File size: ${bytes.size} bytes")

Результат выполнения кода:

kotlinFile size: 256 bytes

Пример

Использование блока use для автоматического закрытия потока:

kotlinFileInputStream("file.txt").use { stream ->
  val bytes = stream.readBytes()
  println("Read ${bytes.size} bytes")
}

Результат выполнения кода:

kotlinRead 1024 bytes

Пример

Чтение файла по частям с использованием буфера:

kotlinFileInputStream("largefile.dat").use { stream ->
  val buffer = ByteArray(4096)
  var totalBytes = 0
  var bytesRead: Int
  
  do {
    bytesRead = stream.read(buffer)
    if (bytesRead != -1) {
      totalBytes += bytesRead
      println("Read $bytesRead bytes, total: $totalBytes")
    }
  } while (bytesRead != -1)
}

Результат выполнения кода:

kotlinRead 4096 bytes, total: 4096
Read 4096 bytes, total: 8192
Read 2048 bytes, total: 10240
Read 0 bytes, total: 10240

Пример

Пропуск определенного количества байтов с помощью метода skip:

kotlinFileInputStream("data.bin").use { stream ->
  // Пропускаем первые 100 байтов
  val skipped = stream.skip(100)
  println("Skipped $skipped bytes")
  
  // Читаем следующий байт
  val byte = stream.read()
  println("Next byte: $byte")
}

Результат выполнения кода:

kotlinSkipped 100 bytes
Next byte: 65

Смотрите также

  • класс OutputStream,
    который предоставляет методы для записи байтов в файл
  • функцию bufferedReader,
    которая создает буферизованный поток для чтения текста
  • функцию readBytes,
    которая читает весь файл как массив байтов
  • класс File,
    который предоставляет методы для работы с файлами и директориями