2012-04-04 4 views
1

Если я хочу, чтобы добавить содержимое файла Src в конце Dest файла в Ruby, это лучше использовать:Рубин File.read против File.gets

while line = src.gets do 

или

while buffer = src.read(1024) 

Я видел оба используемых и задавался вопросом, когда следует использовать каждый метод и почему?

ответ

7

Первый - для чтения «строк», один для чтения n байт.

В то время как буферизация в байтах может быть быстрее, многие из них могут исчезнуть в ОС, что, вероятно, будет делать буферизацию в любом случае. ИМО это больше связано с контекстом чтения - вы хотите линии, или вы просто перетасовываете куски данных?

Тем не менее, при принятии решения может оказаться полезным испытание производительности в вашей конкретной среде.

+0

Спасибо Дэйв, я больше «перетасовываю куски или данные вокруг» и не обязательно забочусь о строках. Производительность, о которой я забочусь. Я, вероятно, поеду с чтением, которое кажется более подходящим в этом сценарии. Спасибо за вашу помощь! – Tamar

2

gets прочтет до конца линии на основе сепаратора

read не будет читать п байт в то время

Это все зависит от того, что вы пытаетесь читать.

Может быть более эффективным использовать read, если ваш файл src имеет непредсказуемую длину строки.

5

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

Читайте в файл строка за строкой, но хранить только одну строки за один раз:

while (line = file.gets) do 
    # ... 
end 

прочитанного во всех строках файла сразу:

file.readlines.each do |line| 
    # ... 
end 

Прочитайте файл в виде серии блоков:

while (data = file.read(block_size)) 
    # ... 
end 

Читать в весь файл сразу:

data = file.read 

Это действительно зависит от того, с какими данными вы работаете. Обычно read лучше подходит для двоичных файлов или тех, где вы хотите, чтобы это была одна большая строка. gets и readlines похожи, но readlines удобнее, если вы уверены, что файл поместится в памяти. Не делайте этого в файлах с несколькими гигабайтами, или вы попадете в мир обид, когда ваша система начнет замену. Используйте gets для подобных ситуаций.