Ruby中操作文件的方法介绍

Ruby提供了一套完整的I/O相关的内核模块中实现方法。所有I/O方法来自IO类。

类IO提供了所有的基本方法,如 read, write, gets, puts, readline, getc 和 printf.

本章将涵盖所有可供在Ruby中使用的基本I/O功能。如需使用更多的功能,请参考Ruby的IO类。
puts 语句:

在前面的章节中,你指定值的变量和然后使用声明 puts 输出。

puts 把语句指示程序显示存储在变量值。这将添加一个新行,每行末尾写出(输出)。
例子:

#!/usr/bin/ruby

val1 = "This is variable one"
val2 = "This is variable two"
puts val1
puts val2

这将产生以下结果:

This is variable one
This is variable two

gets 语句:

gets 语句可以用来从用户从标准屏幕采取输入调用 STDIN.
例如:

下面的代码显示了如何使用 gets 语句。此代码将提示用户输入一个值,将被存储在一个变量val,最后将打印在 STDOUT.

#!/usr/bin/ruby

puts "Enter a value :"
val = gets
puts val

这将产生以下结果:

Enter a value :
This is entered value
This is entered value

putc 语句:

与 puts 语句不相同,它在屏幕上输出整个字符串,而putc 语句可以用来一次输出一个字符。
实例:

下面的代码的输出只是一个字符 H:

#!/usr/bin/ruby

str="Hello Ruby!"
putc str

这将产生以下结果:

H

 print 语句:

print 语句是类似 puts 语句。唯一的区别是,puts语句后进入到下一行打印的内容,print 语句将光标定位在同一行上。
实例:

#!/usr/bin/ruby

print "Hello World"
print "Good Morning"

这将产生以下结果:

Hello WorldGood Morning

打开和关闭文件:

到现在为止,我们已经可以读取和写入的标准输入和输出。我们将看看如何运用到实际的数据文件。
File.new 方法:

可以创建一个的File对象使用File.new方法的读,写或两者兼有,这需要根据模式串。最后,可以使用File.close的方法来关闭该文件。
语法:

aFile = File.new("filename", "mode")
  # ... process the file
aFile.close

File.open 方法:

可以使用File.open方法的方法来创建一个新的文件对象,并分配到一个文件中,文件对象。然而,File.open方法和File.new方法之间区别。 File.open方法不同的是,可以关联一个块,而不能在File.new方法使用。

File.open("filename", "mode") do |aFile|
  # ... process the file
end

这里是一个不同的模式打开文件列表:

 读取和写入文件:

同样的方法,我们一直在使用“简单”的I/O所有文件对象。因此,gets 从标准输入读取一行,File.gets文件从文件对象读取一行。

然而,I/O对象提供额外的访问方法,使我们的生活更轻松。
sysread 方法:

可以使用该方法sysread读取一个文件的内容。可以打开该文件时,在任何模式中使用的方法sysread。例如:

以下是输入文本文件:

This is a simple text file for testing purpose.

现在,让我们尝试读取这个文件:

#!/usr/bin/ruby

aFile = File.new("input.txt", "r")
if aFile
  content = aFile.sysread(20)
  puts content
else
  puts "Unable to open file!"
end

这条语句将输出文件的前20个字符。现在,将文件指针放置在第21个字符。
syswrite 方法:

可以使用方法 syswrite 中的内容写入到一个文件中。需要打开该文件在写入模式使用方法 syswrite 时。
例如:

#!/usr/bin/ruby

aFile = File.new("input.txt", "r+")
if aFile
  aFile.syswrite("ABCDEF")
else
  puts "Unable to open file!"
end

这条语句将 “ABCDEF” 写入到文件中。
each_byte 方法:

这种方法属于类 File 。总是关联一个块方法each_byte。考虑下面的代码示例::

#!/usr/bin/ruby

aFile = File.new("input.txt", "r+")
if aFile
  aFile.syswrite("ABCDEF")
  aFile.each_byte {|ch| putc ch; putc ?. }
else
  puts "Unable to open file!"
end

一个接一个字符传递变量ch,然后在屏幕上显示如下:

s. .a. .s.i.m.p.l.e. .t.e.x.t. .f.i.l.e. .f.o.r. .t.e.s.t.i.n.g. .p.u.r.p.o.s.e...
.
.

IO.readlines 方法:

类File 是 IO类的一个子类。类的IO也有一些方法可用于对文件进行操作。

