[Ruby] IO类,输入输出, File类

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. 基本输入、输出

  • 从IO类的对象io中读取数据,不只可以从文件读取
# 用参数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 << str
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, 会自动创建上层不存在的目录。

Guess you like

Origin blog.csdn.net/qq_41037744/article/details/120451569