# 流操作

  1. File 操作文件,对文件整体操作,拷贝、删除和剪切等。(静态)
  2. FileInfo 文件类,用来描述一个文件对象 (动态)
  3. Directory 操作目录 (静态)
  4. DirectoryInfo 操作目录 文件夹一个类,获取指定目录下的所有文件,返回一个FileInfo数组 (动态)
  5. Path 对文件或者目录操作
  6. Stream
  • FileStream //文件流
  • MenoryStream //内存流
  • NetWorkStream //网络流
  • StreamReader //快速读取文本文件
  • StreamWriter //快速写入文本文件
  • GZipStream

# 1.File

读取文件

# 2.FileInfo

获取文件信息

# 3.Directory

  • 创建文件夹,如果已有便不创建
  • 删除文件,如果文件夹下还有文件则报异常
  • 删除文件,如果目录不存在则报异常
  • 剪切不能跨磁盘
  • 剪切不能取已有名称的文件夹
  • 子文件和子目录只能包含在直接子目录

# 4.DirectoryInfo

获取文件夹信息 获取文件加下的DirectoryInfo和FileInfo

# 5.Path

获取文件目录,对文件目录的操作

# 6.Stream

# 1.FileStream
读取文件:
//文件流:读取
FileStream fileStream = File.Open(@"D:\test.txt", FileMode.Open);//初始化文件流
byte[] array = new byte[fileStream.Length];//初始化字节数组,用来暂存读取到的字节
fileStream.Read(array, 0, array.Length);//读取流中数据,写入到字节数组中
fileStream.Close(); //关闭流
string str = Encoding.Default.GetString(array);//将字节数组内容转化为字符串
Response.Write(str);
写入文件:
//文件流:写入
FileStream fileStream = File.Open(@"D:\test.txt",FileMode.Append);//初始化文件流
byte[] array = Encoding.Default.GetBytes("哈哈123abc");//给字节数组赋值
fileStream.Write(array, 0, array.Length);//将字节数组写入文件流
fileStream.Close();//关闭流
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 2.MenoryStream
string str = "Hi!你好!";
byte[] array = Encoding.UTF8.GetBytes(str);//将字符串转化为字节数组
MemoryStream memory = new MemoryStream(array);//初始化MemoryStream类
byte[] arrayNew = memory.ToArray();//将内存中的数据转换为字节数组
string strNew = Encoding.UTF8.GetString(arrayNew);//将字节数组转换为字符串
1
2
3
4
5
# 3.NetWorkStream
服务器
TcpListener lis=new TcpListener(5000); //服务器监听
lis.Start();//启动
Socket sock=lis.AcceptSocket();//阻塞,直到有客户端连接

NetworkStream networkStream = new NetworkStream(sock);//得到Socket中的流
if (netStream.DataAvailable)   //如果客户端发送了消息
{
   byte[] data = new byte[1024];   //定义一个字节数组,用来存放接收的数据
   int len = netStream.Read(data, 0, data.Length);  //从位置开始,读取到字节数组末尾
   string line = Encoding.Default.GetString(data, 0, len);  //把收到的字节转换为字符串
}
客户端
TcpClient client = new TcpClient();//客户端tcp对象
client.Connect("127.0.0.1", 5000);//连接服务器
NetworkStream myStream = client.GetStream();//得到网络流
                
byte[] data = Encoding.Default.GetBytes("Hi,你好");  //首先把输入的字符串消息转换为字节
myStream .Write(data, 0, data.Length);  //向myStream 里写入数据
myStream .Flush();  //刷新流中的数据
myStream .Close();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# StreamReader/StreamWriter
StreamReader/StreamWriter主要用来处理流数据。它们分别提供了高效的流读取/写入功能。
//StreamReader 读取
StreamReader reader = new StreamReader(@"D:\test.txt",Encoding.Default);//初始化读取 设置编码格式,否则中文会乱码
string readStr = reader.ReadLine();//从流中读取一行  reader.ReadToEnd()读取全部
reader.Close();//关闭流

//StreamWriter 写入
StreamWriter writer = new StreamWriter(@"D:\test1.txt");//初始化写入
writer.WriteLine("Hi 你好123");//写入一行
writer.Close();
1
2
3
4
5
6
7
8
9
10
# TextReader/TextWriter
TextReader/TextWriter类主要用来处理流数据。它们分别提供了高效的文本流读取/写入功能。
//TextReader/Writer读写
TextReader textReader = new StringReader("Hi 你好");//初始化读取流
TextWriter textWriter = new StringWriter();//初始化写入流

char[] c=new char[4096];
int chars = 0;
while ((chars = textReader.Read(c, 0, 4096)) > 0)//把流中数据写入到字符数组中 读取流中数据
{
   textWriter.Write(c, 0, 4096);//从字符数组中读取流
}

string str= textWriter.ToString();//将流中数据写到字符串中
textReader.Close();//关闭流
textWriter.Close();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# GZipStream
压缩流 GZipstream  
压缩原理: 1.图片 2.文本文件 3.电影 4.字符串 
1.压缩:
1.创建读取流 FIle.OpenRead()
2.创建写入流 FIle.Openwrite()
3.创建压缩流 new GZipstream()将写入流作为参数与.
4.每次通过读取流读取一部分数据,通过压缩流写入.
2.解压
1.创建读取流: FIle . OpenRead()
2.创建压缩流: new Gzipstream():将读取流作为参数 
3.创建写入流 File . Openwrite(); 
4.每次通过压缩流读取数据,通过写入流写入数据。
1
2
3
4
5
6
7
8
9
10
11
12
# 注意事项:
  1. ==流使用后必须要关闭。==
  2. ==把流中数据加载到内存时要考虑内存溢出等问题。== 1.== 一个流只能针对一个对象==