IO类的方法之一是IO.readlines。此方法返回的内容文件行。下面的代码显示使用方法IO.readlines:

#!/usr/bin/ruby

arr = IO.readlines("input.txt")
puts arr[0]
puts arr[1]

在这段代码中,变量arr是一个数组。将文件 input.txt 的每一行,将数组arr中的元素。因此arr[0]将包含在第一行,而到达[1]将包含该文件的第二行。
IO.foreach 方法:

此方法还返回一行一行的输出。foreach和 readlines 方法之间的差异是 foreach方法可以带有块相关联,foreach不会返回一个数组。例如:

#!/usr/bin/ruby

IO.foreach("input.txt"){|block| puts block}

此代码将传递该文件的内容,测试可变块的行,然后,输出将被显示在屏幕上。
重命名和删除文件:

可以重命名和删除文件用Ruby以编程方式使用 rename 和 delete 方法。

下面的例子,重命名现有文件 test1.txt:

#!/usr/bin/ruby

# Rename a file from test1.txt to test2.txt
File.rename( "test1.txt", "test2.txt" )

下面的例子删除现有文件 test2.txt:

#!/usr/bin/ruby

# Delete file test2.txt
File.delete("text2.txt")

文件模式和所有权:

使用chmod掩码的方法来改变模式或权限/访问的文件列表:

下面的例子改变现有的文件test.txt模式掩码值:

#!/usr/bin/ruby

file = File.new( "test.txt", "w" )
file.chmod( 0755 )

以下的表可以帮助选择不同的面具为chmod方法:

 文件查询:

下面的命令测试一个文件是否存在,然后再打开它:

#!/usr/bin/ruby

File.open("file.rb") if File::exists?( "file.rb" )

下面的命令查询文件是否是真是个文件:

#!/usr/bin/ruby

# This returns either true or false
File.file?( "text.txt" )

给定文件名是否为一个目录,下面的命令查找:

#!/usr/bin/ruby

# a directory
File::directory?( "/usr/local/bin" ) # => true

# a file
File::directory?( "file.rb" ) # => false

下面的命令查找该文件是否可读,可写或可执行文件:

#!/usr/bin/ruby

File.readable?( "test.txt" )  # => true
File.writable?( "test.txt" )  # => true
File.executable?( "test.txt" ) # => false

下面的命令查找该文件是否有大小为零或不:

#!/usr/bin/ruby

File.zero?( "test.txt" )   # => true

下面的命令返回的文件大小:

#!/usr/bin/ruby

File.size?( "text.txt" )   # => 1002

可以使用下面的命令找出一种类型的文件:

#!/usr/bin/ruby

File::ftype( "test.txt" )   # => file

ftype 方法识别的文件类型返回下列之一: file, directory, characterSpecial, blockSpecial, fifo, link, socket 或 unknown.

下面的命令可以用来发现当一个文件被创建,修改或上次访问:

#!/usr/bin/ruby

File::ctime( "test.txt" ) # => Fri May 09 10:06:37 -0700 2008
File::mtime( "text.txt" ) # => Fri May 09 10:44:44 -0700 2008
File::atime( "text.txt" ) # => Fri May 09 10:45:01 -0700 2008

Ruby中的目录:

所有文件都包含在不同的目录,Ruby也没有处理这些问题。鉴于文件中类处理文件,使用目录处理Dir类。
通过目录导航:

要改变一个Ruby程序的目录内,可使用Dir.chdir如下。这个例子改变当前目录 /usr/bin.

Dir.chdir("/usr/bin")

可以使用 Dir.pwd 找出当前目录是什么:

puts Dir.pwd # This will return something like /usr/bin

得到一个使用一个特定的目录内的文件和目录列表,使用 Dir.entries:

puts Dir.entries("/usr/bin").join(' ')

Dir.entries 返回一个数组的指定目录内的所有项目。Dir.foreach 提供了相同的功能:

Dir.foreach("/usr/bin") do |entry|
  puts entry
end

更简捷的方法获取目录列表利用 Dir 类数组的方法:

Dir["/usr/bin/*"]

创建一个目录:

可以用 Dir.mkdir,来创建目录:

Dir.mkdir("mynewdir")

还可以设置一个新的目录权限(不是一个已经存在的)用mkdir:

注: 掩码755设置权限所有者,组表示 [所有人] 类似于 rwxr-xr-x , r = read, w = write, and x = execute.

