C#基础知识及题目练习 Day8 文件操作 FileStream StreamWriter 序列化和反序列化

一、Path

1、GetFileName();   //获取文件名

2、GetFileNameWithoutExtention();   //获取不带扩展名的文件名称

3、GetExtension(); //获取扩展名

4、GetDirectionName();  获得文件所在的文件夹的路径

5、GetFullPath(); 获得文件的完整路径

6、Path.Combine(); 将两个路径合并成一个路径

二、File

1、Create():创建文件

2、Delete():删除文件

3、Copy():复制文件

4、

1)读取文件(字节数组—》字符串)

ReadAllBytes():从文件中读取字节数组

 Encoding.Default.GetString():将读取的字节数组转换为字符串

 

2)写入文件(字符串-》字节数组)

将创建文件流对象的过程写在using当中,会自动的帮助我们释放流所占用的资源

WriteAllBytes():创建一个新文件,将字节数组写入其中,关闭文件。

Encoding.Default.GetBytes():将字符串转换成字节数组

            #region 写入文件(字符串-》字节数组)
            string inputFile = "今天天气好晴朗,处处好风光。";
            //将字符串转换成字节数组
            byte[] byteInput = Encoding.Default.GetBytes(inputFile);
            //File.WriteAllBytes():创建一个新文件,将字节数组写入其中,关闭文件。
            File.WriteAllBytes(@"E:\1.txt", byteInput);
            Console.WriteLine("写入成功");
            Console.ReadKey();
            #endregion

5、ReadAllLines():使用指定的编码读取所有行,然后关闭文件

ReadAllText():打开文件,使用指定的编码读取所有行,然后关闭文件

WriteAllLines():使用指定的编码创建一个新文件,然后写入文件

WriteAllText():使用指定的编码创建一个新文件,然后写入文件

AppendAllText():向现有文件中追加文本

6、绝对路径和相对路径

1)绝对路径:通过给定的这个路径直接能在我的电脑中找到这个文件

2)相对路径:文件相对于应用程序的路径

在开发中应尽量使用相对路径

三、编码格式

什么叫做编码:将字符串以什么样的形式保存为二进制

 

四、FileStream:操作字节

1、与File区别

File:一次性将文件全部读出,对内存造成的压力比较大,适合小文件操作,

FileStream: 一点点把文件读出,对内存造成的压力比较小,适合操作大文件。

2、FileStream fsRead=new FileStream(“路径”,“FileMode.OpenOrCreate”,”FIleAccess.Read”)

            #region FileStream:操作字节
            // FileStream: 一点点把文件读出,对内存造成的压力比较小,适合操作大文件。
            FileStream fileRead = new FileStream(@"E:\1.txt", FileMode.OpenOrCreate, FileAccess.Read);
            //FileMode.OpenOrCreate 如果文件存在,则打开文件,把指针指到文件的开始;如果文件不存在,则新建文件
            //FileAccess.Read 读取文件
            byte[] buffer = new byte[1024 * 1024 * 5];
            //声明了一个字节数组,大小为5M。
            int rCount = fileRead.Read(buffer, 0, buffer.Length);
            // 0表示从那个字节读取数据 读取长度为buffer.Length 存放在buffer中
            //返回本次实际读到的有效字节数。
            Console.WriteLine(rCount);// 28? 25+3?
            string sFile = Encoding.Default.GetString(buffer, 0, rCount);
            //将字节数组buffer中的每一个元素(从0到r)按照默认的编码格式解码成字符串
            fileRead.Close();
            fileRead.Dispose();
            Console.WriteLine(sFile);//jttqhql,cchfg 13
            #endregion

r:实际读取到的有效字节。在解码的时候,只解码有效字节,剩余无效字节不再解码

3、将创建文件流对象的过程写在using当中,会自动帮我们释放流所占用的资源。

如果出现乱码问题,统一格式,如都改成utf-8

4、例:用FileStream完成多媒体文件的复制

思路:先将多媒体文件读取出来,然后写入到指定的位置

五、StreamReader与StreamWriter:操作字符

一、StreamReader读取文件 
第1步:调用构造函数创建一个实例对象 
构造函数:StreamReader(String path, Encoding)

第2步:调用构造函数的一个读取方法Readline

using (StreamReader sr = new StreamReader("StreamWriter.txt", Encoding.Default))

{

    string str = null;//先声明一个字符串

    while ((str = sr.ReadLine()) != null)//判断读取到的字符串是为null,如果为null,说明已经读取到文件末尾

         {

         Console.WriteLine(str);//将读取到的字符串打印到控制台

         }

         Console.ReadKey();

}

            #region StreamWriter写入文件
            using (StreamWriter sWriter = new StreamWriter(@"E:\11.txt", true, Encoding.Default))
            {
                Console.WriteLine("请输入文本:");//提示用户输入字符串
                string strWrite = Console.ReadLine();//将用户输入的字符串赋值给strWrite
                sWriter.WriteLine(strWrite);//将字符串写入到文本中
                Console.WriteLine("写入成功");
            }
            #endregion

二、StreamWriter写入文件 
第1步:调用构造函数创建一个实例对象 
构造函数:StreamWriter(String path, bool append, Encoding) 
参数: 
path:要写入文件的路径 
append: true 若要将数据追加到该文件; false 覆盖该文件。 如果指定的文件不存在,该参数无效,且构造函数将创建一个新文件。

第2步:调用构造函数的一个写入方法WriteLine

using (StreamWriter sw = new StreamWriter("StreamWriter.txt", true, Encoding.Default))

