Про класс StringIO або віртуальні потоки введення-виведення

У Ruby StringIO – це клас, який дозволяє працювати з рядками так, ніби вони є файлами. Це особливо корисно, коли потрібно обробляти текстові дані без створення тимчасових файлів на диску.

Основні можливості StringIO

  1. Читання та записStringIO поводиться як файл, тобто можна використовувати методи read, write, gets, puts тощо.
  2. Зміна позиції (seek) – можна переміщати курсор для читання/запису, як у файлах.
  3. Буферизація в пам’яті – всі операції виконуються в оперативній пам’яті, що швидше, ніж робота з дисковими файлами.

Приклад використання StringIO

1. Запис у StringIO

require 'stringio'

sio = StringIO.new
sio.puts "Привіт, StringIO!"
sio.write "Ще один рядок."

puts sio.string  # Виведе весь записаний вміст

2. Читання з StringIO

sio = StringIO.new("Перший рядок\nДругий рядок")

puts sio.gets  # => "Перший рядок\n"
puts sio.read  # => "Другий рядок"

3. Використання StringIO як тимчасового файлу

def log_to_string
  log = StringIO.new
  log.puts "Логування розпочато..."
  log.puts "Ще один запис у лог"

  log.rewind  # Повертаємось на початок перед читанням
  log.read    # Отримуємо весь вміст
end

puts log_to_string

4. Режим “тільки для читання”

sio = StringIO.new("Дані тільки для читання", "r")
puts sio.read
sio.write("Це не спрацює")  # Викличе помилку, бо режим "r"

Де застосовується StringIO?

  • Тестування, коли потрібно підмінити файловий ввід/вивід.
  • Обробка текстових даних у пам’яті без створення файлів.
  • Логування в пам’яті перед записом у файл або базу даних.