黑马程序员-文件流的写入

 

   关于文件的写入:

      因为是一个一个的字符写到磁盘上.所以在使用的过程中就出现了一些问题,硬盘的结构决定了速度和消耗.频繁的使用硬盘进行读写操作.就会显得效率不高.而且对硬盘的伤害也是很大的.那么我们应该怎么处理的呢?

      在处理的时候.实际上我们可以在内存和硬盘之间开辟一条连接通道.并在内存中划分一块高速缓冲区.然后在写入文件的时候.把数据都先写入到高速缓冲区.然后等到高速缓冲区满了.再一次性写入到硬盘上.或者数据写入完了,然后将数据写入到硬盘上.等到数据写入结束后把连接通道关闭.

 

代码操作写入方法:

      前面所说的写入方法.就是我们所说的文件流的写入方法.显然首先需要打开一个内存和硬盘之间的连接通道.所以我们使用FileStream类.

      FileStream类是专门处理文件流的一个类.在System.IO 命名空间下  .在C#中.有关输入输出的操作一般都是在System.IO命名空间下.

      开辟高速缓冲区和硬盘之间的连接通道:

      1.创建FileStream对象.

        static void Main(string[] args)

        {

          FileStream file =  new FileStream(@“C:\fileStreamTest.txt”, FileMode.Create, FileAccess.Write);

        }  

       这样就有了一个连接通道.

       对于FileStream的构造函数有点多.所以不需要记太多.我看了下Vs2012中有15个.记住常用的就可以了.

       这里的第一个参数就是地址了.filePath.表示需要处理的文件位置.

       第二个是FileMode,表示文件的处理方式.这个是枚举变量.

          Create 创建文件,若存在则覆盖.

          CreateNew 创建新文件,若存在异常,

          Open 打开文件,文件不存在异常,

          OpenOrCreate 打开和创建文件,

          Truncate  打开文件,但是文件中的所有数据, 

          Append 追加数据到文件中.

            (对与使用方式,部分需要FileAccess限制枚举值,不如追加的时候不能读取)

       第三个是FileAccess枚举值,可用值只有三个.

          Read  读取数据

          ReadWrite 读取或写入数据

          Write 写入数据

        对于FileStream的使用先学会使用这个构造函数就可以了.其他的后面慢慢学.

    2, 现在连接通道有了,接下来就是把数据写入到高速缓冲区了,对于写数据,当然有一个写数据的方法了.StreamWrite对象.那么该对象就是完成把数据写入缓冲区的事情了.该怎么样完成呢?

      使用构造方法把FileStream作为参数,另外.还需要考虑数据的格式.所以将Encoding.Default作为第二个参数.

    static void Main(string[] args) {
 
        FileStream file = new FileStream(@“C:\fileStreamTest.txt”, FileMode.Create, FileAccess.Write);
            StreamWriter writer = new StreamWriter(file, Encoding.Default);
}

    此时创建一个StreamWrite对象.用来写数据.

    关于Encoding 说明:

      文本文件都有一定的格式,对于英文和数字.一般都没有什么问题.

      在中文和特殊符号中,由于编码比较多.一般使用default即可.

      在使用时最好看看是否乱码.

    常见的编码有AscII,Utf-8,GB2312,Unicode,GBk等.

3,开始写数据:

    数据的写方法一般有两个.write 和WriteLine

  Write方法:

    Write的方法一般都比较多.我们一般只需要学会两个即可.

       public void Write(string value);

    public void Write(char value);

  该方法是把数据加到末尾.直接调用Flush方法,或该缓冲区已满时写入到磁盘.

  代码:

            static void Main(string[] args)
        {
            FileStream fs = new FileStream(@"C:\Test.txt", FileMode.Create, FileAccess.Write);
            StreamWriter sw = new StreamWriter(fs, Encoding.Default);
            string str1 = "w";
            string str2 = "s";
            string str3 = "y";
            char ch1 = 'g';
            char ch2 = 'c';
            char ch3 = 's';
            sw.Write(str1);
            sw.Write(str2);
            sw.Write(str3);
            sw.Flush();
            sw.Write(ch1);
            sw.Write(ch2);
            sw.Write(ch3);
        }

  然后运行程序.查看文本.结果只有wsy 三个字符.

  因为后面的没有调用Flush方法.所以没有写入到缓冲区.

4.关闭流对象:

  根据上面可见.写文件的最后需要调一个Flush方法.才会把数据写入到硬盘上.那么写入文件后是不是连接通道就没有用了呢?如果没有用了.岂不是占着资源?

  所以需要我们手动释放占用的资源.

个人建议的写法:

  使用Using 把需要释放资源的代码包起来.那样就不要我们手动去释放资源了.Using会自动帮我们调用Dispose 和close,Flush方法.

完整代码:

              static void Main(string[] args)
        {
            using (FileStream fs = new FileStream(@"C:\Test.txt", FileMode.Create, FileAccess.Write))
            {
                using (StreamWriter sw = new StreamWriter(fs, Encoding.Default))
                {
                    string str1 = "w";
                    string str2 = "s";
                    string str3 = "y";
                    char ch1 = 'g';
                    char ch2 = 'c';
                    char ch3 = 's';
                    sw.Write(str1);
                    sw.Write(str2);
                    sw.Write(str3);
                    sw.Write(ch1);
                    sw.Write(ch2);
                    sw.Write(ch3);
                }
            }
        }

当代码离开Using范围的时候就会自动调用Dispose方法.

当调用Dispose方法的时候会调用Close方法.

当释放资源的时候 又会调用Flush方法.

WriteLine方法:

  对于Write方法实在是比较麻烦的,因为输入的内容是一个一个的写入.如果需要换行还得手动写入换行.所以StreamWrite 提供了一个WriteLine.专门输入一行数据

  

方法原型:

    public void WriteLine(string value);

该方法是将字符串Value写入高速缓冲区.并在后面自动换行.

  static void Main(string[] args)

{
 
  FileStream file = new FileStream(“C:\\test.txt”, FileMode.Create, FileAccess.Write);
 
  StreamWriter writer = new StreamWriter(file);
 
  using(file)

   {
 
    using(writer)

    { 
      writer.WriteLine(“我是一个测试”);
    }
  }
}

代码执行后文本将会写入到磁盘中.

文本文件占两行.第一行是刚才写入的文本.第二行是因为WriteLine结束的换行.

 

 

      

 

posted @ 2013-04-22 11:13  AlianBlank  阅读(313)  评论(0编辑  收藏  举报