Bootstrap

Unity数据持久化 之 向文件流读写(详细Plus版)

本文仅作笔记学习和分享,不用做任何商业用途

本文包括但不限于unity官方手册,unity唐老狮等教程知识,如有不足还请斧正​​

 在 Unity 手册中,FileStream 并没有单独的详细介绍,因为它是 .NET 框架的一部分,而不是 Unity 特有的类

Unity - Manual: Streaming Assets (unity3d.com) 

前置知识:
Unity数据持久化 之 二进制存储法-CSDN博客,你必须要知道如何将常用数据转为byte和转回来,知道字符串是通过特殊的Encoding方法转为byte的

1.什么是文件流

        文件流文件流,可以理解为将文件中的数据以流水一样的方式(有序地)通过一个通道去传输

        在定义上是指在计算机中用于处理文件输入和输出操作的一种数据流。它可以将数据从一个地方传输到另一个地方,例如从内存写入到硬盘文件,或者从硬盘文件读取到内存。文件流通常分为两种类型:字节流和字符流

        在unity中,filestream属于字节流

2.基本方法(引用注意)

2.1打开或创建文件

该笔记来源于唐老狮

 2.2重要方法

一个重要的使用方法

4

3.写入与读取

我将进行如下示范,请先有个大概的认识,代码看完之后再看这张图会很清晰

4.向文件流中写入字节

写入字节可以按如下步骤:

 public void WriteBytes()
 {
     //首先在Asset下创建一个文件流,叫做Mydata,格式为json
     //之后试着向其中写入520这个数字,并尝试写入字符串三个字 
     using (FileStream fs = File.Open(Application.dataPath + "/Mydata.json", FileMode.OpenOrCreate))
     {
         //先将520转为字节
         byte[] bytes = BitConverter.GetBytes(520);
         //然后写入文件之中
         fs.Write(bytes, 0, bytes.Length);

         //为了方便,字符串则应先写入字符串长度,知道指定内容后,再写入字符串
         byte[] contentBytes = Encoding.UTF8.GetBytes("字符串");
         byte[] lengthBytes = BitConverter.GetBytes(contentBytes.Length);
         //写入字符串长度 和 写入字符串
         fs.Write(lengthBytes, 0, lengthBytes.Length);
         fs.Write(contentBytes, 0, contentBytes.Length);
     }
 }

5.读取文件流中的字节

读取一般数据可以如下操作:

 

 //首先需要打开需要读取的文件
 using (FileStream fs = File.Open(Application.dataPath + "/Mydata.json", FileMode.Open))
 {
     //先试着将520读取出来
     byte[] readbytes = new byte[4];
     int index = fs.Read(readbytes,0, readbytes.Length);//查看一下返回值
     int number = BitConverter.ToInt32(readbytes,0);
     Debug.Log($"数字{number},索引到了{index}这个位置");


     //再试着将字符串读取出来

 }

            //再试着将字符串读取出来
            //先读取字符串长度
            byte[] readLengthbytes = new byte[4];
            fs.Read(readLengthbytes,0, readLengthbytes.Length);
            int contentLength = BitConverter.ToInt32(readLengthbytes, 0);
            Debug.Log("读取到的字符串长度为"+contentLength);

            //根据长度声明容器,再读取字符串内容
            byte[] contentBytes = new byte[contentLength];
            int index1 = fs.Read(contentBytes, 0, contentBytes.Length);
            string content = Encoding.UTF8.GetString(contentBytes);
           
            Debug.Log($"读到的字符串内容为 {content},索引到了{index1}这个位置");

在UTP-8中,一个中文字符串占3个字节 

 

;