Visual Basic 输入和输出
最后修改于 2023 年 10 月 18 日
本章专门介绍 Visual Basic 中的输入和输出。Visual Basic 中的输入和输出基于流。
流是用于处理输入和输出的对象。流是字节序列的抽象,例如文件、输入/输出设备、进程间通信管道或 TCP/IP 套接字。在 Visual Basic 中,我们有一个 Stream 类,它是所有流的抽象类。还有其他从 Stream 类派生的类,使编程变得更容易。
MemoryStream
MemoryStream 是一个处理计算机内存中数据的流。
Option Strict On
Imports System.IO
Module Example
Sub Main()
Dim ms As Stream = New MemoryStream(6)
ms.WriteByte(9)
ms.WriteByte(11)
ms.WriteByte(6)
ms.WriteByte(8)
ms.WriteByte(3)
ms.WriteByte(7)
ms.Position = 0
Dim rs As Integer
rs = ms.ReadByte()
Do While rs <> -1
Console.WriteLine(rs)
rs = ms.ReadByte()
Loop
ms.Close()
End Sub
End Module
我们使用 MemoryStream 将六个数字写入内存。然后我们读取这些数字并将它们打印到控制台。
Dim ms As Stream = New MemoryStream(6)
该行创建并初始化一个容量为六个字节的 MemoryStream 对象。
ms.Position = 0
我们使用 Position 属性将光标在流中的位置设置为开头。
ms.WriteByte(9) ms.WriteByte(11) ms.WriteByte(6) ...
WriteByte 方法将一个字节写入当前流的当前位置。
Do While rs <> -1 Console.WriteLine(rs) rs = ms.ReadByte() Loop
在这里,我们从流中读取所有字节并将它们打印到控制台。
ms.Close()
最后,我们关闭流。
$ dotnet run 9 11 6 8 3 7
StreamReader 和 StreamWriter
StreamReader 从字节流中读取字符。它默认为 UTF-8 编码。StreamWriter 将字符以特定编码写入流。
Option Strict On
Imports System.IO
Module Example
Sub Main()
Dim file As String
file = "languages"
Try
Dim stream As StreamReader
stream = New StreamReader(file)
Console.WriteLine(stream.ReadToEnd())
Catch e As IOException
Console.WriteLine("Cannot read file.")
End Try
End Sub
End Module
我们有一个名为 languages 的文件。我们从该文件中读取字符并将它们打印到控制台。
Dim stream As StreamReader stream = New StreamReader(file)
StreamReader 接受文件名作为参数。
Console.WriteLine(stream.ReadToEnd())
ReadToEnd 方法读取所有字符直到流的末尾。
$ cat languages Python Visual Basic PERL Java C C# $ dotnet run Python Visual Basic PERL Java C C#
我们在当前目录中有一个 languages 文件。我们将文件的所有行打印到控制台。
在下一个示例中,我们计算行数。
Option Strict On
Imports System.IO
Module Example
Sub Main()
Dim file As String
Dim count As Integer
file = "languages"
Try
Dim stream As StreamReader
stream = New StreamReader(file)
While Not (stream.ReadLine() Is Nothing)
count += 1
End While
Catch e As IOException
Console.WriteLine("Cannot read file.")
End Try
Console.WriteLine("There are {0} lines", count)
End Sub
End Module
计算文件中的行数。
While Not (stream.ReadLine() Is Nothing)
count += 1
End While
在 While 循环中,我们使用 ReadLine 方法从流中读取一行。它从流中返回一行,如果到达输入流的末尾,则返回 Nothing。
下面是使用 StreamWriter 的示例。
Option Strict On
Imports System.IO
Module Example
Sub Main()
Dim mstream As New MemoryStream()
Dim swriter As New StreamWriter(mstream)
swriter.Write("ZetCode, tutorials for programmers.")
swriter.Flush()
Dim sreader As New StreamReader(mstream)
Console.WriteLine(sreader.ReadToEnd())
sreader.Close()
End Sub
End Module
在前面的示例中,我们将字符写入内存。
Dim mstream As New MemoryStream()
创建了 MemoryStream。
Dim swriter As New StreamWriter(mstream)
StreamWriter 类将内存流作为参数。通过这种方式,我们将写入内存流。
swriter.Write("ZetCode, tutorials for programmers.")
swriter.Flush()
我们将一些文本写入写入器。Flush 清除当前写入器的所有缓冲区,并导致任何缓冲的数据被写入基础流。
Dim sreader As New StreamReader(mstream) Console.WriteLine(sreader.ReadToEnd())
现在我们创建一个流读取器的实例并读回我们写的所有内容。
FileStream
FileStream 类使用文件系统上文件的流。此类可用于从文件读取、写入文件、打开和关闭文件。
Option Strict On
Imports System.IO
Imports System.Text
Module Example
Sub Main()
Dim fstream As New FileStream("author", FileMode.Append)
Dim bytes As Byte() = New UTF8Encoding().GetBytes("Фёдор Михайлович Достоевский")
fstream.Write(bytes, 0, bytes.Length)
fstream.Close()
End Sub
End Module
我们将一些俄语西里尔字母的文本写入当前工作目录中的文件中。
Dim fstream As New FileStream("author", FileMode.Append)
创建了 FileStream 对象。第二个参数是模式,文件将以该模式打开。append 模式打开文件(如果存在)并定位到文件的末尾,或者创建一个新文件。
Dim bytes As Byte() = New UTF8Encoding().GetBytes("Фёдор Михайлович Достоевский")
我们从俄语 azbuka 中的文本创建一个字节数组。
fstream.Write(bytes, 0, bytes.Length)
我们将字节写入文件流。
XmlTextReader
我们可以使用流来读取 XML 数据。XmlTextReader 是在 Visual Basic 中读取 XML 文件的类。该类是前向只读的。
我们有以下 XML 测试文件。
<?xml version="1.0" encoding="utf-8" ?>
<languages>
<language>Python</language>
<language>Ruby</language>
<language>Javascript</language>
<language>C#</language>
</languages>
Option Strict On
Imports System.IO
Imports System.Xml
Module Example
Sub Main()
Dim file As String
file = "languages.xml"
Try
Dim xreader As New XmlTextReader(file)
xreader.MoveToContent()
Do While xreader.Read()
Select Case xreader.NodeType
Case XmlNodeType.Element
Console.Write(xreader.Name & ": ")
Case XmlNodeType.Text
Console.WriteLine(xreader.Value)
End Select
Loop
xreader.Close()
Catch e As IOException
Console.WriteLine("Cannot read file.")
Catch e As XmlException
Console.WriteLine("XML parse error")
End Try
End Sub
End Module
这个 Visual Basic 程序从先前指定的 XML 文件中读取数据并将其打印到终端。
Dim xreader As New XmlTextReader(file)
创建了 XmlTextReader 对象。它将文件名作为参数。
xreader.MoveToContent()
MoveToContent 方法移动到 XML 文件的实际内容。
Do While xreader.Read()
此行从流中读取下一个节点。
Case XmlNodeType.Element
Console.Write(xreader.Name & ": ")
Case XmlNodeType.Text
Console.WriteLine(xreader.Value)
在这里,我们打印元素名称和元素文本。
Catch e As XmlException
Console.WriteLine("XML parse error")
我们检查 XML 解析错误。
$ dotnet run language: Python language: Ruby language: Javascript language: C#
文件和目录
.NET framework 提供了其他类,我们可以使用它们来处理文件和目录。
File 类是一个更高级别的类,它具有用于文件创建、删除、复制、移动和打开的共享方法。这些方法使工作更容易。
Option Strict On
Imports System.IO
Module Example
Sub Main()
Try
Dim sw As StreamWriter
sw = File.CreateText("cars")
sw.WriteLine("Toyota")
sw.WriteLine("Skoda")
sw.WriteLine("BMW")
sw.WriteLine("Volkswagen")
sw.WriteLine("Volvo")
sw.Close()
Catch e As IOException
Console.WriteLine("IO error")
End Try
End Sub
End Module
在这个例子中,我们创建一个 cars 文件并将一些汽车名称写入其中。
sw = File.CreateText("cars")
CreateText 方法创建或打开一个文件用于写入 UTF-8 编码的文本。它返回一个 StreamWriter 对象。
sw.WriteLine("Toyota")
sw.WriteLine("Skoda")
...
我们将两行写入流。
Option Strict On
Imports System.IO
Module Example
Sub Main()
If File.Exists("cars")
Console.WriteLine(File.GetCreationTime("cars"))
Console.WriteLine(File.GetLastWriteTime("cars"))
Console.WriteLine(File.GetLastAccessTime("cars"))
End If
File.Copy("cars", "newcars")
End Sub
End Module
在第二个示例中,我们展示了 File 类的其他五个共享方法。
If File.Exists("cars")
Exists 方法确定指定的文件是否存在。
Console.WriteLine(File.GetCreationTime("cars"))
Console.WriteLine(File.GetLastWriteTime("cars"))
Console.WriteLine(File.GetLastAccessTime("cars"))
我们获取指定文件的创建时间、上次写入时间和上次访问时间。
File.Copy("cars", "newcars")
Copy 方法复制文件。
My.Computer.FileSystem 是一个对象,它提供了用于处理驱动器、文件和目录的属性和方法。
Option Strict On
Imports System.IO
Module Example
Sub Main()
Try
My.Computer.FileSystem.CreateDirectory("temp")
My.Computer.FileSystem.CreateDirectory("newdir")
My.Computer.FileSystem.MoveDirectory("temp", "temporary")
Catch e As IOException
Console.WriteLine("Cannot create directories")
Console.WriteLine(e.Message)
End Try
End Sub
End Module
我们使用上述对象中的两种方法。
My.Computer.FileSystem.CreateDirectory("temp")
CreateDirectory 方法创建一个新目录。
My.Computer.FileSystem.MoveDirectory("temp", "temporary")
MoveDirectory 方法为指定目录提供一个新名称。
DirectoryInfo 和 Directory 具有用于创建、移动和枚举目录和子目录的方法。
Option Strict On
Imports System.IO
Module Example
Dim subDir As IO.DirectoryInfo
Dim dir As New IO.DirectoryInfo("../io")
Dim fileName As String
Dim files As String() = Directory.GetFiles("../io")
Dim dirs As DirectoryInfo() = dir.GetDirectories()
Sub Main()
For Each subDir In dirs
Console.WriteLine(subDir.Name)
Next
For Each fileName In files
Console.WriteLine(fileName)
Next
End Sub
End Module
我们使用 DirectoryInfo 类来遍历特定目录并打印其内容。
Dim dir As New IO.DirectoryInfo("../io")
我们展示了这个目录 (io) 的内容。
Dim files As String() = Directory.GetFiles("../io")
我们使用共享的 GetFiles 方法获取 io 目录的所有文件。
Dim dirs As DirectoryInfo() = dir.GetDirectories()
我们获取所有目录。
For Each subDir In dirs
Console.WriteLine(subDir.Name)
Next
在这里,我们循环遍历目录并将它们的名称打印到控制台。
For Each fileName In files
Console.WriteLine(fileName)
Next
在这里,我们循环遍历文件数组并将它们的名称打印到控制台。
$ dotnet run newdir temp temporary ../io/append.vb ../io/append.vb~ ../io/author ../io/cars ...
在本章中,我们介绍了 Visual Basic 中的输入和输出操作。