深入解析ASP核心技术
上QQ阅读APP看书,第一时间看更新

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 各种数据写入方法