1.文件流操作的都是字节,不能是字符串
//创建文件流
filestream fs=new filestream("xx.text",filemode.create,fileaccess.write)
//执行写入
string msg=“123456789”;
byte[] bytes=system.text.utf8.getbytes(msg);
fs.write(bytes,0,bytes.length);
//清空缓冲区,关闭文件流,释放资源
fs.Flush();
fs.Close();
fs.Dispose();
using=dispose
//使用文件流时不需要指定编码,应为编码是在btye[]转字符串是才使用的,这里是直接读到byte
using(filestream fs=new filestream("xx.text",filemode.open,fileaccess.read))
{
//根据文件总数组创建一个byte数组,这种方式将文件一次性读取出来
byte[] bytes=new byte(fs.length)
fs.read(bytes,0,bytes.length);
//byte转string 要编码
string msg=system.text.utf8.getstring(bytes)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# 乱码

文本文件:直接保存字符串
ASCII ==> gb2312==> GBK(简体中文编码)==>GB18030
8位==>8位: +7英文   16位::-7-7中文==>8位: +7英文   16位::-7 8中文
big5繁体
unicode:国际码 中英文都是2个字节
UTF-8:国际码 英文1个字节 中文3个字节
Encoding.getencoding()所有编码
读取和保存时用同一编码,避免乱码
1
2
3
4
5
6
7
8

# 垃圾回收

# 垃圾回收

CG.collect() 三代参数

mark-and-compac标记与压缩

# 析构函数
 ~myclass() 在垃圾回收时才回收这个类开辟内存
非托管代码开辟的空间要立即释放
class myclass:IDisposable
{
~myclass() 
public void Dispose()
{} 
}
Dispose和Finalize。Finalize的目的是用于释放非托管的资源,而Dispose是用于释放所有资源,包括托管的和非托管的。

//对所有代进行垃圾回收。
GC.Collect();
//对指定的代进行垃圾回收。
GC.Collect(int generation); 
//强制在 System.GCCollectionMode 值所指定的时间对零代到指定代进行垃圾回收。
GC.Collect(int generation, GCCollectionMode mode); 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# dispose的具体使用
1.继承IDisposable的方法
class Person : IDisposable
{
    #region IDisposable Support
    private bool disposedValue = false; // 要检测冗余调用
    protected virtual void Dispose(bool disposing)
    {
        if (!disposedValue)
        {
            if (disposing)
            {
                // TODO: 释放托管状态(托管对象)。
            }
            // TODO: 释放未托管的资源(未托管的对象)并在以下内容中替代终结。
            // TODO: 将大型字段设置为 null。
            disposedValue = true;
        }
    }
    // TODO: 仅当以上 Dispose(bool disposing) 拥有用于释放未托管资源的代码时才替代终结器。
    // ~Person() {
    //   // 请勿更改此代码。将清理代码放入以上 Dispose(bool disposing) 中。
    //   Dispose(false);
    // }

    // 添加此代码以正确实现可处置模式。
    public void Dispose()
    {
        // 请勿更改此代码。将清理代码放入以上 Dispose(bool disposing) 中。
        Dispose(true);
        // TODO: 如果在以上内容中替代了终结器,则取消注释以下行。
        // GC.SuppressFinalize(this);
    }
    #endregion
}


2.对他改写一下可以更加了解
    class Person : IDisposable
    {
        //演示创建一个非托管资源
        private IntPtr nativeResource = Marshal.AllocHGlobal(100);
        //演示创建一个托管资源
        private PersonInfo personInfo = new PersonInfo();

        #region IDisposable Support
        private bool disposedValue = false; // 要检测冗余调用

        protected virtual void Dispose(bool disposing)
        {
            if (!disposedValue)
            {
                if (disposing)
                {
                    // TODO: 释放托管状态(托管对象)。
                    personInfo.Dispose();
                    personInfo = null;
                }
                if (nativeResource != IntPtr.Zero)
                {
                    Marshal.FreeHGlobal(nativeResource);
                    nativeResource = IntPtr.Zero;
                }
                // TODO: 释放未托管的资源(未托管的对象)并在以下内容中替代终结器。
                // TODO: 将大型字段设置为 null。            
                disposedValue = true;
            }
        }

        // TODO: 仅当以上 Dispose(bool disposing) 拥有用于释放未托管资源的代码时才替代终结器。
        // ~Person() {
        //   // 请勿更改此代码。将清理代码放入以上 Dispose(bool disposing) 中。
        //   Dispose(false);
        // }

        // 添加此代码以正确实现可处置模式。
        public void Dispose()
        {
            // 请勿更改此代码。将清理代码放入以上 Dispose(bool disposing) 中。
            Dispose(true);
            // TODO: 如果在以上内容中替代了终结器,则取消注释以下行。
            GC.SuppressFinalize(this);
        }

        /// <summary>
        /// 不是必要的,提供一个Close方法仅仅是为了更符合其他语言(如C++)的规范
        /// </summary>
        public void Close()
        {
            Dispose();
        }

        ~Person()
        {
            //必须为false
            Dispose(false);
        }
        #endregion

    }


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101