• C# FileStream对象


    FileStream对象表示在磁盘或网络路径上指向文件的流。当类提供向文件读写字节的方法时,经常使用StreamReader或StreamWriter执行这些功能。这是因为FileStream类操作字节和字节数组,而Stream类操作字符数据。字符数据易于使用,但是有些操作比如随机文件访问,就必须由FileStream对象执行。

    FileStream对象的构造函数:

    FileStream aFile = new FileStream(“Log.txt”,FileMode.OpenOrCreate);

     FileMode枚举具有几种成员:

    Append------如果文件存在,就打开文件,将文件位置移动到文件的末尾,并创建一个新文件。FileMode.Append仅可以与枚举Fileaccess.Write联合使用

    Create------创建新文件;如果存在这样的文件,就破坏它。

    CreateNew------创建新文件,但是如果已经存在此文件,则抛出异常

    Open------打开现有的文件,但是不存在所指定的文件,则抛出异常

    OpenOrCreate------如果文件存在,则规定打开文件,否则就创建新文件,如果文件已经存在,则保留在文件中的数据

    Truncate------打开现有文件,清除其内容,然后我们可以向文件写入全新的数据,但是保留文件的初始创建日期,必须存在有文件,否则就抛出异常

    访问级别

    前面的构造函数默认以只读模式打开文件,需要一个附加参数规定不同的访问级别,此参数是FileAccess参数。

    FileStream aFile=new FileStream(”Log.txt”,fileMode.OpenOrCreate,FileAccess.Write)

    FileAccess枚举有三种类型:Read、Write、ReadWrite.此属性的作用是:基于用户的身份验证级别改变用户对文件的访问

    读取文件的位置用seek:public long Seek(long offset,SeekOrigin origin)

     Long offset是规定文件指针以字节为单位的移动距离;SeekOrigin origin是规定开始计算的起始位置,此枚举包含3个值:Begin,Current和End。

    例:aFile.Seek(8,SeekOrigin.Begin);// SeekOrigin.Begin指得是文件指针从文件的第一个字节起;而参数‘8‘指得是移动到文件的第8个字节

    例2:afile.Seek(2,SeekOrigin.Current)//在当前位置开始,再移动2个字节。

    例3:aFile.Seek(-5,SeekOrigin.End)//在文件末端位置开始,倒数5个字节。

    读取数据

    使用FileStream类读取数据不像使用StreamReader和StreamWriter类读取数据那么容易,这是因为FileStream类只能处理原始字节(raw byey),这使得FileStream类可以用于任何数据文件,而不仅仅是文本文件,通过读取字节数据就可以读取类似图像和声音的文件。这种灵活性的代价是不能使用它直接读入字符串,而使用StreamWriter和StreaMeader类却可以这样处理,从是有几种转换类可以很容易地将字节数组转换为字符数组,或者进行相反的操作。

    Read()方法是从FileStream对象所指向的文件访问数据的主要手段:

    Public int Read(byte[] array,int offset, int count)//第一个参数是被传输进来的字节数组,用以接受FileStream对象中的数据。第二个参数是字节数组中开始写入数据的位置,它通常是0,表示从数组的开端的文件中向数组写数据,最后一个参数是规定从文件中读出多少字节。

    写入数据

    写入数据的流程是先获取字节数组,再把字节数据转换为字符数组,然后把这个字符数组用Write()方法写入到文件中,当然在写入的过程中,可以确定在文件的什么位置写入,写多少字符等等。

    文件读写的范例:

    读取文件
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.IO;

    namespace myFile
    {
        class PRogram
        {
            static void Main(string[] args)
            {
                byte[] byData = new byte[100];//建立一个FileStream要用的字节组
                char[] charData = new char[100];//建立一个字符组

                try
                {
                    FileStream aFile = new FileStream("../../../../Data.txt", FileMode.Open);//实例化一个FileStream对象,用来操作data.txt文件,操作类型是
                    
                    aFile.Seek(55, SeekOrigin.Begin);//把文件指针指向,从文件开始位置向前55位字节所指的字节
                    aFile.Read(byData, 0, 100);//读取FileStream对象所指的文件到字节数组里
                }
                catch (IOException e)
                {
                    Console.WriteLine("close");
                    return;
                }
                Decoder d = Encoding.UTF8.GetDecoder();//
                d.GetChars(byData, 0, byData.Length, charData, 0);//将编码字节数组转换为字符数组

                Console.WriteLine(charData);
                Console.ReadLine();
                return;
            }
        }
    }

    写入文件:
     
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.IO;

    namespace myFile
    {
        class Program
        {
            static void Main(string[] args)
            {
                byte[] byData = new byte[100];//建立一个FileStream要用的字节组
                char[] charData = new char[100];//建立一个字符组

                try
                {
                    FileStream aFile = new FileStream("../../../../Data.txt", FileMode.Open);//实例化一个FileStream对象,用来操作data.txt文件,操作类型是
                   
                    charData = "我是谁?111?".ToCharArray();//将字符串内的字符复制到字符组里
                    aFile.Seek(0, SeekOrigin.End);
                    Encoder el = Encoding.UTF8.GetEncoder();//编码器
                    el.GetBytes(charData, 0, charData.Length, byData, 0, true);

                    aFile.Write(byData, 0, byData.Length);
                }
                catch (IOException e)
                {
                    Console.WriteLine("close");
                    return;
                }
               
            }
        }
    }

  • 相关阅读:
    深入理解TCP协议及其源代码
    Socket与系统调用深度分析
    构建调试Linux内核网络代码的环境MenuOS系统
    创新产品的需求分析:未来的图书会是什么样子?
    socket通信的原理与实践
    案例分析:设计模式与代码的结构特性
    网络相关的命令工具研究报告:ssh
    业务领域建模Domain Modeling
    ubuntu 设置静态ip,但显示scope global secondary ens33
    解决Python查询Mysql中文乱码问题
  • 原文地址:https://www.cnblogs.com/melao2006/p/4239669.html
Copyright © 2020-2023  润新知