Ruby的内核模块已经实现了I/O相关的方法:gets,open,print,printf,putc,puts,readline,readlines,test。
11.1 IO对象
Ruby提供了基础类:IO,它的继承类有File与BasicSocket。IO对象就是建立一个双向通道,一端接Ruby,一端接外部资源。
11.2文件的打开与关闭
file = File.new("testfile", "r") #...process the file file.close #第二个参数是操作模式:r w r+(read-write)
上面的new方法返回的是一个File对象,File#open与之相像,只是如果给File#open赋一个代码块,则open方法会调用这个代码块,把打开的文件对象作为参数。并且在操作完成后,自动关闭文件。
File.open("testfile","r") do |file| #...processthefile end #<-file automatically closed here
读取文件最好使用这种方式,因为这种在处理过程中如果发生异常,File#open方法会在抛出异常前关闭文件。
#open方法内部大概类似于下面的处理逻辑 class File def File.open(*args) result=f=File.new(*args) if block_given? begin result=yield f ensure f.close end end result end end
11.3 读写文件
gets可从标准输入中读取一行,在通过脚本调用时,如果通过命令指定了文件,也可以从文件中读取。
while line=gets puts line end $ruby copy.rb These are lines These are lines that I am typing that I am typing ^D #脚本执行时指定文体 $rubycopy.rb testfile This is line one This is line two #显示的指定文件,并逐行打印 File.open("testfile") do |file| while line = file.gets puts line end end
循环读取
#IO#each_byte读取下一个8-bit字节 #chr方法将数值转换为ASCII字符 File.open("testfile") do |file| file.each_byte.with_index do |ch,index| print"#{ch.chr}:#{ch}" break if index > 10 end end produces: T:84h:104i:105s:115 :32i:105s:115 :32l:108i:105n:110e:101
IO#each_line逐行读取文件
#String#dump用于显示换行符号 File.open("testfile") do |file| file.each_line{|line| puts "Got #{line.dump}"} end produces: Got "This is line one\n" Got "This is line two\n" Got "This is line three\n" Got "And soon...\n"
#IO.each_line("*")支持自定义换行符号,下面示例使用e作为换行符号 File.open("testfile") do |file| file.each_line("e") {|line| puts "Got #{line.dump}"} end produces: Got "This is line" Got "one" Got "\nThis is line" Got "two\nThis is line" Got "thre" Got "e" Got "\nAnd soon...\n"
#使用IO#foreach IO.foreach("testfile") {|line| puts line}
也可以把文件内容读取为String串,或者String数组(每行读取为一列)
#read into string str = IO.read("testfile") str.length #=>66 str[0,30] #=>"This is line one\nThis is line" #read into an array arr = IO.readlines("testfile") arr.length #=>4 arr[0] #=>"This is line one\n"
注意:IO处理经常会出现异常情况,在调用这些API时,记着使用begin..rescue..end来捕获它们。
写文件
#Note the "w",which opens the file for writing File.open("output.txt","w") do |file| file.puts "Hello" file.puts "1+2=#{1+2}" end
nil写入文件后是empty串。
Doing I/O with Strings
StringIO类类似于java的StringReader,StringWriter。提供了IO类相同的方法实现。
require 'stringio' ip = StringIO.new("now is\nthe time\nto learn\nRuby!") op=StringIO.new("","w") ip.each_line do |line| op.puts line.reverse end op.string#=>"\nsi won\n\nemit eht\n\nnrael ot\n!ybuR\n"
11.4 网络通信
require 'socket' client = TCPSocket.open('127.0.0.1', 'www') client.send("OPTIONS /~dave/ HTTP/1.0\n\n", 0) #0 means standard packet puts client.readlines client.close produces: HTTP/1.1200OK Date:Mon,27May201317:31:00GMT Server:Apache/2.2.22(Unix)DAV/2PHP/5.3.15withSuhosin-Patchmod_ssl/2.2.22 OpenSSL/0.9.8r Allow:GET,HEAD,POST,OPTIONS Content-Length:0 Connection:close Content-Type:text/html
lib/net包下面提供了更高一层次的应用协议封装(FTP,HTTP,POP,SMTP,telnet)
require 'net/http' http = Net::HTTP.new('pragprog.com',80) response = http.get('/book/ruby3/programming-ruby-1-9') if response.message == "OK" puts response.body.scan(/<imgalt=".*?"src="(.*?)"/m).uniq[0,3] end produces: http://pragprog.com/assets/logo-c5c7f9c2f950df63a71871ba2f6bb115.gif http://pragprog.com/assets/drm-free80-9120ffac998173dc0ba7e5875d082f18.png http://imagery.pragprog.com/products/99/ruby3_xlargecover.jpg?1349967653
更高一层次
require 'open-uri' open('http://pragprog.com') do |f| puts f.read.scan(/<imgalt=".*?"src="(.*?)"/m).uniq[0,3] end produces: http://pragprog.com/assets/logo-c5c7f9c2f950df63a71871ba2f6bb115.gif http://pragprog.com/assets/drm-free80-9120ffac998173dc0ba7e5875d082f18.png http://imagery.pragprog.com/products/353/jvrails2_xlargebeta.jpg?1368826914
11.5解析HTML
#通过正则式匹配,%r{..}m,添加m表示要多次匹配 require 'open-uri' page = open('http://pragprog.com/titles/ruby3/programming-ruby-1-9').read if page =~ %r{<title>(.*?)</title>}m puts "Title is #{$1.inspect}" end produces: Title is "The Pragmatic Bookshelf | Programming Ruby1.9"
使用nokogiri模块,可以更强大的支持解析html
require 'open-uri' require 'nokogiri' doc = Nokogiri::HTML(open("http://pragprog.com/")) puts"Pagetitleis"+doc.xpath("//title").inner_html #Output the first paragraph in the div with an id="copyright" #(nokogiri supports both xpath and css-like selectors) puts doc.css('div#copyright p') #Output the second hyperlink in the site-links div using xpath and css puts "\nSecond hyperlink is" puts doc.xpath('id("site-links")//a[2]') puts doc.css('#site-links a:nth-of-type(2)')
Nokogiri can also update and create HTML and XML
相关推荐
《Programming Ruby》是一本关于Ruby编程语言的经典书籍,它的第三章深入探讨了Ruby的基本语法和核心概念。在这一章中,作者介绍了变量、常量、符号、数组、哈希等核心数据类型,以及控制流(条件语句和循环)和方法...
- 标准输入/输出和重定向,以及如何与系统进行交互。 7. **正则表达式(Regexp)** - Ruby的正则表达式强大且灵活,源代码会包含多种匹配和替换的示例。 8. **元编程(Meta-programming)** - Ruby允许在运行时...
《Programming Ruby - The Pragmatic Programmer's Guide》第二版(2005年注释版)是一本在IT行业中享有盛誉的经典书籍,专门针对Ruby编程语言进行了深入浅出的讲解。该书不仅覆盖了Ruby语言的基础知识,还探讨了其...
"ruby--.txt"可能是一个文本文件,其中包含了Ruby的代码示例、笔记或者问题解答,通过阅读可以加深对Ruby语法和实践的理解。 "Ruby语言入门教程附实例"和"ruby-mht"文件很可能是包含实例的教程,实践是学习编程的...
《Programming Ruby》是一本关于Ruby编程语言的经典著作,由Dave Thomas、Andy Hunt和Chad Fowler合著。这本书自2004年初版以来,一直是学习Ruby的首选资源,被誉为“Pickaxe”书,因其封面的图标而得名。Ruby是一种...
《Programming Ruby》被誉为是学习Ruby语言的最佳指南,这本书在IT界享有极高的声誉,被亲切地称为“镐头书”,其价值与影响力无远弗届。本书不仅详细介绍了Ruby语言的核心概念、语法结构以及编程实践,还深入探讨了...
《Programming Ruby 1.9》是由Dave Thomas、Chad Fowler以及Andy Hunt三位作者共同编写的关于Ruby编程语言的一本权威指南。这本书是对之前版本《Programming Ruby》的大幅修订版,并得到了原出版社Addison Wesley的...
《Programming Ruby》中文版第二版是一本专注于Ruby编程语言的经典教程。这本书的两个版本——高清扫描版和高清文字版,都是为了便于读者学习和查阅,其中都带有书签功能,帮助读者快速定位到相关内容。 Ruby是一种...
通过阅读《Programming Ruby》,读者不仅可以学习到Ruby的基本语法,还能深入了解其背后的哲学和设计思想,从而成为一名高效的Ruby开发者。书中的实例和练习将帮助你更好地掌握Ruby编程,提升解决问题的能力。
7. **文件和I/O**:如何读写文件,处理标准输入/输出,以及使用系统命令。 8. **正则表达式**:Ruby内置了强大的正则表达式支持,用于文本处理和模式匹配。 9. **Gem和库**:Ruby的生态系统中,Gem是软件包管理器...
5. **Ruby标准库**: - File系统操作:提供读写文件、目录管理等功能。 - 网络编程:如Net::HTTP用于HTTP请求,Socket支持网络通信。 - JSON和XML解析:方便地处理这些数据格式。 - Test::Unit和MiniTest:内置...
5. 实际应用:Rich Kilmer提到,在阅读了第一版《Programming Ruby》之后,他感到很受启发,随后创立了一家主要通过应用Ruby解决实际问题的公司,这表明了Ruby语言的实用性。 6. 社区和库的支持:Rich Kilmer还强调...
内含以下4个文档: 1、Addison.Wesley.The.Ruby.Way.2nd.Edition.Oct.2006.chm 2、O'Reilly.Learning.Ruby.May.2007.chm 3、Programming Ruby 2e.pdf 4、ruby中文文档.chm
《Programming Ruby》是一本经典的Ruby编程语言教程,中文第二版为中国的程序员提供了深入学习Ruby的宝贵资源。这本书的源代码下载对于读者来说是极其有用的,因为它允许读者在实践中探索和理解书中所阐述的概念。...
PROGRAMMING+RUBY中文版 PROGRAMMING+RUBY中文版 PROGRAMMING+RUBY中文版
压缩包内的"ruby-2.0.0-p0"可能包含了完整的Ruby解释器、标准库、开发工具以及相关的文档。为了使用这个版本的Ruby,开发者通常需要将其解压,配置环境变量,然后通过编译安装。对于初学者,了解这些基础知识是学习...