1.7.3 操作文本流
得到一个TextStream对象之后,就可以通过它进行文件的读取和写入操作了。当然,这还取决于文件的打开方式。
下面介绍一下TextStream对象的属性和方法。
1. 与位置相关的属性
在TextStream对象的眼里,文本文件是由一行一行的数据组成的,而每一行又是由一列一列组成的,这个一列就是指一个字符。不管是读取还是写入,都是以字符为单位或以行为单位的。伴随着读取或写入的操作,文件指针也在移动着,它标示着当前操作的位置。
下面看一下几个与位置相关的属性。
❑Line属性,指针当前所在的行号,从1开始。
❑Column属性,指针当前所在的列号,对每一行来说,都是从1开始的。
❑AtEndOfLine属性,如果指针位于一行的末尾,该属性返回True,否则返回False。
❑AtEndOfStream属性,如果指针位于文件的末尾,该属性返回True,否则返回False。
AtEndOfLine和AtEndOfStream属性只在只读方式时才可以用。
2. 读取数据的方法
读取数据相关的方法有以下几个:
❑Read方法,读取指定个数的字符,参数是字符个数。
❑ReadLine方法,读取一行数据,不包括行分隔符,指针移动到下一行第一列。
❑ReadAll方法,读取所有数据,指针移动到文件末尾。
❑Skip方法,跳过指定个数的字符,参数是字符个数。
❑SkipLine方法,跳过一行数据,指针移动到下一行第一列。
不管是读取数据还是跳过数据,它们都是从当前位置开始操作的。
对于ReadAll方法来说,如果指针位于文件开头,那么它的作用就是读取文件的所有数据;如果指针位于其他位置,则是从该位置开始读取剩余的所有数据。
ReadLine方法和SkipLine方法,都是从当前位置开始,查找下一个行分隔符,ReadLine方法会读取中间这段数据,然后跳过行分隔符;而SkipLine方法会直接跳过行分隔符,不会读取数据。这就意味着,如果指针位于一行的中间位置,那么这两个方法读取或跳过的仅仅是当前这一行而已。再极端一点,如果指针恰好位于行末尾,即行分隔符之前的位置上,那么ReadLine方法读取的就是空字符串。
对于Read方法和Skip方法来说,行分隔符仅仅是两个字符而已(指CR和LF,当然,也可能是一个字符CR或LF),与其他字符没有什么不同,该读就读,该跳就跳。所以,这两个方法是可以读取或跳过多行数据的。
TextStream对象读取数据,只能单向进行,指针无法回头,过去了就过去了,无法再重来第二遍。想重新读取数据,只能再次打开文件。
以上几个方法只有在以只读方式打开文件时才可以使用。
下例将演示各种数据读取方法。
TextStreamPosition.asp
<%@codepage=936%> <% Response.Charset = "GBK" '输出指针位置信息的方法 Sub PrintInfo(file) Response.Write file.Line & "行" & file.Column & "列," Response.Write "行末尾:" & txtFile.AtEndOfLine & ", " Response.Write "文件末尾:" & txtFile.AtEndOfStream &"<hr>" End Sub '当前目录下的TextStreamPositionTest.txt filePath = Server.MapPath(".") & "\TextStreamPositionTest.txt" Set fso = CreateObject("Scripting.FileSystemObject") '打开文本文件(只读方式,不创建新文件,使用Unicode编码) Set txtFile = fso.OpenTextFile(filePath,1, False, -1) '读取文件中的所有数据 Response.Write "所有数据:<br>" Response.Write "<textarea rows=4>" & txtFile.ReadAll() & "</textarea><hr>" '关闭TextStream对象 txtFile.Close '再次打开文件 Set txtFile = fso.OpenTextFile(filePath,1, False, -1) '输出指针位置信息 Call PrintInfo(txtFile) '读取7个字符 Response.Write "<textarea rows=2>" & txtFile.Read(7) & "</textarea>" Call PrintInfo(txtFile) '读取5个字符 Response.Write "<textarea rows=2>" & txtFile.Read(5) & "</textarea>" Call PrintInfo(txtFile) '读取一行数据 Response.Write "<textarea rows=2>" & txtFile.ReadLine() & "</textarea>" Call PrintInfo(txtFile) '读取一行数据 Response.Write "<textarea rows=2>" & txtFile.ReadLine() & "</textarea>" Call PrintInfo(txtFile) '跳过一行数据
txtFile.SkipLine() '读取剩余所有数据 Response.Write "<textarea rows=3>" &txtFile.ReadAll() & "</textarea>" Call PrintInfo(txtFile) '关闭并释放 txtFile.Close Set fso = Nothing %>
运行结果如图1-7所示。
图1-7 各种数据读取方法
3. 写入数据的方法
写入数据的方法有以下几个:
❑Write方法,将字符串写入文件,参数是字符串。
❑WriteLine方法,将字符串写入文件,然后写入行分隔符,如果省略参数,则只写入行分隔符。
❑WriteBlankLines方法,写入指定个数的行分隔符。
这几个方法都是在写入或追加方式时才可以使用。
下例将演示各种数据写入方法。
TextStreamWrite.asp
<%@codepage=936%> <%
Response.Charset = "GBK" '当前目录下的TextStreamWriteTest.txt filePath = Server.MapPath(".") & "\TextStreamWriteTest.txt" Set fso = CreateObject("Scripting.FileSystemObject") '创建文本文件(覆盖同名文件,使用Unicode编码) Set txtFile = fso.CreateTextFile(filePath, True, True) '写入数据 txtFile.Write("Hello W") txtFile.Write("orld.") '写入一个行分隔符 txtFile.WriteLine() '写入一行数据 txtFile.WriteLine("你好,世界。") '写入两个空行 txtFile.WriteBlankLines(2) '写入数据 txtFile.Write("Over.") '关闭TextStream txtFile.Close() Set fso = Nothing %>
生成的文件内容如图1-8所示。
图1-8 各种数据写入方法