计算机编程中何为流
在计算机编程中,流就是一个类的对象,很多文件的输入输出操作都以类的成员函数的方式来提供。
C#包括以下标准IO(输入/输出)类,可从不同的源(例如文件,内存,网络,隔离存储等)进行读取/写入。
流(Stream): System.IO.Stream 是一个抽象类,提供了将字节(读,写等)传输到源的标准方法。就像包装器类一样传输字节。需要从特定源读取/写入字节的类必须实现Stream类。
以下类继承Stream类,以提供从特定源读取/写入字节的功能:
- FileStream:从物理文件读取字节或向物理文件写入字节,无论它是.txt,.exe,.jpg还是任何其他文件。FileStream派生自Stream类。
- MemoryStream: MemoryStream读取或写入存储在内存中的字节。
- BufferedStream: BufferedStream从其他Stream读取或写入字节,以提高某些I / O操作的性能。
- NetworkStream: NetworkStream从网络套接字读取或写入字节。
- PipeStream: PipeStream读取或写入来自不同进程的字节。
- CryptoStream: CryptoStream用于将数据流链接到密码转换。
C# StreamReader类:读取文件
在 C# 语言中 StreamReader 类用于从流中读取字符串。它继承自 TextReader 类。treamReader 类的构造方法有很多,这里介绍一些常用的构造方法,如下图所示。
使用该表中的构造方法即可创建 StreamReader 类的实例,通过实例调用其提供的类成 员能进行文件的读取操作。StreamReader 类中的常用属性和方法如下图所示。
例子:
using System;
using System.IO;
namespace MySpace
{
class Program
{
static void Main(string[] args)
{
//定义文件路径
string path = @"E:\test\test.txt";
//创建StreamReader对象
StreamReader streamReader = new StreamReader(path);
//获取流中的下一个字节的整数,如果没有获取到字符,则返回-1
//获取获取全部字节
while(streamReader.Peek() != -1)
{
//从当前流中读取一行字符并将数据作为字符串返回
string str = streamReader.ReadLine();
Console.WriteLine(str);
}
//关闭流
streamReader.Close();
Console.ReadKey();
}
}
}
运行结果:
C# StreamWriter类:写入文件
StreamReader 类对应的是 StreamWriter 类,StreamWriter 类主要用于向流中写入数据。
StreamWriter 类的构造方法也有很多,这里只列出一些常用的构造方法,如下图所示。
在创建了 StreamWriter 类的实例后即可调用其类成员,完成向文件中写入信息的操作。StreamWriter 类中常用的属性和方法如下图所示。
Write、WriteAsync、WriteLineAsync 方法还有很多不同类型写入的重载方,这里没有一一列出。
例子:
using System;
using System.IO;
namespace MySpace
{
class Program
{
static void Main(string[] args)
{
string path = @"E:\test\test.txt";
//创建一个StreamWriter的对象
StreamWriter streamWriter = new StreamWriter(path);
//向文件中写入一个行
streamWriter.WriteLine("QQ:");
streamWriter.WriteLine("845264718");
//刷新缓冲
streamWriter.Flush();
//关闭流
streamWriter.Close();
}
}
}
运行结果:
C# FileStream类:文件读写
在 C# 语言中文件读写流使用 FileStream 类来表示,FileStream 类主要用于文件的读写,不仅能读写普通的文本文件,还可以读取图像文件、声音文件等不同格式的文件。
在创建 FileStream 类的实例时还会涉及多个枚举类型的值, 包括 FileAccess、FileMode、FileShare、FileOptions 等。
FileAccess 枚举类型主要用于设置文件的访问方式,具体的枚举值如下。
- Read:以只读方式打开文件。
- Write:以写方式打开文件。
- ReadWrite:以读写方式打开文件。
FileMode 枚举类型主要用于设置文件打开或创建的方式,具体的枚举值如下。
-
CreateNew:创建新文件,如果文件已经存在,则会抛出异常。 Create:创建文件,如果文件不存在,则删除原来的文件,重新创建文件。
-
Open:打开已经存在的文件,如果文件不存在,则会抛出异常。 OpenOrCreate:打开已经存在的文件,如果文件不存在,则创建文件。
-
Truncate:打开已经存在的文件,并清除文件中的内容,保留文件的创建日期。如果文件不存在,则会抛出异常。
-
Append:打开文件,用于向文件中追加内容,如果文件不存在,则创建一个新文件。
FileShare 枚举类型主要用于设置多个对象同时访问同一个文件时的访问控制,具体的枚举值如下。
- None:谢绝共享当前的文件。
- Read:允许随后打开文件读取信息。
- ReadWrite:允许随后打开文件读写信息。
- Write:允许随后打开文件写入信息。
- Delete:允许随后删除文件。
- Inheritable:使文件句柄可由子进程继承。
FileOptions 枚举类型用于设置文件的高级选项,包括文件是否加密、访问后是否删除等,具体的枚举值如下。
- WriteThrough:指示系统应通过任何中间缓存、直接写入磁盘。
- None:指示在生成 System.IO.FileStream 对象时不应使用其他选项。
- Encrypted:指示文件是加密的,只能通过用于加密的同一用户账户来解密。
- DeleteOnClose:指示当不再使用某个文件时自动删除该文件。
- SequentialScan:指示按从头到尾的顺序访问文件。 RandomAccess:指示随机访问文件。
- Asynchronous:指示文件可用于异步读取和写入。
FileStream 类的构造方法有很多,这里介绍一些常用的构造方法,如下图所示。
在创建好 FileStream 类的实例后,即可调用该类中的成员完成读写数据的操作。FileStream 类中常用的属性和方法如下图所示。
例子1:
using System;
using System.IO;
using System.Text;// byte[] bytes = Encoding.UTF8.GetBytes(msg);所用到的名字空间
namespace MySpcae
{
class Program
{
static void Main(string[] args)
{
//定义文件路径
string path = @"E:\test\QQ.txt";
///创建FileStream类的对象
///第一参数path是文件路径
///第二个参数FileMode.OpenOrCreate 打开已存在的文件,不存在就创建
///第三个参数FileAccess.ReadWrite 以读写打开文件
///第四个参数FileShare.ReadWrite 允许随后打开文件读写信息
FileStream fileStream = new FileStream(path, FileMode.OpenOrCreate,
FileAccess.ReadWrite, FileShare.ReadWrite);
string msg = "845264718";
//如果是中文,那么string长度不够用,将数据从字符串类型装换成字节类型
byte[] bytes = Encoding.UTF8.GetBytes(msg);
//从流中读取字节快并将该数据写入给定的缓冲区
//bytes是字节块
//0是位置
//bytes.Length是字节块的大小
fileStream.Write(bytes, 0, bytes.Length);
//刷新缓冲区
fileStream.Flush();
//关闭流
fileStream.Close();
}
}
}
运行结果:
例子2:
using System;
using System.IO;
using System.Text;
namespace MySpace
{
class Program
{
static void Main(string[] args)
{
//指定文件路径
string path = @"E:\test\QQ.txt";
//判断是否含有指定文件
if(File.Exists(path))
{
FileStream fileStream = new FileStream(path,
FileMode.Open, FileAccess.Read);
//定义存放文件信息的字节数组
byte[] bytes = new byte[fileStream.Length];
fileStream.Read(bytes, 0, bytes.Length);
//将得到的字节类型数组重写编码为字符型数组
char[] c = Encoding.UTF8.GetChars(bytes);
Console.WriteLine("My QQ:");
Console.WriteLine(c);
//关闭流
fileStream.Close();
}
else
{
Console.WriteLine("您查看的文件不存在!");
}
Console.ReadKey();
}
}
}
运行结果:
C# BinaryReader类:读取二进制文件
在 C# 以二进制形式读取数据时使用的是 BinaryReader 类。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 是指在流读取后是否包括流的打开状态。
在完成 BinaryReader 类的实例的创建后,即可完成对文件以二进制形式的读取。
BinaryReader 类中的常用属性和方法如下图所示。
在 BinaryReader 类中提供的方法并不是直接读取文件中指定数据类型的值,而是读取由 BinaryWriter 类写入到文件中的。
在上述方法中只有 Read 方法不要求读取的值必须由 BinaryWriter 类写入到文件中。
例子1:
using System;
using System.IO;
namespace MySpace
{
class Program
{
static void Main(string[] args)
{
//只读方式创建文件流
FileStream fileStream = new FileStream(@"E:\test\test.txt",
FileMode.Open);
//创建一个BinaryRead的对象
BinaryReader binaryReader = new BinaryReader(fileStream);
//从指定的流中读取字符
int a = binaryReader.Read();
//判断文件中是否含有字符,若不含字节,a的值为-1
while(a != -1)
{
//输出读取到的字符
Console.Write((char)a);
a = binaryReader.Read();
}
Console.WriteLine();
Console.ReadKey();
}
}
}
运行结果:
除了使用 Read 方法每次读取一个字符以外,也可以使用 Read 方法的其他重载方法将字符读取到一个字节数组或字符数组中。
例子2:
using System;
using System.IO;
using System.Text;
namespace MySpace
{
class Program
{
static void Main(string[] args)
{
//创建一个文件流对象,设定了打开方式,和只读权限
FileStream fileStream = new FileStream(@"E:\test\test.txt",
FileMode.Open, FileAccess.Read);
//创建一个BinaryReader对象
BinaryReader binaryReader = new BinaryReader(fileStream);
//获取文件长度
long length = fileStream.Length;
byte[] bytes = new byte[length];
//读取的文件内容并保存到字节数组中
binaryReader.Read(bytes, 0, bytes.Length);
//将字节数组转换为字符串
String str = Encoding.Default.GetString(bytes);
Console.WriteLine(str);
Console.ReadKey();
}
}
}
运行结果:
C# BinaryWriter类:写入二进制数据
BinaryWriter 类用于向流中写入内容,其构造方法具体的语法形式如下。
第1种形式:
BinaryWriter(Stream output)
第2种形式:
BinaryWriter(Stream output, Encoding encoding)
第3种形式:
BinaryWriter(Stream output, Encoding encoding, bool leaveOpen)
BinaryWriter 类中常用的属性和方法如下图所示。
除了上面的方法以外,Write 方法还提供了多种类型的重载方法。
例子:
using System;
using System.IO;
namespace MySpace
{
class Program
{
static void Main(string[] args)
{
//创建一个文件写入流对象,存在就打开,权限是写
FileStream fileStream = new FileStream(@"E:\test\test.txt",
FileMode.Open, FileAccess.Write);
//创建一个写入二进制流
BinaryWriter binaryWriter = new BinaryWriter(fileStream);
//向文件写入
binaryWriter.Write("一起来学习啊");
binaryWriter.Write(8456264718);
//刷新缓冲区,将缓冲区内容写入文件中
binaryWriter.Flush();
binaryWriter.Close();
//关闭二进制流
fileStream.Close();
//创建一个文件读取流,存在就打开,权限只读
fileStream = new FileStream(@"E:\test\test.txt",
FileMode.Open, FileAccess.Read);
//创建一个二进制读取流
BinaryReader binaryReader = new BinaryReader(fileStream);
//读取数据显示到屏幕
Console.WriteLine(binaryReader.ReadString());
Console.WriteLine(binaryReader.ReadInt64());
//关闭流
binaryReader.Close();
fileStream.Close();
}
}
}
运行结果: