在操作变量和常量时这些值都是存放到内存中的,当程序运行结束后使用的数据全部被删除。如果想要长久保存应用程序中的数据,可以选用文件或数据库来存储。文件操作类在System.IO
命名空间中,包括Driveinfo类、Directory类、Directoryinfo类、File类、Filelnfo类、Path类等。
查看计算机驱动器信息主要包括查看磁盘的空间、磁盘的文件格式、磁盘的卷标等。
Driveinfo类是一个密封类,即不能被继承,其仅提供了一个构造方法,语法形式如下。
Driveinfo(string driveName)
dirveName参数是指有效驱动器路径或驱动器号,Null值是无效的。
// 创建Driveinfo类的实例
// 磁盘的盘符是C的驱动器实例,通过该实例能获取该盘符下的信息,包括磁盘的名称、磁盘的格式
Driveinfo driveInfo=new Driveinfo("C");
属性或方法 | 作用 |
---|---|
AvailableFreeSpace | 只读属性,获取驱动器上的可用空闲空间量(以字节为单位) |
DriveFormat | 只读属性,获取文件系统格式的名称,例如NTFS或FAT32 |
DriveType | 只读属性,获取驱动器的类型,例如CD-ROM、可移动驱动器、网络驱动器或固定驱动器 |
IsReady | 只读属性,获取一个指示驱动器是否已准备好的值,True为准备好了, False为未准备好 |
Name | 只读属性,获取驱动器的名称,例如C:\ |
RootDirectory | 只读属性,获取驱动器的根目录 |
TotalFreeSpace | 只读属性,获取驱动器上的可用空闲空间总量(以字节为单位) |
TotalSize | 只读属性,获取驱动器上存储空间的总大小(以字节为单位) |
VolumeLabel | 属性, 获取或设置驱动器的卷标 |
Driveinfo[] GetDrives() | 静态方法,检索计算机上所有逻辑驱动器的驱动器名称 |
using System;
using System.IO;
class Program
{
//获取D盘中的驱动器类型、名称、文件系统名称、可用空间以及总空间大小
static void Main(string[] args)
{
DriveInfo driveInfo = new DriveInfo("D");
Console.WriteLine("驱动器的名称:" + driveInfo.Name);
Console.WriteLine("驱动器类型:" + driveInfo.DriveType);
Console.WriteLine("驱动器的文件格式:" + driveInfo.DriveFormat);
Console.WriteLine("驱动器中可用空间大小:" + driveInfo.TotalFreeSpace);
Console.WriteLine("驱动器总大小:" + driveInfo.TotalSize);
}
}
驱动器类型中的Fixed值代表的本地磁盘、驱动器中可用空间的大小和总大小的单位是字节(B)。
using System;
using System.IO;
class Program
{
// 获取计算机中所有驱动器的名称和文件格式
static void Main(string[] args)
{
DriveInfo[] driveInfo = DriveInfo.GetDrives();
foreach (DriveInfo d in driveInfo)
{
if (d.IsReady)
{
Console.WriteLine("驱动器名称:" + d.Name);
Console.WriteLine("驱动器的文件格式" + d.DriveFormat);
}
}
}
}
Directoryinfo类是对文件夹进行操作的,构造方法的语法形式如下。
DirectoryInfo(string path)
path参数用于指定文件的目录,即路径。
DirectoryInfo directoryInfo = new DirectoryInfo("D:\\Download");
路径中如果使用\,要使用转义字符来表示,即\\;或者在路径中将\字符换成/。
属性或方法 | 作用 |
---|---|
Exists | 只读属性,获取指示目录是否存在的值 |
Name | 只读属性,获取Directorylnfo实例的目录名称 |
Parent | 只读属性,获取指定的子目录的父目录 |
Root | 只读属性,获取目录的根部分 |
void Create() | 创建目录 |
DirectoryInfo CreateSubdirectory(string path) | 在指定路径上创建一个或多个子目录 |
void Delete() | 如果目录中为空,则将目录删除 |
void Delete(bool recursive) | 指定是否删除子目录和文件,如果recursive 参数的值为True,则删除,否则不删除 |
IEnumerable EnumerateDirectories() | 返回当前目录中目录信息的可枚举集合 |
IEnumerable EnumerateDirectories(string searchPattern) | 返回与指定的搜索模式匹配的目录信息的可枚举集合 |
IEnumerable EnumerateFiles() | 返回当前目录中的文件信息的可枚举集合 |
IEnumerable EnumerateFiles(string searchPattern) | 返回与搜索模式匹配的文件信息的可枚举集合 |
IEnumerable EnumerateFileSystemInfos() | 返回当前目录中的文件系统信息的可枚举集合 |
IEnumerable EnumerateFileSystemInfos(string searchPattern) | 返回与指定的搜索模式匹配的文件系统信息的可枚举集合 |
DirectoryInfo[] GetDirectories() | 返回当前目录的子目录 |
DirectoryInfo[] GetDirectories(string searchPattern) | 返回匹配给定的搜索条件的当前目录 |
FileInfo[] GetFiles() | 返回当前目录的文件列表 |
FileInfo[] GetFiles(string searchPattern) | 返回当前目录中与给定的搜索模式匹配的文件列表 |
FileSystemInfo[] GetFileSystemInfos() | 返回所有文件和目录的子目录中的项 |
FileSystemInfo[] GetFileSystemInfos(string searchPattern) | 返回与指定的搜索条件匹配的文件和目录的子目录中的项 |
void MoveTo(string destDirName) | 移动DirectoryInfo实例中的目录到新的路径 |
using System;
using System.Collections.Generic;
using System.IO;
class Program
{
static void Main(string[] args)
{
DirectoryInfo directoryInfo = new DirectoryInfo("D:\\test");
// 创建文件夹
directoryInfo.Create();
directoryInfo.CreateSubdirectory("test01");
directoryInfo.CreateSubdirectory("test02");
// 查看文件夹,EnumerateDirectories方法只用于检索文件夹,不能检索文件
IEnumerable dir = directoryInfo.EnumerateDirectories();
foreach (var v in dir)
{
Console.WriteLine(v.Name);
}
// 删除文件夹
// directoryInfo.Delete(true);
}
}
如果要删除一个非空文件夹,则要使用Delete(True)
方法将文件夹中的文件一并删除,否则会岀现“文件夹不为空”的异常。
Directory类也是对文件夹进行操作的,它是一个静态类,不能创建该类的实例,直接通过类名.类成员
的形式调用其属性和方法。
Directory类省去了创建类实例的步骤,其他操作也与Directoryinfo类似。
using System;
using System.IO;
class Program
{
static void Main(string[] args)
{
//在D盘下创建test文件夹
Directory.CreateDirectory("D:\\test");
FileInfo fileInfo = new FileInfo("D:\\test\\test1.txt");
if (!fileInfo.Exists)
{
//创建文件
fileInfo.Create().Close();
Console.WriteLine("创建test文件夹成功");
}
fileInfo.Attributes = FileAttributes.Normal;//设置文件属性
Console.WriteLine("文件路径:" + fileInfo.Directory);
Console.WriteLine("文件名称:" + fileInfo.Name);
Console.WriteLine("文件是否只读:" + fileInfo.IsReadOnly);
Console.WriteLine("文件大小:" + fileInfo.Length);
//先创建code-1文件夹
//将文件移动到code-1文件夹下
Directory.CreateDirectory("D:\\test01");
Console.WriteLine("创建test01文件夹成功");
//判断目标文件夹中是否含有文件test1.txt
FileInfo newFileInfo = new FileInfo("D:\\test01\\test1.txt");
if (!newFileInfo.Exists)
{
//移动文件到指定路径
fileInfo.MoveTo("D:\\test01\\test1.txt");
Console.WriteLine("移动文件到test01文件夹中");
}
}
}
FileInfo类是用来操作文件的,构造方法的语法形式如下。
FileInfo(string fileName)
fileName参数用于设置文件的路径。
属性或方法 | 作用 |
---|---|
Directory | 只读属性,获取父目录的实例 |
DirectoryName | 只读属性,获取表示目录的完整路径的字符串 |
Exists | 只读属性,获取指定的文件是否存在,若存在返回True,否则返回False |
IsReadOnly | 属性,获取或设置指定的文件是否为只读的 |
Length | 只读属性,获取文件的大小 |
Name | 只读属性,获取文件的名称 |
Filelnfo CopyTo(string destFileName) | 将现有文件复制到新文件,不允许覆盖现有文件 |
Filelnfo CopyTo(string destFileName, bool overwrite) | 将现有文件复制到新文件,允许覆盖现有文件 |
FileStream Create() | 创建文件 |
void Delete() | 删除文件 |
void MoveTo(string destFileName) | 将指定文件移到新位置,提供要指定新文件名的选项 |
Filelnfo Replace(string destinationFileName, string destinationBackupFileName) | 使用当前文件对象替换指定文件的内容,先删除原始文件, 再创建被替换文件的备份 |
using System;
using System.IO;
class Program
{
static void Main(string[] args)
{
//在D盘下创建test文件夹
Directory.CreateDirectory("D:\\test");
FileInfo fileInfo = new FileInfo("D:\\test\\test1.txt");
if (!fileInfo.Exists)
{
//创建文件
fileInfo.Create().Close();
}
fileInfo.Attributes = FileAttributes.Normal;//设置文件属性
Console.WriteLine("文件路径:" + fileInfo.Directory);
Console.WriteLine("文件名称:" + fileInfo.Name);
Console.WriteLine("文件是否只读:" + fileInfo.IsReadOnly);
Console.WriteLine("文件大小:" + fileInfo.Length);
//先创建code-1文件夹
//将文件移动到code-1文件夹下
Directory.CreateDirectory("D:\\test01");
//判断目标文件夹中是否含有文件test1.txt
FileInfo newFileInfo = new FileInfo("D:\\test01\\test1.txt");
if (!newFileInfo.Exists)
{
//移动文件到指定路径
fileInfo.MoveTo("D:\\test01\\test1.txt");
}
}
}
File类也是用来操作文件的,它是一个静态类,其成员也是静态的,通过类名.类成员
的形式调用其属性和方法。
File类中获取或设置文件信息的常用方法如下表所示。
属性或方法 | 作用 |
---|---|
DateTime GetCreationTime(string path) | 返回指定文件或目录的创建日期和时间 |
DateTime GetLastAccessTime(string path) | 返回上次访问指定文件或目录的日期和时间 |
DateTime GetLastWriteTime(string path) | 返回上次写入指定文件或目录的日期和时间 |
void SetCreationTime(string path, DateTime creationTime) | 设置创建该文件的日期和时间 |
void SetLastAccessTime(string path, DateTime lastAccessTime) | 设置上次访问指定文件的日期和时间 |
void SetLastWriteTime(string path, DateTime lastWriteTime) | 设置上次写入指定文件的日期和时间 |
using System;
using System.IO;
class Program
{
static void Main(string[] args)
{
//在D盘下创建code文件夹
Directory.CreateDirectory("D:\\test");
Directory.CreateDirectory("D:\\test01");
string path = "D:\\test\\test1.txt";
//创建文件
FileStream fs = File.Create(path);
//获取文件信息
Console.WriteLine("文件创建时间:" + File.GetCreationTime(path));
Console.WriteLine("文件最后被写入时间:" + File.GetLastWriteTime(path));
//关闭文件流
fs.Close();
//设置目标路径
string newPath = "D:\\test01\\test1.txt";
//判断目标文件是否存在
bool flag = File.Exists(newPath);
if (flag)
{
//删除文件
File.Delete(newPath);
}
File.Move(path, newPath);
}
}
Path类主要用于文件路径的一些操作,它是一个静态类。
属性或方法 | 作用 |
---|---|
string ChangeExtension(string path, string extension) | 更改路径字符串的扩展名 |
string Combine(params string[] paths) | 将字符串数组组合成一个路径 |
string Combine(string path1, string path2) | 将两个字符串组合成一个路径 |
string GetDirectoryName(string path) | 返回指定路径字符串的目录信息 |
string GetExtension(string path) | 返回指定路径字符串的扩展名 |
string GetFileName(string path) | 返回指定路径字符串的文件名和扩展名 |
string GetFileNameWithoutExtension(string path) | 返回不具有扩展名的指定路径字符串的文件名 |
string GetFullPath(string path) | 返回指定路径字符串的绝对路径 |
char[] GetInvalidFileNameChars() | 获取包含不允许在文件名中使用的字符的数组 |
char[] GetInvalidPathChars() | 获取包含不允许在路径名中使用的字符的数组 |
string GetPathRoot(string path) | 获取指定路径的根目录信息 |
string GetRandomFileName() | 返回随机文件夹名或文件名 |
string GetTempPath() | 返回当前用户的临时文件夹的路径 |
bool HasExtension(string path) | 返回路径是否包含文件的扩展名 |
bool IsPathRooted(string path) | 返回路径字符串是否包含根 |
using System;
using System.IO;
class Program
{
static void Main(string[] args)
{
Console.WriteLine("请输入一个文件路径:");
string path = Console.ReadLine();
Console.WriteLine("不包含扩展名的文件名:" + Path.GetFileNameWithoutExtension(path));
Console.WriteLine("文件扩展名:" + Path.GetExtension(path));
Console.WriteLine("文件全名:" + Path.GetFileName(path));
Console.WriteLine("文件路径:" + Path.GetDirectoryName(path));
//更改文件扩展名,未进行保存
string newPath = Path.ChangeExtension(path, "doc");
Console.WriteLine("更改后的文件全名:" + Path.GetFileName(newPath));
}
}
流就是一个类的对象,很多文件的输入输出操作都以类的成员函数的方式来提供。
计算机中的流其实是一种信息的转换。它是一种有序流,因此相对于某一对象,通常我们把对象接收外界的信息输入(Input)称为输入流,相应地从对象向外 输出(Output)信息为输出流,合称为输入/输出流(I/O Streams)。
对象间进行信息或者数据的交换时总是先将对象或数据转换为某种形式的流,再通过流的传输,到达目的对象后再将流转换为对象数据。所以, 可以把流看作是一种数据的载体,通过它可以实现数据交换和传输。
流所在的命名空间也是System.IO
,主要包括文本文件的读写、图像和声音文件的读写、二进制文件的读写等。在System.IO
命名空间中提供了多种类,用于进行文件和数据流的读写操作。要使用这些类,需要在程序的开头包含语句using System.IO
。
StreamReader类用于从流中读取字符串,它继承自 TextReader 类。
构造方法 | 说明 |
---|---|
StreamReader(Stream stream) | 为指定的流创建StreamReader类的实例 |
StreamReader(string path) | 为指定路径的文件创建StreamReader类的实例 |
StreamReader(Stream stream, Encoding encoding) | 用指定的字符编码为指定的流初始化StreamReader类的一个新实例 |
StreamReader(string path, Encoding encoding) | 用指定的字符编码为指定的文件名初始化StreamReader类的一个新实例 |
StreamReader类中的常用属性和方法如下表所示。
属性或方法 | 作用 |
---|---|
Encoding CurrentEncoding | 只读属性,获取当前流中使用的编码方式 |
bool EndOfStream | 只读属性,获取当前的流位置是否在流结尾 |
void Close() | 关闭流 |
int Peek() | 获取流中的下一个字符的整数,如果没有获取到字符, 则返回-1 |
int Read() | 获取流中的下一个字符的整数 |
int Read(char[] buffer, int index, int count) | 从指定的索引位置开始将来自当前流的指定的最多字符读到缓冲区 |
string ReadLine() | 从当前流中读取一行字符并将数据作为字符串返回 |
string ReadToEnd() | 读取来自流的当前位置到结尾的所有字符 |
using System;
using System.IO;
class Program
{
static void Main(string[] args)
{
//定义文件路径
string path = @"D:\\test01\\test1.txt";
//创建 StreamReader 类的实例
StreamReader streamReader = new StreamReader(path);
//判断文件中是否有字符
while (streamReader.Peek() != -1)
{
//读取文件中的一行字符
string str = streamReader.ReadLine();
Console.WriteLine(str);
}
streamReader.Close();
}
}
StreamWriter类用于向流中写入数据。
构造方法 | 说明 |
---|---|
StreamWriter(Stream stream) | 为指定的流创建 StreamWriter 类的实例 |
StreamWriter(string path) | 为指定路径的文件创建 StreamWriter 类的实例 |
StreamWriter(Stream stream, Encoding encoding) | 用指定的字符编码为指定的流初始化 StreamWriter 类的一个新实例 |
StreamWriter(string path, Encoding encoding) | 用指定的字符编码为指定的文件名初始化 StreamWriter 类的一个新实例 |
StreamWriter类中常用的属性和方法如下表所示。
属性或方法 | 作用 |
---|---|
bool AutoFlush | 属性,获取或设置是否自动刷新缓冲区 |
Encoding Encoding | 只读属性,获取当前流中的编码方式 |
void Close() | 关闭流 |
void Flush() | 刷新缓冲区 |
void Write(char value) | 将字符写入流中 |
void WriteLine(char value) | 将字符换行写入流中 |
Task WriteAsync(char value) | 将字符异步写入流中 |
Task WriteLineAsync(char value) | 将字符异步换行写入流中 |
Write、WriteAsync、WriteLineAsync方法还有很多不同类型写入的重载方法。
using System;
using System.IO;
class Program
{
static void Main(string[] args)
{
string path = @"D:\\test01\\test1.txt";
//创建StreamWriter 类的实例
StreamWriter streamWriter = new StreamWriter(path);
//向文件中写入姓名
streamWriter.WriteLine("张三");
//向文件中写入手机号
streamWriter.WriteLine("12354361358");
//刷新缓存
streamWriter.Flush();
//关闭流
streamWriter.Close();
}
}
写入的数据会覆盖文本的内容。
FileStream类主要用于文件的读写,不仅能读写普通的文本文件,还可以读取图像文件、声音文件等不同格式的文件。
在创建 FileStream 类的实例时还会涉及多个枚举类型的值, 包括FileAccess、FileMode、FileShare、FileOptions等。
FileAccess 枚举类型主要用于设置文件的访问方式,具体的枚举值如下。
FileMode 枚举类型主要用于设置文件打开或创建的方式,具体的枚举值如下。
FileShare 枚举类型主要用于设置多个对象同时访问同一个文件时的访问控制,具体的枚举值如下。
FileOptions 枚举类型用于设置文件的高级选项,包括文件是否加密、访问后是否删除等,具体的枚举值如下。
FileStream类的构造方法如下表所示。
构造方法 | 说明 |
---|---|
FileStream(string path, FileMode mode) | 使用指定路径的文件、文件模式创建 FileStream 类的实例 |
FileStream(string path, FileMode mode, FileAccess access) | 使用指定路径的文件、文件打开模式、文件访问模式创建 FileStream 类的实例 |
FileStream(string path, FileMode mode, FileAccess access, FileShare share) | 使用指定的路径、创建模式、读写权限和共享权限创建 FileStream 类的一个新实例 |
FileStream(string path, FileMode mode, FileAccess access, FileShare share, int bufferSize, FileOptions options) | 使用指定的路径、创建模式、读写权限和共享权限、其他 文件选项创建 FileStream 类的实例 |
string path = "D:\\test.txt";
FileStream fileStream1 = new FileStream(path, FileMode.Open);
FileStream fileStream2 = new FileStream(path, FileMode.Open, FileAccess.Read);
FileStream fileStream3 = new FileStream(path, FileMode.Open, FileAccess.ReadWrite, FileShare.Read);
FileStream fileStream4 = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, 10, FileOptions.None);
FileStream类中常用的属性和方法如下图所示。
属性或方法 | 作用 |
---|---|
bool CanRead | 只读属性,获取一个值,该值指示当前流是否支持读取 |
bool CanSeek | 只读属性,获取一个值,该值指示当前流是否支持查找 |
bool CanWrite | 只读属性,获取一个值,该值指示当前流是否支持写入 |
bool IsAsync | 只读属性,获取一个值,该值指示 FileStream 是异步还 是同步打开的 |
long Length | 只读属性,获取用字节表示的流长度 |
string Name | 只读属性,获取传递给构造方法的 FileStream 的名称 |
long Position | 属性,获取或设置此流的当前位置 |
int Read(byte[] array, int offset, int count) | 从流中读取字节块并将该数据写入给定缓冲区中 |
int ReadByte() | 从文件中读取一个字节,并将读取位置提升一个字节 |
long Seek(lorig offset, SeekOrigin origin) | 将该流的当前位置设置为给定值 |
void Lock(long position, long length) | 防止其他进程读取或写入System.IO.FileStream |
void Unlock(long position, long length) | 允许其他进程访问以前锁定的某个文件的全部或部分 |
void Write(byte[] array, int offset, int count) | 将字节块写入文件流 |
void WriteByte(byte value) | 将一个字节写入文件流中的当前位置 |
using System;
using System.IO;
using System.Text;
class Program
{
static void Main(string[] args)
{
//定义文件路径
string path = @"D:\\test01\\test1.txt";
//创建 FileStream 类的实例
FileStream fileStream = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
//定义学号
string msg = "123456";
//将字符串转换为字节数组,需要引入System.Text
byte[] bytes = Encoding.UTF8.GetBytes(msg);
//向文件中写入字节数组
fileStream.Write(bytes, 0, bytes.Length);
//刷新缓冲区
fileStream.Flush();
//关闭流
fileStream.Close();
//定义文件路径
string path1 = @"D:\\test01\\test1.txt";
//判断是否含有指定文件
if (File.Exists(path))
{
FileStream fileStream1 = new FileStream(path1, FileMode.Open, FileAccess.Read);
//定义存放文件信息的字节数组
byte[] bytes1 = new byte[fileStream1.Length];
//读取文件信息
fileStream1.Read(bytes1, 0, bytes.Length);
//将得到的字节型数组重写编码为字符型数组
char[] c = Encoding.UTF8.GetChars(bytes1);
Console.WriteLine("学生的学号为:");
//输出学生的学号
Console.WriteLine(c);
//关闭流
fileStream1.Close();
}
else
{
Console.WriteLine("您查看的文件不存在!");
}
}
}
FileMode.Open
模式下,写入的数据会覆盖文件的内容。如果写入的数据为中文,bytes数组的长度将不够用,改成使用byte[] bytes= Encoding.UTF8.GetBytes(message);
的方式将数据从字符串类型转换为字节类型。
BinaryReader类用于以二进制形式读取数据,构造方法有3种。
// 1.
BinaryReader(Stream input) //input参数是输入流。
// 2.
BinaryReader(Stream input, Encoding encoding) //input是输入流,encoding是编码方式
// 3.
BinaryReader(Stream input, Encoding encoding, bool leaveOpen) //input是输入流,encoding是编码方式,leaveOpen是在流读取后是否包括流的打开状态
//创建文件流的实例
FileStream fileStream = new FileStream("D:\\code\\test.txt", FileMode.Open);
BinaryReader binaryReader1 = new BinaryReader(fileStream);
BinaryReader binaryReader2 = new BinaryReader(fileStream, Encoding.UTF8);
BinaryReader binaryReader3 = new BinaryReader(fileStream, Encoding.UTF8, true);
BinaryReader类中的常用属性和方法如下表所示。
属性或方法 | 作用 |
---|---|
int Read() | 从指定的流中读取字符 |
int Read(byte[] buffer, int index, int count) | index为字节数组buffer中的起始点,从流中读取count个字节 |
int Read(char[] buffer, int index, int count) | index为字符数组buffer的起始点,从流中读取count个字符 |
bool ReadBoolean() | 从当前流中读取Boolean值,并使该流的当前位置提升1个字节 |
byte ReadByte() | 从当前流中读取下一个字节,并使流的当前位置提升1个字节 |
byte[] ReadBytes(int count) | 从当前流中读取指定的字节数写入字节数组中,并将当前位置前移相应的字节数 |
char ReadChar() | 从当前流中读取下一个字符,并根据所使用的Encoding和从流中读取的特定字符提升流的当前位置 |
char[] ReadChars(int count) | 从当前流中读取指定的字符数,并以字符数组的形式返回数据,然后根据所使用的Encoding和从流中读取的特定字符将当前位置前移 |
decimal ReadDecimal() | 从当前流中读取十进制数值,并将该流的当前位置提升16个字节 |
double ReadDouble() | 从当前流中读取8字节浮点值,并使流的当前位置提升8个字节 |
short ReadInt16() | 从当前流中读取2字节有符号整数,并使流的当前位置提升2个字节 |
int ReadInt32() | 从当前流中读取4字节有符号整数,并使流的当前位置提升4个字节 |
long ReadInt64() | 从当前流中读取8字节有符号整数,并使流的当前位置提升8个字节 |
sbyte ReadSByte() | 从该流中读取1个有符号字节,并使流的当前位置提升1个字节 |
float ReadSingle() | 从当前流中读取4字节浮点值,并使流的当前位置提升4个字节 |
string ReadString() | 从当前流中读取一个字符串。字符串有长度前缀,一次7位地被编码为整数 |
ushort ReadUInt16() | 从该流中读取的2字节无符号整数 |
uint ReadUInt32() | 从该流中读取的4字节无符号整数 |
ulong ReadUInt64() | 从该流中读取的8字节无符号整数 |
void FillBuffer(int numBytes) | 用从流中读取的指定字节数填充内部缓冲区 |
在BinaryReader类中提供的方法并不是直接读取文件中指定数据类型的值,而是读取由 BinaryWriter类写入到文件中的。在上述方法中只有Read
方法不要求读取的值必须由BinaryWriter类写入到文件中。
using System;
using System.IO;
using System.Text;
class Program
{
static void Main(string[] args)
{
FileStream fileStream = new FileStream(@"D:\\test01\\test1.txt", FileMode.Open);
BinaryReader binaryReader = new BinaryReader(fileStream);
//读取文件的一个字符
int a = binaryReader.Read();
//判断文件中是否含有字符,若不含字符,a的值为 -1
while (a != -1)
{
//输出读取到的字符
Console.Write((char)a);
a = binaryReader.Read();
}
fileStream.Close();
binaryReader.Close();
Console.WriteLine("***************************");
FileStream fileStream1 = new FileStream(@"D:\\test01\\test1.txt", FileMode.Open, FileAccess.Read);
BinaryReader binaryReader1 = new BinaryReader(fileStream1);
//获取文件长度
long length = fileStream1.Length;
byte[] bytes = new byte[length];
//读取文件中的内容并保存到字节数组中
binaryReader1.Read(bytes, 0, bytes.Length);
//将字节数组转换为字符串,需要导入System.Text
string str = Encoding.Default.GetString(bytes);
Console.WriteLine(str);
fileStream1.Close();
binaryReader1.Close();
}
}
BinaryWriter类用于以二进制形式写入内容,构造方法也有3种,类似BinaryReader。
// 1.
BinaryWriter(Stream output)
// 2.
BinaryWriter(Stream output, Encoding encoding)
// 3.
BinaryWriter(Stream output, Encoding encoding, bool leaveOpen)
BinaryWriter类中常用的属性和方法如下表所示。
属性或方法 | 作用 |
---|---|
void Close() | 关闭流 |
void Flush() | 清理当前编写器的所有缓冲区,使所有缓冲数据写入基础设备 |
long Seek(int offset, SeekOrigin origin) | 返回查找的当前流的位置 |
void Write(char[] chars) | 将字符数组写入当前流 |
Write7BitEncodedInt(int value) | 以压缩格式写出 32 位整数 |
using System;
using System.IO;
class Program
{
static void Main(string[] args)
{
FileStream fileStream = new FileStream(@"D:\\test01\\test1.txt", FileMode.Open, FileAccess.Write);
//创建二进制写入流的实例
BinaryWriter binaryWriter = new BinaryWriter(fileStream);
//向文件中写入图书名称
binaryWriter.Write("C#基础教程");
//向文件中写入图书价格
binaryWriter.Write(49.5);
//清除缓冲区的内容,将缓冲区中的内容写入到文件中
binaryWriter.Flush();
//关闭二进制流
binaryWriter.Close();
//关闭文件流
fileStream.Close();
fileStream = new FileStream(@"D:\\test01\\test1.txt", FileMode.Open, FileAccess.Read);
//创建二进制读取流的实例
BinaryReader binaryReader = new BinaryReader(fileStream);
//输出图书名称
Console.WriteLine(binaryReader.ReadString());
//输出图书价格
Console.WriteLine(binaryReader.ReadDouble());
//关闭二进制读取流
binaryReader.Close();
//关闭文件流
fileStream.Close();
}
}
以二进制写入数据会显示乱码,猜测是编码方式不同导致的;但读取显示是正常的。