{

     Console.WriteLine("请输入文本:");//提示用户输入字符串

     string str = Console.ReadLine();//将用户输入的字符串赋值给str

     sw.WriteLine(str);//将字符串写入到文本中

}

            #region StreamReader读取文件
            using (StreamReader sr = new StreamReader(@"E:\1.txt", Encoding.Default))
            {
                while (!sr.EndOfStream)
                {
                    Console.WriteLine(sr.ReadLine());
                }
                //string strStream = null;//先声明一个字符串
                //while ((strStream = sr.ReadLine()) != null)//判断读取到的字符串是为null,如果为null,说明已经读取到文件末尾
                
                //{
                //    Console.WriteLine(strStream);//将读取到的字符串打印到控制台
                //}
            }

            #endregion

1、StreamWriter(“路径”,“是否追加到现有文件”);

六、序列化和反序列化

1、序列化:将对象转换为二进制

     反序列化:将二进制转换为对象

作用:传输数据

2、序列化步骤

1)标记[Serialize]

2)BinaryFormatter进行序列化或反序列化

Deserialize(Stream)  将指定的流反序列化成对象

Serialize(Stream, Object) 将对象序列化到给定的流

 

            #region 用BinaryFormatter进行序列化或反序列化
            Person p = new Person();
            p.Sex = 1;
            p.Age = 21;
            p.Name = "张三";

            using (FileStream swBF = new FileStream(@"E:\11.txt", FileMode.OpenOrCreate, FileAccess.Write))
            {
                BinaryFormatter bfs = new BinaryFormatter();
                bfs.Serialize(swBF, p);
                //Serialize(Stream, Object) 将对象序列化到给定的流
                swBF.Close();
            }
            using (FileStream srBF = new FileStream(@"E:\11.txt", FileMode.OpenOrCreate, FileAccess.Read))
            {
                BinaryFormatter bfs = new BinaryFormatter();//?? 定义了一个类对象
                Person p2 = (Person)bfs.Deserialize(srBF);
                //Deserialize(Stream)  将指定的流反序列化成对象
                Console.WriteLine(p2.Sex);
                Console.WriteLine(p2.Name);
                Console.WriteLine(p2.Age);
            }
            Console.ReadKey();
            #endregion

 

拓:

序列化是把一个内存中的对象的信息转化成一个可以持久化保存的形式,以便于保存或传输,序列化的主要作用是不同平台之间进行通信,常用的有序列化有jsonxml、文件等.

一、序列化为json

Json【javascript对象表示方法】,它是一个轻量级的数据交换格式,我们可以很简单的来读取和写它,并且它很容易被计算机转化和生成,它是完全独立于语言的。

C#中用于对象和json相互转换的原生类有两个:DataContractJsonSerializerJavaScriptSerializer,其中JavaScriptSerializer主要用于web的浏览器和服务器之间的通信。

将一个json格式的字符串反序列化为对象是用DataContractJsonSerializer实例的ReadObject()方法

二、序列化为xml

C#中将对象序列化和反序列化为xml的类是XmlSerializer。将xml文件反序列化的方法是用XmlSerializer实例的Deserialize()方法

三、序列化为文件

C#中将对象序列化和反序列化为二进制文件的类是BinaryFormatter。通过BinaryFormatter类型实例的Deserialize()方法把二进制文本反序列化为对象
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C#中的序列化反序列化是.NET运行时环境用来支持用户定义类型的流化的机制。序列化就是把一个对象保存到一个文件或数据库字段中去,反序列化就是在适当的时候再把介质中的东西还原成对象。在进行这些操作的时候都需要这个可以被序列化,要能被序列化,就得给类头加[Serializable]特性。下面是C#序列化反序列化的方法: 1.使用BinaryFormatter进行序列化反序列化,BinaryFormatter是.NET Framework中的一个类,它可以将对象序列化为二进制流,也可以将二进制流反序列化为对象。 ```csharp //序列化 using System.IO; using System.Runtime.Serialization.Formatters.Binary; public static void SerializeObject(string filename, object obj) { BinaryFormatter formatter = new BinaryFormatter(); using (FileStream stream = new FileStream(filename, FileMode.Create)) { formatter.Serialize(stream, obj); } } //反序列化 public static object DeserializeObject(string filename) { BinaryFormatter formatter = new BinaryFormatter(); using (FileStream stream = new FileStream(filename, FileMode.Open)) { return formatter.Deserialize(stream); } } ``` 2.使用DataContractSerializer进行序列化反序列化,DataContractSerializer是.NET Framework中的一个类,它可以将对象序列化为XML格式,也可以将XML格式反序列化为对象。 ```csharp //序列化 using System.IO; using System.Runtime.Serialization; using System.Xml; public static void SerializeObject(string filename, object obj) { DataContractSerializer serializer = new DataContractSerializer(obj.GetType()); using (XmlWriter writer = XmlWriter.Create(filename)) { serializer.WriteObject(writer, obj); } } //反序列化 public static object DeserializeObject(string filename, Type type) { DataContractSerializer serializer = new DataContractSerializer(type); using (XmlReader reader = XmlReader.Create(filename)) { return serializer.ReadObject(reader); } } ``` 3.使用Json.NET进行序列化反序列化Json.NET是一个流行的第三方JSON库,它可以将对象序列化JSON格式,也可以将JSON格式反序列化为对象。 ```csharp //序列化 using Newtonsoft.Json; public static void SerializeObject(string filename, object obj) { string json = JsonConvert.SerializeObject(obj); File.WriteAllText(filename, json); } //反序列化 public static object DeserializeObject(string filename, Type type) { string json = File.ReadAllText(filename); return JsonConvert.DeserializeObject(json, type); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值