Что такое read в программе

С помощью команды read вы можете сделать ваш bash-скрипт интерактивным, принимая вводимые пользователем данные. Научитесь использовать команду чтения в Linux с этими практическими примерами.

Что такое команда read в Linux?

Команда read в Linux — это способ взаимодействия пользователей с вводом с клавиатуры, который вы можете увидеть как stdin (стандартный ввод) или другие подобные описания.

Другими словами, если вы хотите, чтобы ваш bash-скрипт принимал ввод от пользователя, вам придется использовать команду read.

Команда read в Bash

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

В этой статье мы рассмотрим встроенную команду read .

Встроенное read Bash

read — это встроенная команда bash, которая считывает строку из стандартного ввода (или из файлового дескриптора) и разбивает строку на слова. Первое слово присваивается первому имени, второе — второму имени и так далее.

Урок 8. Операторы ввода readln/read и диалоговые программы. Программирование на Pascal / Паскаль

Общий синтаксис встроенной функции read имеет следующий вид:

read [options] [name. ]

Чтобы проиллюстрировать, как работает команда, откройте терминал, введите read var1 var2 и нажмите «Enter». Команда будет ждать, пока пользователь введет данные. Введите два слова и нажмите «Enter».

read var1 var2Hello, World!

Слова присваиваются именам, которые передаются команде read качестве аргументов. Используйте echo или printf чтобы проверить это:

echo $var1echo $var2
Hello, World!

Вместо того, чтобы вводить текст на терминале, вы можете передать стандартный ввод для read с помощью других методов, таких как piping, here-string или heredoc :

echo «Hello, World!» | (read var1 var2; echo -e «$var1 n$var2»)
read и echo заключены в круглые скобки и выполняются в одной подоболочке.
Hello, World!

Вот пример использования строки здесь и printf :

read -r var1 var2 printf «var1: %s nvar2: %sn» «$var1» «$var2»
Var1: Hello, Var2: World!

Если команде read не задан аргумент, вся строка присваивается переменной REPLY :

echo «Hello, world!» | (read; echo «$REPLY»)
Hello, World!

Если количество аргументов, предоставленных для read , больше, чем количество слов, прочитанных из ввода, оставшиеся слова присваиваются фамилии:

echo «Linux is awesome.» | (read var1 var2; echo -e «Var1: $var1 nVar2: $var2»)
Var1: Linux Var2: is awesome.

В противном случае, если количество аргументов меньше количества имен, оставшимся именам присваивается пустое значение:

echo «Hello, World!» | (read var1 var2 var3; echo -e «Var1: $var1 nVar2: $var2 nVar3: $var3»)
Var1: Hello, Var2: World! Var3:

По умолчанию read интерпретирует обратную косую черту как escape-символ, что иногда может вызывать неожиданное поведение. Чтобы отключить экранирование обратной косой черты, вызовите команду с параметром -r .

Ниже приведен пример, показывающий, как работает read при вызове с параметром -r и без него:

#3 Ввод/Вывод данных в Pascal — Read, Readln, Write, Writeln — отличия, примеры


read printf %s «$REPLY»
Hello, tWorld!
read -r printf %s «$REPLY»
Hello, tWorld!

Как правило, вы всегда должны использовать read с параметром -r .

Изменение разделителя

По умолчанию при read строка разбивается на слова с использованием одного или нескольких пробелов, табуляции и новой строки в качестве разделителей. Чтобы использовать другой символ в качестве разделителя, присвойте его переменной IFS (внутренний разделитель полей).

Читайте также:
Какая программа для твича

echo «Linux:is:awesome.» | (IFS=»:» read -r var1 var2 var3; echo -e «$var1 n$var2 n$var3»)
Linux is awesome.

Когда IFS установлен на символ, отличный от пробела или табуляции, слова разделяются ровно одним символом:

echo «Linux::is:awesome.» | (IFS=»:» read -r var1 var2 var3 var4; echo -e «Var1: $var1 nVar2: $var2 nVar3: $var3 nVar4: $var4»)

Строка разделена четырьмя словами. Второе слово — это пустое значение, представляющее отрезок между разделителями. Он создан, потому что мы использовали два символа-разделителя рядом друг с другом ( :: .

Var1: Linux Var2: Var3: is Var4: awesome.

Для разделения строки можно использовать несколько разделителей. При указании нескольких разделителей присваивайте символы переменной IFS без пробела между ними.

Вот пример использования _ и — качестве разделителей:

echo ‘Linux_is-awesome.’ | (IFS=»-_» read -r var1 var2 var3; echo -e «$var1 n$var2 n$var3»)
Linux is awesome.

Строка подсказки

При написании интерактивных сценариев bash вы можете использовать команду read для получения пользовательского ввода.

Чтобы указать строку приглашения, используйте параметр -p . Подсказка печатается перед выполнением read и не включает новую строку.

Вот простой пример:

read -r -p «Are you sure?»

Как правило, вы будете использовать для read команды внутри в while цикл , чтобы заставить пользователя дать один из ожидаемых ответов.

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

while true; do read -r -p «Do you wish to reboot the system? (Y/N): » answer case $answer in [Yy]* ) reboot; break;; [Nn]* ) exit;; * ) echo «Please answer Y or N.»;; esac done

