Откройте поток ввода-вывода из локального файла или URL

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

Есть ли простой способ сделать это в ruby?

2 ответа

Решение

open-uri является частью стандартной библиотеки Ruby, и она переопределит поведение open так что вы можете открыть как URL, так и локальный файл. Возвращает File объект, поэтому вы должны иметь возможность вызывать методы, такие как read а также readlines,

require 'open-uri'
file_contents = open('local-file.txt') { |f| f.read }
web_contents  = open('http://www.stackru.com') {|f| f.read }

Для URL, вы можете хотеть rest-client, из его документа

Если вы хотите передавать данные из ответа в файл по мере его поступления, а не полностью в памяти, вы также можете передать RestClient:: Request.execute параметр:block_response, в который вы передаете блок /proc.Этот блок получает необработанный неизмененный объект Net::HTTPResponse из Net::HTTP, который можно использовать для потоковой передачи непосредственно в файл при получении каждого чанка.

File.open('/some/output/file', 'w') {|f|
  block = proc { |response|
    response.read_body do |chunk|
      f.write chunk
    end
  }
  RestClient::Request.execute(method: :get,
                              url: 'http://example.com/some/really/big/file.img',
                              block_response: block)
}
Другие вопросы по тегам