其实早就想写一篇关于流的文章了,但是流这个内容比较多,笔者知道的东西也比较少,在网上找了一些人写的关于流的文章,他们写的还不错。其中《C# 温故而知新:Stream篇 》7篇还不错,下面把笔者了解到的写出来。
关于流的一些概念性的东西笔者就不介绍了,因为经常用大家多少已经了解了。一些相关的类库比如File、FileInfo、Path、Directory、DirectoryInfo类等笔者暂时也不介绍,使用到再说。
在Windows操作系统中有ANSI编码和Unicode编码之分
ANSI默认的gb2312
Unicode(两个字节)
小子头的005f5f00
大子头
UTF-8
就一个汉字有多种编码可供选择,那么二进制的数据表示就不一样
Encoding类,这个类专门用来表示编码,同时提供格式的转换
Encoding是一个类,它有提供了几个方法
GetEncoding()
GetEncodings()
这个类的对象提供了Get系方法
我们看下以下几个文件的16进制数据:新建一个记事本,输入字母a,文件另存4份选择编码分别为ANSI、Unicode、Unicode big endian、UTF-8。这4份文件里都是存储的是字母a,我们Nodepad++打开,并转换成16进制
文件对于的编码不同,那文件里存储的二进制就不一样,进而16进制表示也不一样
Encoding类,所以我们如果用错误的编码读取,那就找不到对应的字符,就会出现乱码
GC不能够完全控制FileStream这个类,需要我们手动的释放托管资源
fileStream.Close();
fileStream.Dispose();
实际开发过程中,大量的程序员忘记了Dispose()
using(需要手动释放的资源)
{
// 当代码离开using的时候,会自动的调用Dispose
}
理论部分先到这里,接下来是读取写入实例:
class Program { static void Main(string[] args) { ReadFile(); WriteFile(); } /// <summary> /// 读取文件 /// </summary> public static void ReadFile() { //1.txt里有中文和英文 编码为gb2312 using (FileStream fread=new FileStream ("1.txt",FileMode.Open,FileAccess.Read)) { //创建缓存数组 byte[] buy = new byte[10]; int count = 0; string s=string.Empty; while ((count = fread.Read(buy, 0, buy.Length)) > 0) { s = Encoding.Default.GetString(buy,0,count);//转码 Console.Write(s); } } Console.ReadKey(); } /// <summary> /// 写入文件 /// </summary> public static void WriteFile() { using (FileStream fw=new FileStream ("2.txt",FileMode.Create,FileAccess.Write)) { string s = "abc博客园"; byte[] by = Encoding.Default.GetBytes(s);//把字符串转换成byte数组 fw.Write(by,0,by.Length); } } }
原文:http://www.cnblogs.com/dongqinglove/p/3541995.html