Если сценарий оболочки просит пользователей ввести конфиденциальную информацию, например пароль, используйте параметр -s который сообщает read не печатать ввод на терминале:

read -r -s -p «Enter your password: »

Назначьте слова в массив

Чтобы присвоить слова массиву вместо имен переменных, вызовите команду read с параметром -a :

Linux is awesome.

Когда даны и массив, и имя переменной, все слова присваиваются массиву.

Выводы

Команда read используется для разделения строки ввода на слова.

Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.

Источник: routerus.com

Потоки Reader и Writer

Абстрактные классы Reader и Writer являются символьными потоками.

Абстрактный класс Reader

Класс Reader обеспечивает поддержку символьного потока чтения аналогично тому, как это делает InputStream, реализующий модель байтового потока ввода. Методы Reader схожи с теми, которые объявлены в составе InputStream.

Методы класса Reader

МетодОписание
abstract void close() throws IOException Закрытие ранее открытого потока чтения. Метод используется для высвобождения ресурсов, связанных с потоком (таких как дескрипторы открытых файлов). Любые попытки обращения к закрытому потоку приводят к выбрасыванию исключения типа IOException, но повторное закрытие потока эффектов не вызывает.
void mark(int limit) Размещение метки в текущей позиции входного потока
boolean markSupported() Функция проверки поддержки потоком методов mark() и reset()
boolean ready() Функция проверки готовности объекта для чтения данных, т.е. в нем существует хотя бы один доступный символ. Следует заметить, что результат, равный false, отнюдь не свидетельствует о том, что очередной вызов read приведет к возникновению блокировки, поскольку в промежутке между обращениями к ready и read в поток может поступить очередная порция данных.
void reset() Сброс указателя ввода в ранее установленную позицию метки.
long skip(long count) Функция пропуска указанного в параметре count количества символов ввода. Возвращает количество действительно пропущенных символов. Значение count не должно быть отрицательным.
int read() throws lOException Чтение одного символа данных в виде целого числа в диапазоне от 0 до 65535. Если символов, готовых для чтения, нет ввиду достижения конца потока, то возвращается значение -1. Метод выполняет блокировку до тех пор, пока имеются доступные для чтения символы, не достигнут конец потока либо не выброшено исключение.
abstract int read(char[] buf, int offset, int count) throws lOException Чтение символов и сохранение их в массиве buf типа char. Максимальное количество читаемых символов определяется значением count. Символы записываются в массив, начиная с смещение offset. Содержимое всех остальных элементов массива buf остается неизменным. Метод возвращает количество фактически считанных символов.
Если достигнут конец потока и не считан ни один символ, возвращается -1. Если значение count равно нулю, чтение не производится и возвращается 0.
Метод выполняет блокировку до тех пор, пока имеются доступные для чтения символы не достигнут конец потока либо не выброшено исключение.
int read(char[] buf) throws IOException Метод аналогичен предыдущему при условии, offset = 0, count = buf.length.
Читайте также:
Червь как вредоносная программа

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

Наследники класса Reader

  • BufferedReader — буферизированный входной символьный поток; увеличивает производительность за счёт буферизации ввода;
  • CharArrayReader — входной поток чтения символьного массива;
  • FileReader — входной поток чтения содержимого файла; в конструкторе класса нужно указать либо путь к файлу, либо объект типа File;
  • FilterReader — фильтрующий читатель;
  • InputStreamReader — входной поток, транслирующий байты в символы;
  • LineNumberReader — входной поток, подсчитывающий строки;
  • PipedReader — входной канал;
  • PushbackReader — входной поток, позволяющий возвращать символы обратно в поток;
  • StringReader — входной поток, читающий из строки.

Класс BufferedReader

Широкораспространенный в использовании класс BufferedReader считывает текст из символьного потока ввода, буферизируя прочитанные символы. Использование буфера призвано увеличить производительность чтения данных из потока.

BufferedReader имеет следующие конструкторы :

BufferedReader(Reader in) BufferedReader(Reader in, int sz)

Примеры BufferedReader

BufferedReader br; br = new BufferedReader(new FileReader(«foo.in»)); br = new BufferedReader(new InputStreamReader(System.in));

В качестве примера рассмотрим программу подсчета общего количества символов и числа пробелов в символьном потоке чтения:

import java.io.*; class CountSpaces < public static void main(String[] args) throws IOException < int chr; int total; int spaces = 0; try < Reader in = null; if (args.length == 0) in = new InputStreamReader(System.in); else in = new FileReader(args[0]); for (total=0; (chr=in.read()) != -1; total++) < if (Character.isWhitespace((char) chr)) spaces++; >System.out.println(«Количество символов : » + total + «nКоличество пробелов : «+spaces); > catch (FileNotFoundException e) < e.printStackTrace(); >catch (IOException e) < e.printStackTrace(); >> >

