zoukankan      html  css  js  c++  java
  • 黑马程序员文件流的写入

       关于文件的写入:

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

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

    代码操作写入方法:

          前面所说的写入方法.就是我们所说的文件流的写入方法.显然首先需要打开一个内存和硬盘之间的连接通道.所以我们使用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结束的换行.

     

     

          

    __EOF__

    本文作者 Blank
    本文链接
    版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
    声援博主:如果您觉得文章对您有帮助,可以点击文章右下角 推荐 一下。您的鼓励是博主的最大动力!
  • 相关阅读:
    .NET平台下Web树形结构程序设计李洪根
    [总结]Asp.net中的页面乱码的问题
    [原创]Datagrid中绑定DropDownList的例子
    [原创]TreeView的递归问题!FAQ
    [个人]我所有的Email地址!
    心情随笔(一)
    [原创]用JS做的一个打字程序(为网友qixiao)
    [转贴]一个通用的数据分页的存储过程
    [转贴]怎么样写一个XML文件到客户端
    [原创]用JS给DropDownList添加新项!
  • 原文地址:https://www.cnblogs.com/alianblank/p/3035130.html
Copyright © 2011-2022 走看看