c#基础入门(5)——File、FileStream、StreamReader、StreamWriter

File

File的用法如下:

public void OperateFile()
{
   //example文件初始内容截图如图一
   string filePath = @"e:\Study\test\example.txt";
   if (File.Exists(filePath))
   {
       //allText="蝈蝈first\r\n蝈蝈second\r\n蝈蝈third"
       string allText = 
          File.ReadAllText(filePath,Encoding.Default);
       //allLines[0]="蝈蝈first"
       //allLines[1]="蝈蝈second"
       //allLines[2]="蝈蝈third"
       string[] allLines =
          File.ReadAllLines(filePath,Encoding.Default);
       byte[] allBytes = File.ReadAllBytes(filePath);
       //byte[]转成string,
       //str="蝈蝈first\r\n蝈蝈second\r\n蝈蝈third"
       string str =
          System.Text.Encoding.Default.GetString(allBytes);
       //string类型转成byte[],
       //byteArray={97,98,99,100,101,102}依次对应
       //ASCII码表中a、b、c、d、e的十进制值
       byte[] byteArray = 
          System.Text.Encoding.Default.GetBytes("abcde");

       //example.txt中的内容是:abcde
       File.WriteAllBytes(filePath, byteArray);
       //example.txt中的内容是:
       //"stringArray1\r\nstringArray2\r\nstringArray3",
       //\r\n以换行的形式出现
       File.WriteAllLines(filePath, new string[] 
       { "stringArray1", "stringArray2", "stringArray3" });
       //example.txt中的内容是:writeAllTxt的内容\r\n第二行,
       //\r\n以换行的形式出现
       File.WriteAllText(filePath, "writeAllTxt的内容\r\n第二行");

       //AppendAllLines之后example文件内容截图如图二
       File.AppendAllLines(filePath, new string[] 
       { "appendFirst","appendSecond","appendThird"});
       //AppendAllText之后example文件内容截图如图三
       File.AppendAllText(filePath, "appendAllTextContent");
       byte[] beforeAppendText = File.ReadAllBytes(filePath);
       //AppendText之后example文件内容截图如图四
       StreamWriter writer = File.AppendText(filePath);
       writer.Write("streamWriterContent");
       writer.Dispose();
       byte[] afterAppendText = File.ReadAllBytes(filePath);
   }
}

图一图一
图二图二
图三图三
图四图四

FileStream

FileStream对象表示在磁盘或网络路径上指向文件的流。这个类提供了在文件中读写字节的方法,但经常使用StreamReader或StreamWriter执行这些功能。这是因为FileStream类操作的是字节和字节数组(不仅可以读写txt还能读写.mp3……),而Stream类操作的是字符数据(只能是文字)。
文件的访问方式(FileAccess),包括三个枚举:
FileAccess.Read(对文件读访问)
FileAccess.Write(对文件进行写操作)
FileAccess.ReadWrite(对文件读或写操作)
在FileStream构造函数不使用FileAccess枚举参数的版本中,使用默认值FileAccess. ReadWrite,即有文件的读写权限。
注意:
文件流使用结束后,一定要Close或Dispose,using(){}方法在使用完文件流对象后会自动将其释放

public void OperateFileStream()
{
   string filePath=@"E:\Study\test\example.txt";
   byte[] byteArray= new byte[1024];
   using (FileStream sReader = new FileStream(filePath, FileMode.Open))
   {
      //length=32,汉字占2个字节、英文占1个字节2*6+5+6+5+2*2=32
      int length = sReader.Read(byteArray, 0, byteArray.Length);
      //result="蝈蝈first\r\n蝈蝈second\r\n蝈蝈third"
      string result = System.Text.Encoding.Default.GetString(byteArray, 0, length);
      //result="蝈蝈first\r\n蝈蝈second\r\n蝈蝈third\0\0\0\0\0......"
      //"\0"指的是空字符
      //byteArray的长度是1024数据不够1024byte时用"\0"填充
      result = System.Text.Encoding.Default.GetString(byteArray);
   }
   using (FileStream sReader = new FileStream(filePath, FileMode.Open))
   {
      //sReader.Length=32
      byte[] buffer = new byte[sReader.Length];
      //length=32,汉字占2个字节、英文占1个字节2*6+5+6+5+2*2=32
      int length = sReader.Read(buffer, 0, buffer.Length);
      //result="蝈蝈first\r\n蝈蝈second\r\n蝈蝈third"
      string result = System.Text.Encoding.Default.GetString(buffer, 0, length);
       //result="蝈蝈first\r\n蝈蝈second\r\n蝈蝈third"
       result = System.Text.Encoding.Default.GetString(buffer);
   }
   using (FileStream sWriter = new FileStream(filePath, FileMode.Create))
   {
      string content = "fileStream写入";
      byte[] buffer = System.Text.Encoding.Default.GetBytes(content);
      sWriter.Write(buffer, 0, buffer.Length);
      //清空缓冲区,将缓冲区的数据写入到文件
      sWriter.Flush();
      //example文件中的内容变为"fileStream写入"
   }
   using (FileStream sAppender = new FileStream(filePath, FileMode.Append))
   {
      string content = "fileStream追加";
      byte[] buffer = System.Text.Encoding.Default.GetBytes(content);
      sAppender.Write(buffer, 0, buffer.Length);
      //清空缓冲区,将缓冲区的数据写入到文件
      sAppender.Flush();
      //example文件中的内容变为"fileStream写入fileStream写入的内容fileStream追加"
   }
}

