接着上一节完成的关于类编程和高级功能的描述。
http://t.csdn.cn/IKFIehttp://t.csdn.cn/IKFIe
模板:
主题:x
阐述:y
目录
主题:访问本地文件系统
阐述:在应用程序中常常需要访问保存在本地文件系统中的数据,像查看配置文件是否存在、读取文件信息、向文件中写入新的内容以及改变文件目录等。
获取文件属性
在计算机系统中,数据是以文件的形式保存到磁盘中的,为了容易区分不同的数据,就需要对文件进行描述,即文件的属性。
查看文件的大小
可以使用File类的size?方法、zero?方法和size方法来实现。这些方法 的具体说明如下:
1)size?:返回文件大小,如果文件大小为0,则返回nil。
2)zero?: 如果大小为0,返回true,否则返回false。
3)size:范湖文件的实际大小。
查看文件时间属性
在windows系统中每个文件都有三个与之相关的时间属性,即创建时间、最后一次修改时间和最后一次读取时间。对于这三个时间属性,可以通过FIle类中的ctime方法、mtime方法和atime方法来访问。
提示:在File类和File类的实例中也同样具有这3个方法,可以自己尝试。
检查文件是否存在
通常应用程序在读取和写入文件之前,首先会判断指定路径的文件是否存在,如果存在,则进行下一步操作。
在Ruby中检查一个文件是否存在,可以使用FIle类总的exist?方法和exists?方法。这两个方法都接受一个字符串路径参数,如果路径存在则返回true,否则返回false。
提示:exist?和exists?方法同样适用于判断指定的目录是否存在。
查看文件操作权限
在Ruby中使用File:Stat类的mode实例方法可以获得对文件的访问权限。而且还可以使用File类的chmod方法来修改权限。
打开文件与关闭文件
对所有文件进行操作之前都必须先打开,再使用。而在使用结束时,必须执行关闭操作。打开文件的目的是创建一个文件缓冲区,以方便后面进行输入/输出操作,而关闭文件的目的是将缓冲区中未写入的数据保存到文件中。
打开文件
Ruby中存在3种打开文件的方式,分别是调用FIle类的new方法、使用FIle类的open方法以及直接使用open方法。
使用File类的new方法打开文件
当通过new方法实例化FIle类时,其实就已经打开了指定的文件。不过,此时只能对打开的文件进行读取。如果要进行其他操作,就需要为new方法传入第二个参数。第二个参数是可选参数,用于指定以何种方式打开文件,又称为模式字符串。该参数默认为“r”,表示以只读方式打开文件。
filename = "d:/reeadme.txt";
file=File.new(filename);
file=File.new(filename,"r");
文件访问模式
r 以只读模式打开文件,同时将文件指针放在文件开始处
r+ 以读写模式发开文件,同事将文件指针放在文件的开始处
w 以只写模式打开文件。打开文件时,会自动清除文件内容,然后重新写入文件。 如果打开的文件不存在,则自动创建该文件。
w+ 以读写模式打开文件,在打开文件后,清空文件内容才能写入文件。如果打开的
文件不存在,就创建该文件。
a 以追加模式打开文件,而且将文件指针放在执行文件的末尾,以备向文件中写入
内容。如果要打开的文不存在,则自动创建该文件。
a+ 以读取/追加的模式打开文件,并且将文件指针放在文件结尾,以备读取文件或向
文件中追今年内容,如果打开的文件不存在,则自动创建该文件。
b 以二进制形式打开文件,这种方法只适合DOS平台或者windows平台。
使用File类的open类方法打开文件
File类提供了一个open类方法来打开文件。在使用这种方式时还可以为该方法传递一个代码块作为参数,此时会把open方法打开的文件对象传递给块,然后开始块的执行。
filename="d:/readname.txt";
File.open(filename) do |file|
#file即打开的文件对象
end
使用open方法打开文件
使用open方法打开文件和File类的open类方法十分相似,都可以在调用该方法的同时传递一个代码块,也可以使用该方法返回一个文件对象。
filename="d:/readme.txt";
open(filename) do |file|
#file 参数时一个文件对象
end
关闭文件
因为文件是资源,并不属于Ruby应用程序,所以操作完以后要立即释放改文件,以便被其他程序使用。在Ruby中可以使用File类的close方法关闭该打开的文件。
file.close
读取文件
文件打开之后,便可以对文件的内容进行各种操作了。
使用内置读取方法
File类提供了很多用于读取文件内容的方法。例如,gets方法、read方法、readchar方法、readline方法和readlines方法。
read方法
read方法可以从FIle实例中读取指定字节数的内容,如果指定字节数大于文件内容的字节数,那么读取完文件就不再读取。read方法的格式如下:
read([length[,buf]])
其中length和buf都是可选参数,length参数表示读取文件内容的字节数,buf参数用于保存读取文件的内容。
移动文件指针
Ruby中设置了移动文件指针的方法,使用他们可以移动文件指针和指针所在的行。
pos:获取当前文件指针所在的位置;
pos=:设置文件指针位置;
rewind:将文件指针哟丁到文件开始位置;
lineno:返回当前文件指针所在的行;
lineno=:将文件指针移动到指定的行。
readchar方法
readchar方法用于从File实例中读取一个字符,或者说从打开的文件中读取一个字符,并且将读取到的字符返回。
readline和readlines方法
使用readline和readlines方法可以从指定文件中读取一行,不过读到文件末尾时,会引发EOFError异常。readlines方法一次读取文件的所有行,并把所有行的内容保存到数组中,数组的每个元素都是文件中的一行内容。
gets方法
gets方法和readline方法可以读取一行,不同的是gets方法读取到末尾时会返回nil,而不是异常。
按行读取
Ruby提供了两个按行读取文件的迭代器:each_line和each。这两个迭代器功能相同,都是依次将文件里的每行转入代码块,再进行迭代。
按字节读取
使用each_byte迭代器可以按字节对文件内容进行迭代。each_byte迭代器会将字符的整数形式传递给代码块,而不是将字符传递给代码块。如果要将整数转换成真正的字符,需要用chr方法抓换。
使用类方法读取
除了上述的迭代方法读取文件之外,还可以使用IO类的佛reach方法迭代文件内容。在使用foreach方法时不需要打开文件,迭代方法时按内容的行进行的。
写入文件
使用读取操作时仅仅会读取文件内容而不会改变文件的内容。
在Ruby中,写入文件需要使用写入或者追加模式打开一个文件。
与写入有关的主要有以下方法:
print方法:将一行或多行字符串写入文件,并且不换行。可以通过设置"$\“来让每次写入之后增加换行。
puts方法:将一行字符串或多行字符串写入一个文件,每次写入之后自动换行;
putc方法:将一个字符写入一个文件,如果传入一个整数参数,则将该参数转换成字符后写入;
write方法:将一行字符串写入一个文件。
操作文件
使用Ruby内置的方法实现对文件的重命名和删除操作。
重命名文件
要对一个文件进行重命名,需要调用FIle类的rename方法。rename方法接受两个字符串作为参数,一个字符串表示原文件名,另一个字符串表示新文件名。
在使用rename方法时如果源文件名和新文件名所指向的不是同一个目录的话,系统会自动将文件重命名并移动到新的目录。
注:使用rename方法移动文件时,目标文件夹必须存在,否则将抛出异常。而如果新文件名所指向的文件存在,则自动覆盖。
删除文件
File类提供了两个删除文件的方法,分别是delete方法和unlink方法。这两个方法都用于删除普通的文件,如果删除成功则返回删除文件的个数,否则将抛出一个"Errorno::error"异常。
操作目录
在本节介绍之前介绍的都是使用FIle类对文件进行操作。Ruby同样可以操作目录,为此提供了一个单独的Dir类。使用DIr类中提供的类方法,可以实现对目录的遍历、对目录的修改和对目录的删除等操作。
获取当前目录
使用DIr类的pwd方法或getwd方法可以获取当前目录。
改变当前目录
改变当前目录需要使用Dir类中的chdir类方法。该方法接受一个新的目录作为参数,执行完以后将当前目录切换到奥新目录当中。如果没有为该方法设置参数,那么该方法将当前目录切换到当前系统用户所在的目录中。
注:如果该方法所指向的新目录不存在的话,将抛出一个“Errno:ENOENT”异常。
删除目录
DIr类提供了3个删除目录的方法,分别是delete、rmdir和unlink。使用这些方法删除目录,如果成功返回0,否则将产生“Errno:EONENT”异常或者"Errno::ENOTEMPTY"异常。
当删除非空目录时,将会产生异常。
遍历目录
在Ruby中不仅可以使用迭代的方法获取目录列表,还可以使用内置的方法获取。当使用迭代的方法获取目录列表时,主要是通过foreach迭代器和each迭代目录项。
操作路径
在Ruby中,File类提供了几个内置的类方法,可以实现对文件路径的操作。我们可以根据路径获取路径的名称、文件的名称,或者根据一个相对路径获得一个绝对路径,也可以根据提供的字符连接成一个新的路径。
分析路径
使用FIle类中的dirname和basename类方法可以根据路径获取目录名称和文件名称。
获取绝对路径
使用FIle类的expand_path类方法可以获取相对路径对应的绝对路径。expand_path的使用方法非常简单。
链接路径
所谓链接路径是指将几个指定的字符串组合在一起,形成一个新的路径。在Ruby中使用File类的join方法可以实现链接路径的功能。join方法接受多个字符串参数,返回链接后的路径。
主题:访问数据库
阐述:目前主流编程语言都提供了对数据库的支持,而且都有各自不同的访问数据库技术。
Ruby数据库访问方式
目前比较流行的数据库有Mysql、SQL Server、Oracle、SQLLite和DB2等。每种数据库都有自己的特点和使用方式,而且每种广泛使用的编程语言都可以访问这些不同的数据库。
DBI模块简介
Ruby语言对每一种数据库都提供了一个相应的数据库驱动(DataBase Driven,DBD),实现对相应数据库的操作。有了最底层的DBD,就可以操作相应的数据库了。不过每一种DBD的使用方式不太一样,因此Ruby另外提供了一个基于DBD的抽象层,数据库接口。
Ruby中数据库接口称为DBI,是对底层DBD进行的抽象,形成的不同数据库之间的统一接口。在面向对象的数据库操作中,使用DBI操作数据又比较复杂,所以通常会选择一种ORM(Object Relation Mapping,对象关系映射)框架。
在Ruby中,从最底层的数据库到高层的持久化操作中,他们的挂关系是一层层封装,总体来说可以分为四层(包括数据库)。
Database、DBD、DBI、ORM
另外,从数据库操作的层面上将,DIB分为以下3个模块:
drh(driver handle):驱动句柄,对应于DBD,封装了对数据库的访问。driver handle对于开发者编程是透明的,只提供给DBI使用;
dbh(database handle):数据库名柄,封装了对数据库链接的访问;
sth(statement handle):语句或数据对象句柄,封装了SQL语句执行以后返回值的对象。
提示:在基于Ruby语言的Rails框架中提供了ORM的实现,ActiveRecord插件。
在Ruby中,许多DBD需要额外安装,因此在操作之前需要安装相应的DBD。
命令如下:
gem install dbi
gem install dbd-mysql
#虽然,但是,自己的windows上的Ruby使用命令行安装失败了。不知道为什么。
Mysql模块简介
Mysql模块为Ruby提供了一个客户端API,可以使用Mysql模块中的方法操作Mysql数据库中的数据。相对来说,DBI还要比Mysql模块高一个层次,这是因为DBI更加抽象,并且还与数据库无关。
gem install mysql
Mysql模块主要提供了4个类对Mysql数据库进行操作,他们分别是:
Mysql类:提供连接服务器的方法,以及发送SQL语句,并关闭打开的连接;
Mysql:Result类:处理SQL语句返回结果集;
Mysql:Field类:该类中的成员主要用于处理结果集的元数据,如列名、行数和列数等;
Mysql:Error类:主要是异常处理,当有一条语句或者方法出现错误时,由Mysql:Error类处理。
通过这4个类中的方法,可以实现连接数据库、发送SQL语句、获取查询结果集、以及查询元数据以及异常处理等功能。
DBI模块操作数据库
连接数据库
要进行数据库的操作,首先必须连接数据库,也就是客户端向数据库服务器端发出连接请求,连接成功后就可以进行数据库操作了。在不需要操作数据库时,还需要先把数据库链接关闭。
打开数据库连接
require "dbi";
之后就可以使用DBI模块的connect方法连接数据库了。connect方法可以接受3个参数,分别是数据库连接地址、登录用户名和密码,语法格式如下:
dbh=DBI.connect("dbi:Mysql:dbName:host","username","password")
其中,数据库连接地址由4部分组成,分别是标志字符串“dbi”、驱动名称、数据库名称和主机地址;然后就是表示登录用户名和密码的字符串。
DBI的connect模块可以创建一个数据库连接对象,并同时打开连接。使用完该方法以后,如果连接成功,就可以直接调用相应的方法连接该对象。
关闭数据库连接
DBI模块中提供了一个disconnect方法关闭已经打开的数据库连接。disconnect方法不接受任何参数,直接使用打开的数据库连接对象调用该方法即可。
执行SQL语句
在Ruby的DBI模块中可以使用do方法或者execute方法执行SQL御酒,而在Mysql模块中使用query方法执行SQL语句。通过调用连接对象affected_rows方法可以返回受影响的行数。
使用fetch_row获取结果集
在使用query方法执行SQL语句时,如果该SQL语句有返回值,那么该query方法将返回一个Mysql:Result类实例。该实例对象将封装由SQL语句请求服务器得来的结果集,可以使用该对象提供的方法获取并迭代结果集中的内容。
其中最简单的就是使用fetch_row方法获取结果集。fetch_row是一个指针式的方法,它可以依次获取结果集中的每一行数据。也就是说,每次调用该方法都可以得到结果集中的一行数据,直到结果集的末尾。如果读取到结果集的末尾,将返回一个nil。
使用fetch_hash获取结果集
fetch_hash的作用与fetch_row相同都可以获取结果集中的行。不同的是fetch_row方法返回的是一个数组,所以用索引访问数组中的每一个元素;而fetch_hash方法可以获取一个Hash对象,可以使用键名访问该对象。
使用迭代器获取结果集
除了使用fetch_row和fetch_hash遍历结果集,还可以直接使用each迭代器获取结果集中的数据。
处理nil值
有时查询结果集中的某个字段的值是nil。这样在直接打印时,系统会默认将nil值忽略,这给人不友好的感觉。
其实处理这个问题非常简单,只需要在读取这些nil值的时候进行一些简单的判断,在数据为nil时将相应的数据转换成我们想要的结果。
处理特殊字符
在应用程序中,可能会需要向数据库中保存一些特殊的字符,如单引号、双引号或者分号等。但是这些字符在直接保存时会出现错误,因此就是使用Ruby中的escape_string方法来处理这些特殊的字符,然后再向数据库中保存就不会出现任何的问题了。
查询元数据
介绍使用Mysql::Result提供的实例方法来获取查询到的结果集的行数,列数和字段详细信息等数据。
获取行数和列数
Mysql::Result中提供了两个实例方法:num_rows方法和num_fields方法,它们可以用来分贝尔获取查询结果集中的行数和列数。
获取字段信息
使用Mysql::Result类的实例方法fetch_field还可以依次获取结果集中的字段。在Ruby中,结果集中的字段使用Mysql::Field类封装,我们可以使用Mysql::Field类提供的实例属性和方法获取字段信息。
提供了以下几个实例属性:
name:字段名称
table:所属表的名称
def:字段默认值
type:字段类型(编码)
length:字段长度
max_length:最大数据的长度
flags:字段标记
decimals:数据的小数位