Dir.mkdir( "mynewdir", 755 )

删除目录:

可用 Dir.delete 删除一个目录。Dir.unlink 和 Dir.rmdir 执行完全相同的功能,并提供了方便。

Dir.delete("testdir")

创建文件和临时目录:

临时文件是程序的执行过程中可能会产生短暂的,但不是永久存储的信息。

Dir.tmpdir 提供对当前系统的临时目录的路径,尽管该方法是默认不可用。为了使 Dir.tmpdir 必要使用需要 'tmpdir'.

可以使用 Dir.tmpdir 及 File.join,创建一个独立于平台的临时文件:

require 'tmpdir'
  tempfilename = File.join(Dir.tmpdir, "tingtong")
  tempfile = File.new(tempfilename, "w")
  tempfile.puts "This is a temporary file"
  tempfile.close
  File.delete(tempfilename)

此代码创建一个临时文件,写入数据,并删除它。 Ruby的标准库还包括一个程式库Tempfile ,它可以创建临时文件:

require 'tempfile'
  f = Tempfile.new('tingtong')
  f.puts "Hello"
  puts f.path
  f.close

内置功能:

这里是Ruby的支持功能,处理文件和目录的完整列表:

  • File Class and Methods.
  • Dir Class and Methods.
(0)

相关推荐

  • 在Ruby中处理文件的输入和输出的教程

    Ruby 提供了一整套 I/O 相关的方法,在内核(Kernel)模块中实现.所有的 I/O 方法派生自 IO 类. 类 IO 提供了所有基础的方法,比如 read. write. gets. puts. readline. getc 和 printf. 本章节将讲解所有 Ruby 中可用的基础的 I/O 函数.如需了解更多的函数,请查看 Ruby 的 IO 类. puts 语句 在前面的章节中,您赋值给变量,然后使用 puts 语句打印输出. puts 语句指示程序显示存储在变量中的值.这将在

  • 详解Ruby中的异常

    异常和执行总是被联系在一起.如果您打开一个不存在的文件,且没有恰当地处理这种情况,那么您的程序则被认为是低质量的. 如果异常发生,则程序停止.异常用于处理各种类型的错误,这些错误可能在程序执行期间发生,所以要采取适当的行动,而不至于让程序完全停止. Ruby 提供了一个完美的处理异常的机制.我们可以在 begin/end 块中附上可能抛出异常的代码,并使用 rescue 子句告诉 Ruby 完美要处理的异常类型. 语法 begin # - rescue OneTypeOfException #

  • 优化Ruby代码使程序运行速度提高的例子

    这篇文章主要介绍了我是如何把ruby gem contracts.ruby速度提升10倍的. contracts.ruby在我项目里用来添加代码合约(code contracts)到Ruby中.看起来差不多是这样的: Contract Num, Num => Num def add(a, b) a + b end 只要add方法被调用,参数和返回值都会被检查. 20秒 本周末,我对该库进行了测试,发现其性能非常糟: 这是在随机输入下,运行1000次以后的结果. 所以,当给一个函数加入合约功能后,

  • Ruby中操作文件的方法介绍

    Ruby提供了一套完整的I/O相关的内核模块中实现方法.所有I/O方法来自IO类. 类IO提供了所有的基本方法,如 read, write, gets, puts, readline, getc 和 printf. 本章将涵盖所有可供在Ruby中使用的基本I/O功能.如需使用更多的功能,请参考Ruby的IO类. puts 语句: 在前面的章节中,你指定值的变量和然后使用声明 puts 输出. puts 把语句指示程序显示存储在变量值.这将添加一个新行,每行末尾写出(输出). 例子: #!/usr

  • python中操作文件的模块的方法总结

    在python中操作文件算是一个基本操作,但是选对了模块会让我们的效率大大提升.本篇整理了两种模块的常用方法,分别是os模块和shutil模块.相信这两种模块大家在之间的学习中有所涉及,那么关于具体的文件操作部分,我们一起往下看看都有哪些方法和实例吧. 本教程操作环境:windows7系统.Python3版.Dell G3电脑. Python对文件操作采用的统一步骤是:打开-操作-关闭. 一.python中对文件.文件夹操作时经常用到的os模块和shutil模块常用方法 1.得到当前工作目录,即

  • Servlet中操作文件详解及实例

    Servlet中操作文件详解及实例 因为Servlet本来就是一个.Java文件,因此servlet中操作文件和普通java文件操作文件是一样的. 读取文件主要代码: FileReader f=new FileReader("f:\\lissdy.txt"); BufferedReader bw=new BufferedReader(f); 读出一行数据 String num=bw.readLine(); 注意一定要关闭文件流 bw.close(); 写文件的方法与之类似,具体代码为:

  • Djang中静态文件配置方法

    下面通过图文并茂的方法给大家详细介绍下Djang中静态文件配置方法 一.django静态文件配置原理 静态文件配置就是为了让用户请求时django服务器能找到静态文件返回. 首先要理解几个概念: 媒体文件:用户上传的文件 静态文件:css,js,image等 开发环境:使用django内置服务器处理静态文件 生产环境:使用apache2/nginx服务器处理静态文件映射 所以在配置时要分清楚开发环境还是生产环境,这个后面会详细介绍. 下面先介绍一下服务器查找静态文件的原理,这样我们才能更好的配置

  • C#简单遍历指定文件夹中所有文件的方法

    本文实例讲述了C#简单遍历指定文件夹中所有文件的方法.分享给大家供大家参考,具体如下: C#遍历指定文件夹中的所有文件: DirectoryInfo TheFolder=new DirectoryInfo(folderFullName); //遍历文件夹 foreach(DirectoryInfo NextFolder in TheFolder.GetDirectories()) this.listBox1.Items.Add(NextFolder.Name); //遍历文件 foreach(F

  • Spring配置中transactionAttributes的使用方法介绍

    最近碰到这个问题,在使用spring提供的JpaTemplate进行查询时,如果数据量超过100 条,查询效率就会明显降低.由于开始时使用JPA内部的双向关联,造成各实体内部关联过多,从而影响所有的操作,因此怀疑是因为JPA的关联关系所致.但是去掉关联关系后的效果不显著. 查找spring的相关配置,发现原来关于"transactionAttributes"有问题.原来的配置如下: <bean id="baseTransactionProxy" class=&

  • Android开发实现文件关联方法介绍

    Android开发实现文件关联方法,做一个项目的时候,需要点击文件打开我们自己的app.首先讲一下点击普通文件打开app的方法,只需要三行代码,在app启动活动里加一个过滤器. <intent-filter> <category android:name="android.intent.category.LAUNCHER"> </category></action></intent-filter> <intent-fil

  • 在 Linux 中查找文件的方法

    使用简单的命令在 Linux 下基于类型.内容等快速查找文件. 如果你是 Windows 或 OSX 的非资深用户,那么可能使用 GUI 来查找文件.你也可能发现界面受限,令人沮丧,或者两者兼而有之,并学会了组织文件并记住它们的确切顺序.你也可以在 Linux 中做到这一点 -- 但你不必这样做. Linux 的好处之一是它提供了多种方式来处理.你可以打开任何文件管理器或按下 Ctrl+F ,你也可以使用程序手动打开文件,或者你可以开始输入字母,它会过滤当前目录列表. 使用 Ctrl+F 在 L

  • 在PHP中操作文件的扩展属性

    在操作系统的文件中,还存在着一种我们可以自己定义的文件属性.这些属性不是保存在文件内容中,也不是直接可以通过 ls -al 所能看到的内容.它们可以将一个键值对信息永久得关联到文件上,一般现在的 Linux 系统都支持这样的文件扩展属性的功能.在操作系统中我们可以通过 setfattr. getfattr. attr 这些命令来操作它们.当然,PHP 也为我们提供了一个扩展可以用于对文件的扩展属性进行操作. 添加扩展属性 $file = __FILE__; var_dump(xattr_set(

  • 利用Python删除电脑中重复文件的方法

    目录 前言 练习 代码演示 总结 前言 在生活中,我们经常会遇到电脑中文件重复的情况.在文件较少的情况下,这类情况还比较容易处理,最不济就是一个个手动对比删除:而在重复文件很多的时候,我们很难保证把重复文件全部删完.下面文章就来简单介绍便捷一个小方法,用Python来删除重复文件 练习 Python提供一个内置电脑文件管理库os模块,我们可以利用它来删除多余文件. 当一个文档里存在重复文件名,我们的系统会自动给我们重复的文件名更名, 比如下图的文件“1”重复了3次:  那我们该怎么删除文件“1”

随机推荐