向随机访问文件中写入数据的过程与从中读取数据非常类似。首先需要创建一个字节数组;最简单的办法是首先构建要写入文件的字符数组。然后使用Encoder对象将其转换为字节数组,其用法非常类似于Decoder对象。最后调用Write()方法,将字节数组传送到文件中。
下面构建一个简单的示例演示其过程。
试一试将数据写入随机访问文件:WriteRle\Program.cs
(1)在C:\BeginningCSharp7\Chapter20目录中创建一个新的控制台应用程序WriteFile。
(2)在Program.cs文件顶部添加下面的using指令:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
(3)在Main()方法中添加下面的代码:
static void Main(string[] args)
{
byte[] byteData;
char[] charData;
try
{
FileStream aFile = new FileStrearn fTemp.txt", FileMode.Create);
charData = "My pink half of the drainpipe.u.ToCharArray();
byteData = new byte[charData,Length];
Encoder e = Encoding.UTF8.GetEncoder();
e.GetBytes(charData, 0, charData.Length, byteData, 0, true};
// Move file pointer to beginning of file.
aFile.Seek(0, SeekOrigin.Begin);
aFile.Write(byteData, 0, byteData.Length};
}
catch (IOException ex)
{
WriteLine ("An 10 exception has been thrown!");
WriteLine(ex.ToString());
ReadKey();
return;
}
(4)运行该应用程序。它在短暂运行后将会关闭。
(5)导航到应用程序目录——在目录中己经保存了文件,因为我们使用了相对路径。目录位于 WriteFile\bin\Debug文件夹中。打开Temp.txt文件。可在文件中看到文本。
示例说明
此应用程序打开自己目录中的文件,井在文件中写入了一个简单字符串。这个示例的结构非常类似于前面的示例,只是用Write()替代了 Read(),用Encoder替代了 Decoder。
下面的代码行使用String类的ToCharAmiyO方法,创建了字符数组。因为C#中的所有事物都是对象,文本“My pink half of the drainpipe.”实际上是一个String对象(尽管有点儿怪),所以甚至可在字符串上调用这些静态方法。
CharData = r,My pink half of the drainpipe.ToCharArray ();
下面的代码行显示了如何将字符数组转换为FileStream对象需要的正确字节数组。
Encoder-e = Encoding.UTF8.GetEncoder();
e.GetBytes(charData, 0, charData.Length, byteData, 0, true);
这次,要基于UTT-8编码方法来创建Encoder对象。也可将Unicode用于解码,此时在写入流之前,需要将字符数据编码为正确的字节格式。在GetBytes()方法中可以完成这些工作,它可将字符数组转换为字节数组。GetBytes()方法将字符数组作为第一个参数(本例中的charData),将该数组中起始位置的下标作为第二个参数(0表示数组的开头)。第三个参数是要转换的字符数量(charDataLength, charData数组中元素的个数)。第四个参数是在其中放入数据的字节数组(byteData),第五个参数是在字节数组中开始写入位置的索引(0表示byteData 数组的开头)。
最后一个参数决定在结束后Encwler对象是否应该更新其状态,这反映了一个事实:Encoder对象在内存中保持记录它原来在字节数组中的位置。这有助于以后调用Encoder对象,但是当只调用一次时,这就没什么意义。最后对Encoder的调用必须将此参数设置为true,以清空其内存,释放对象,用于垃圾回收。
此后使用WriteO方法向FileStream写入字节数组就变得非常简单:
aFile.Seek(0, SeekOrigin.Begin);
aFile.Write(byteData, 0, byteData.Length);
与ReadC)方法一样,Write()方法也有三个参数:包含要写入文件流的数据的字节数组,开始写入的数组索引和要写入的字节数。
已有 22658 名学员学习以下课程通过考试
最需教育客户端 软件问题一手掌握
去 App Store 免费下载 iOS 客户端
点击加载更多评论>>