1. 标准输入、输出
- 分为标准输入、标准输出、标准错误输出
- 主要用于从键盘获取输入数据
# 获取键盘输入
$stdin.gets STDIN.gets gets
# 屏幕输出, 标准输出 $stdout.p会报错
$stdout.print $stdout.printf $stdout.puts $stdout.putc
# 屏幕输出, 标准错误输出 $stderr.p会报错
$stderr.print $stderr.printf $stderr.puts $stderr.putc
- 输出结果重定向到文件,$stdout会写入文件不会输出屏幕,$stderr不会写入文件会输出到屏幕
# test.rb
$stdout.puts 'abc'
$stderr.puts 'def'
$ ruby test.rb > test.txt => 'def'
$ cat test.txt => 'abc'
2. 文件输入、输出
- IO类的子类File类可以进行文件的输入、输出操作。
- 打开文件
# 1个程序中可以同时打开的文件数量是有限制的,手动关闭
io = File.open(file, mode) 可以省略File io = open(file, mode)
io.close
# 自动关闭
File.open(file, mode) do |io|
end
File.read(file) # 一次读取所有内容
3. 基本输入、输出
# 用参数rs的字符串分行,默认值是"\n"
io.gets(rs) io.each(rs) io.each_lines(rs) io.readlines(rs)
# 返回的字符串包含末尾的换行符,可以用chomp!去掉
# gets经典用法,获取一行数据,获取完毕再使用该方法则返回nil
while line = io.gets
p line.gets
p io.lineno # gets 和 each_line方法会自动记录读取的行数
end
io = 'abc'
io << 'def' << '123' => 'abcdef123'
3.File类的一些方法
File.read(path) # 读取文件, 大文件用File.open(path) { |io| io.sysread(max_size) }
File.read(path).size File.size(path) # 文件大小
File.zero?(path) # 判断文件大小是否为0
File.exist?(path) # 判断文件是否存在
File.file?(path) # 判断是不是文件
File.directory?(path) # 判断是不是目录
File.ftype(path) # 判断文件类型,返回file、 directory、 characterSpecial、 blockSpecial、 fifo、 link、 socket 或 unknown。
File.rename('before.txt', 'after.txt') # 重命名文件
File.delete(file) #删除文件
File.chmod(mode, path) # 修改文件的访问权限
File.basename(path, suffix) # 返回path中最后一个'/'以后的部分
p File.basename("/usr/local/bin/ruby") #=> "ruby"
p File.basename("src/ruby/file.c", ".c") #=> "file"
File.dirname(path) # 返回路径path中最后一个"/"之前的内容,路径不包含"/"则返回"."
p File.dirname("/usr/local/bin/ruby") #=> "/usr/local/bin"
p File.dirname("ruby") #=> "."
p File.dirname("/") #=> "/"
File.extname(path) # 返回路径path中basename方法返回结果中的扩展名,没扩展名或以"."开头的文件返回空字符串
p FIle.extname("img/foo.png") #=> ".png"
p File.extname("~/.zshrc") #=> ""
File.split(path) # 将路径path分割为目录名和文件名两部分的数组
p File.split("/usr/local/bin/ruby") #=> ["/usr/local/bin", "ruby"]
p FIle.split("ruby") #=> [".", "ruby"]
File.join(name1, name2, ...) #用File::SEPARATOR连接参数指定的字符串,默认"/"
p File.join("/usr/bin", "ruby") #=> "/usr/bin/ruby"
p File.join(".", "ruby") #=> "./ruby"
File.expand_path(path, default_dir) # 根据目录default_dir,将相对路径转化为绝对路径,不指定default_dir则根据经当前目录转换
p Dir.pwd #=> "/usr/local"
p File.expand_path("bin") #=> "/usr/local/bin"
p File.expand_path("../bin") #=> "/usr/bin"
p File.expand_path("bin", "/usr") #=> "/usr/bin"
p File.expand_path("../etc", "/usr") #=> "/etc"
4.Dir类
Dir.pwd # 返回当前目录,类似 /usr/bin
Dir.chdir("/usr/bin") # 切换文件,作用同linux cd
Dir.mkdir("mynewdir") # 新建目录
Dir.mkdir( "mynewdir", 755 ) # 新建目录,并添加权限
Dir.delete("mynewdir") # 删除空目录
# 获取指定目录内的文件和目录列表
Dir.entries("/usr/bin").join(' ') # 包含'.'开头的隐藏文件
Dir.foreach("/usr/bin") do |entry|
puts entry
end
Dir["/usr/bin/*"]
Dir.glob # 将匹配到的文件名(目录名)以数组形式返回
Dir.glob("*") #获取当前目录所有文件名(无法获取Unix中以'.'开头的隐藏文件名)
Dir.glob((".*") # 获取当前目录中所有的隐藏文件名
Dir.glob(["*.html", "*.htm"]) # 获取当前目录中扩展名为.html或.htm的文件名
Dir.glob(["*/*.html", "*/*.htm"]) #获取子目录下扩展名为.html或.htm的文件名
5.fileutils库
FileUtils.cp(from, to) # 把文件从from拷贝到to。to为目录时,则再to下面生成与from同名的文件
FileUtils.mv(from, to) # 把文件(或目录)from移动到to。to为目录时,则将文件作为与from同名的文件移动到to目录下。
FileUtils.rm(path) FileUtils.rm_f(path) #删除path。 path只能为文件。
FileUtils.rm_r(path) FileUtils.rm_rf(path) # 删除path。 path为目录时,则进行递归删除。
FileUtils.compare(from, to) # 比较from和to的内容,相同返回true,否则返回false。
FileUtils.install(from, to, option) #把文件从from拷贝到to。如果to存在,且与from内容一致,则不会拷贝。option用于指定目标文件的访问权限。
例如:FileUtils.install(from, to, :mode => 0755)
FileUtils.mkdir_p(path) 同mkdir -p, 会自动创建上层不存在的目录。