StreamReader&StreamWriter

StreamReader实现了抽象基类TextReader,而StreamWriter实现了抽象基类TextWriter,两者分别用于对流的读取与写入。
StreamReader类:
1、公共属性

 BaseStream 返回基础流。 
 CurrentEncoding 获取当前 StreamReader 对象正在使用的当前字符编码。 
 EndOfStream 获取一个值,该值表示当前的流位置是否在流的末尾。

2、公共方法

Close, 关闭 StreamReader 对象和基础流,并释放与读取器关联的所有系统资源。 (重写 TextReader..::.Close()()()。) 
CreateObjRef, 创建一个对象,该对象包含生成用于与远程对象进行通信的代理所需的全部相关信息。 (继承自 MarshalByRefObject。) 
DiscardBufferedData, 允许 StreamReader 对象丢弃其当前数据。 
Dispose 已重载。  
GetLifetimeService, 检索控制此实例的生存期策略的当前生存期服务对象。 (继承自 MarshalByRefObject。) 
InitializeLifetimeService, 获取控制此实例的生存期策略的生存期服务对象。 (继承自 MarshalByRefObject。) 
MemberwiseClone, 已重载。  
Peek, 返回下一个可用的字符,但不使用它。 (重写 TextReader..::.Peek()()()。) 
Read, 已重载。 读取输入流中的下一个字符或下一组字符。 
ReadBlock, 从当前流中读取最大 count 的字符并从 index 开始将该数据写入 buffer。 (继承自 TextReader。) 
ReadLine, 从当前流中读取一行字符并将数据作为字符串返回。 (重写 TextReader..::.ReadLine()()()。) 
ReadToEnd, 从流的当前位置到末尾读取流。 (重写 TextReader..::.ReadToEnd()()()。)

StreamReader实例代码如下:

public void OperateStream()
{
    string filePath = @"e:\Study\test\example.txt";
    string errorMsg = string.Empty;
    string msg=string.Empty;
    try
    {
        //生成StreamReader实例对象,方法一
        StreamReader sReader = new StreamReader(filePath);
        //成StreamReader实例对象,方法二
        //FileStream fileStream = new FileStream(filePath, FileMode.Open);
        //StreamReader sReaderFromFileStream = new StreamReader(fileStream);
        //每次只读一行
        msg = sReader.ReadLine();
        while (msg!=null)
        {
            Console.WriteLine("msg=" + msg);
            msg = sReader.ReadLine();
        }
        sReader.Close();

        sReader = new StreamReader(filePath);
        //EndOfStream判断当前的流位置是否在流的末尾
        //如果文件中没有内容,EndOfStream为true
        while (!sReader.EndOfStream)
        {
            //每次只读一行
            msg = sReader.ReadLine();
            Console.WriteLine("msg=" + msg);
        }
        sReader.Close();

        sReader = new StreamReader(filePath);
        //EndOfStream判断当前的流位置是否在流的末尾
        //如果文件中没有内容,EndOfStream为true
        while (!sReader.EndOfStream)
        {
            //读取文件中所有内容
            //此处为:蝈蝈first\r\n蝈蝈second\r\n蝈蝈third
            msg = sReader.ReadToEnd();
            Console.WriteLine("msg=" + msg);
        }
        sReader.Close();
    }
    catch (Exception ex)
    {
        errorMsg = ex.Message;
    }          
}

StreamWriter实例代码如下:

public void OperateStream()
{
    string filePath = @"e:\Study\test\example.txt";
    string errorMsg = string.Empty;
    string msg=string.Empty;          
    try
    {
        //生成StreamWriter实例对象,方法一
        StreamWriter sWriter = new StreamWriter(filePath);
        //生成StreamWriter实例对象,方法二
        //FileStream fileStream = new FileStream(filePath, FileMode.Create);
        //StreamWriter sWriterFromFileStream = new StreamWriter(fileStream);
        //会替换原有内容
        sWriter.Write("Write内容");
        sWriter.Close();

        sWriter = new StreamWriter(filePath);
        //会替换原有内容
        sWriter.WriteLine("WriteLine内容");
        sWriter.Close();
    }
    catch (Exception ex)
    {
        errorMsg = ex.Message;
    }
    try
    {
        //生成StreamWriter追加内容实例对象,方法一
        StreamWriter sAppender = new StreamWriter(filePath, true);
        //生成StreamWriter追加内容实例对象,方法二
        //FileStream fileStream = new FileStream(filePath, FileMode.Append);
        //StreamWriter sAppenderFromFileStream = new StreamWriter(fileStream);
        sAppender.Write("追加Write内容1");
        sAppender.Write("追加Write内容2");
        //WriteLine会在内容之后加上"\r\n"
        sAppender.WriteLine("追加WriteLine内容001");
        sAppender.WriteLine("追加WriteLine内容002");
        sAppender.Write("追加Write内容3");
        //追加后文件截图如下
        sAppender.Close();
    }
    catch (Exception ex)
    {
        errorMsg = ex.Message;
    }
}

这里写图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

changuncle

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值