Программе в качестве параметра передается имя файла в командной строке. Переменная in представляет символьный поток чтения. Если имя файла не задано, то используется стандартный поток ввода, System.in, после «вложения» его в объект типа InputStreamReader, который выполняет преобразование байтового потока ввода в символьный поток чтения. В противном случае создается объект типа FileReader, расширяющего класс Reader.

В цикле for подсчитывается общее количество символов в файле. Кроме этого, с использованием метода isWhitespace класса Character выявляются символы пробела и вычисляется их количество, а затем на экран выводится результат.

Абстрактный класс Writer

Абстрактный класс Writer обеспечивает поддержку символьного потока записи аналогично тому, как это делает OutputStream, реализующий модель байтового потока вывода. Многие методы Writer схожи с теми, которые объявлены в OutputStream; помимо этого, в классе Writer предусмотрены некоторые другие полезные версии метода write.

Методы класса Writer

Все методы класса вызывают исключение IOException при возникновении ошибки.

МетодОписание
append(char c) Добавление символа в конец вызывающего выходного потока.
abstract void close() throws lOException Закрытие ранее открытого поток записи; при необходимости выполняется сброс потока. Метод используется для высвобождения ресурсов, связанных с потоком (таких как дескрипторы открытых файлов). Любые попытки обращения к закрытому потоку приводят к выбрасыванию исключения типа lOException, но повторное закрытие потока эффектов не вызывает.
abstract void flush() Сброс потока. Если поток сохраняет в промежуточном буфере некоторое число символов, переданных методами write различных версий, flush провоцирует выполнение операции непосредственной записи данных в объект-получатель. Затем, если получателем является другой поток, тот в свою очередь также сбрасывается. Таким образом, единственный вызов flush приводит к сбросу всех буферов в цепочке взаимосвязанных потоков. Если поток не относится к категории буферизованных, никакие действия не выполняются.
void write(int char) throws lOException Запись символа в выходной поток. Метод выполняет блокировку потока до тех пор, пока символ не будет записан.
abstract void write(char[] buf, int offset, int count) throws lOException Запись count символов массива buf, начиная с элемента buf [offset]. Метод выполняет блокировку до тех пор, пока символы не будут записаны.
void write(char[] buf) throws lOException Метод аналогичен предыдущему при условии offset = 0 и count = buf.length.
void write(String string, int offset, int count) throws lOException Запись count символов строки string, начиная с символа string.charAt(offset).
void write(String string) throws lOException Метод аналогичен предыдущему при условии offset = 0 и count = string.length()).
Читайте также:
Как удалить с китайского планшета китайские программы

Классы, производные от Writer, должны реализовать вариант метода write, связанного с записью символов из части массива, а также методов close и flush. Все остальные методы Writer основаны на трех методах, названных выше. Это отличает Writer от класса OutputStream, в котором в качестве базового метода вывода предусмотрен вариант write, осуществляющий вывод одного байта, а для методов flush и close предложены реализации по умолчанию.

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

Наследники класса Writer

  • BufferedWriter — буферизированный выходной символьный поток; позволяет повысить производительность за счёт снижения количества операций физической записи в выходное устройство;
  • CharArrayWriter — выходной поток, который пишет в символьный массив;
  • FileWriter — выходной поток, пишущий в файл; в конструкторе можно определить вывод в конец файла. Создание объекта не зависит от наличия файла, он будет создан в случае необходимости. Если файл существует и он доступен только для чтения, то передаётся исключение IOException
  • FilterWriter — фильтрующий писатель
  • OutputStreamWriter -выходной поток, транслирующий байты в символы
  • PipedWriter — выходной канал
  • PrintWriter — выходной поток, включающий методы print() и println()
  • StringWriter — выходной поток, пишущий в строку

Класс BufferedWriter

Широкораспространенный в использовании класс BufferedWriter записывает текст в поток, предварительно буферизируя записываемые символы, тем самым снижая количество обращений к физическому носителю для записи данных.

BufferedWriter имеет следующие конструкторы :

BufferedWriter(Writer out) BufferedWriter(Writer out, int size)

В качестве параметра out конструктор BufferedWriter принимает поток вывода, в который надо осуществить запись. Второй параметр size указывает на размер буфера.

Пример использования классов FileWriter и BufferedWriter :

package examples; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.BufferedWriter; public class WriteToFileExample < public static void main(String[] args) < try < String content = «Данную строку запишем в файл»; File file = new File(«C:/someDir/filename.txt»); // Если файл не существует, то создадим его if (!file.exists()) file.createNewFile(); FileWriter fw; fw = new FileWriter(file.getAbsoluteFile()); BufferedWriter bw = new BufferedWriter(fw); bw.write(content); bw.close(); System.out.println(«Запись завершена»); >catch (IOException e) < e.printStackTrace(); >> >

Источник: java-online.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru