Входные и выходные потоки данных

Входные и выходные потоки данных #

Васильев Андрей Михайлович, 2024

Версии презентации


Потоки ввода и вывода #

diagram

  • При запуске процесса ему могут быть переданы стандартные потоки данных:
    • Стандартный ввод
    • Стандартный вывод
    • Стандартный вывод ошибок
  • Данные потоки обычно ориентированы на работу с текстовыми данными, но не обязательно

Работа со стандартным потоком вывода #

Kotlin предоставляет следующие функции для вывода информации на стандартный поток:

  • print() — вывести данные на стандартный поток
  • println() — вывести данные на стандартный поток и добавить символ перевода строки

При работе на платформе JVM мы также можем обратиться к классам из стандартной библиотеки Java, объект System.out также доступен для вывода информации

Данные на стандартном потоке вывода предназначены для обозначения содержательных результатов работы приложения пользователю


Работа со стандартным потоком ошибок #

Kotlin не предоставляет дополнительных средств взаимодействия с потоком ошибок за исключением стандартного объекта Java, System.err

С его помощью можно выводить нужную информацию на данный поток:

System.err.println("Произошла ошибка с данными")

Стандартный поток ошибок обычно выводится на тот же интерфейс, что и обычный поток ошибок. При работе с эмулятором терминала зачастую невозможно отличить откуда пришла информация

IDEA делает различие потоков удобным: красным отображаются сообщения на потоке ошибок

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


Получение данных из стандартного потока ввода #

Kotlin предоставляет следующие функции для считывания данных:

  • readln(): String — считывание строки текста со стандартного потока ввода
  • readlnOrNull(): String? — также считывание строки со стандартного потока ввода

Отличие заключается в возвращаемом значении. В случае ошибки первая функция выбросит исключение RuntimeException, а вторая вернёт значение null

В случае, если необходимо обработать входной поток каким-либо другим способом, то всегда можно обратиться к объекту System.in и классу java.util.Scanner


Стандартный поток при использовании Gradle #

При запуске приложения через систему сборки Gradle по умолчанию приложению предоставляются только потоки вывода, поток ввода не предоставляется

Для разрешения доступа к потоку ввода необходимо добавить следующий блок в конфигурационный файл build.gradle.kts

tasks.withType<JavaExec> {
    standardInput = System.`in`
}

Для всех задач указываем возможность использования стандартного потока ввода, в том числе и для задачи run


Код возврата #

Приложение также сообщает внешнему миру о результатах своей работы через установку кода возврата

  • Если код возврата равен 0, то приложение корректно завершило свою работу
  • Если код возврата не равен 0, то приложение не смогло выполнить поставленную задачу

Для установки кода возврата в Kotlin следует использовать функцию exitProcess(status: Int)

  • В качестве аргумента ей передаётся код, который приложение должно вернуть
  • Во всём приложении данную функцию следует вызывать не более 1 раза
  • Если её не вызвать, то приложение в отсутствии падения вернёт код возврата 0

В случае возникновения ошибки приложение должно установить ошибочный код возврата


Переменные окружения #

  • Переменные окружения устанавливаются до запуска приложения
  • Они представляют собой пары ключ-значение
  • Внутри приложения ключи и значения рассматриваются как строки

Kotlin не предоставляет дополнительных средств считывания переменных окружения, на платформе JVM доступен класс System с методом getEnv:

val allVariables: Map<String, String> = System.getEnv()
val homeVariable: String? = System.getEnv("HOME")

IDEA и Gradle предоставляют возможности по настройке переменных окружения перед запуском процесса

diagram


Аргументы приложения #

При запуске приложению могут быть переданы аргументы — некоторый набор строк, которое приложение может использовать при своей работе

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

  • Указывают какие файлы приложение должно обработать
  • Указывают какие операции приложение должно выполнить
  • Указывают параметры выполнения этих операций

Т.е. зачастую аргументы целиком настраивают то действие, которое приложение должно выполнить


Считывание аргументов в Kotlin #

Для получения аргументов в приложении у функции main() необходимо указать аргумент с типом Array<String>:

fun main(args: Array<String>) { ... }

Для работы с переданным массивом можно воспользоваться:

  • Свойством .size для получения количества переданных аргументов
  • Методом [] для получения значения аргумента на указанной позиции

В зависимости от требований приложение должно выполнить обработку аргументов


Установка аргументов в Gradle #

При запуске приложения с помощью задачи run для передачи аргументов приложению нужно воспользоваться аргументом --args системы сборки

Предположим, что мы хотим передать нашему приложению два аргумента: first и 10 тогда необходимо запустить задачу Gradle следующим образом:

gradle run --agrs="first 10"

Приложению будет передан массив из двух строк: first и 10

В IDEA можно настроить несколько вариантов запуска команды run с разным набором аргументов и переключаться между ними для решения задач

© A. M. Васильев, 2024, CC BY-SA 4.0, andrey@crafted.su