文字介绍

在Unity中,你会遇到一些不同的对象流,它们都是用于处理不同类型的输入和输出的。这些流对象基本都源自. NET Framework,并且具有各自的特点和适用场景。这里是一些你可能在Unity中用到的流对象:

  1. FileStream:FileStream 类提供了对文件的读写访问。你可以使用 FileStream 对象来操作文件或文件系统。由于它是一个流,所以你可以使用它来进行异步读写操作,这在处理大型文件或进行网络操作时非常有用。另外,它允许你直接访问文件系统,这意味着你可以使用它来读写元数据,如文件属性和权限。

  2. MemoryStream:MemoryStream 类创建一个流,其后备存储是内存。这个类非常有用,因为它允许你在内存中操作数据,而无需每次都写入磁盘或网络。这在处理需要频繁读写的数据时可以提高性能。因为你可以控制数据什么时候写入或读取,所以它非常适合处理大量数据。

  3. StreamReader / StreamWriter:这两个类是基于文本的数据流和文件操作的工具。StreamReader 提供了从一个字节流中读取字符的方法,而 StreamWriter 则提供了向一个字节流中写入字符的方法。这些类是处理文本文件的理想工具,因为它们提供了大量的方法来读取和写入文本,包括对新行字符的支持。

  4. BinaryReader / BinaryWriter:这两个类提供了从二进制流中读取和写入原始数据类型的方法。这使得它们成为处理二进制文件的理想工具。二进制数据的优点是,它占用的空间小,而且读写速度快。这是因为二进制数据是计算机的原生格式,计算机不需要将它转换为其他格式。

  5. XmlReader:XmlReader 是一个抽象类,它为 XML 数据提供了一种快速、非缓存的前向只读访问方式。因为 XmlReader 是一个前向的读取器,它在读取大型 XML 数据文件时非常有用,因为它不需要一次性将整个文件加载到内存中。另一方面,由于 XmlReader 只提供了前向的读取,因此它不支持类似随机访问或回退等功能。

  6. XmlWriter:XmlWriter 是一个抽象类,它提供了一种快速、非缓存的方式来写入 XML 数据。与 XmlReader 类似,XmlWriter 是一个前向的写入器,它一次只写入一个 XML 节点,这使得它可以处理大型 XML 数据文件而不会占用过多内存。

对于 JSON 和 XML,它们的工作方式如下:

  • JSON:JSON 是 JavaScript Object Notation 的缩写,它是一种基于文本的数据交换格式,设计用来使数据的传输更小、更快且更易解析。在 Unity 中,你可以使用 JsonUtility 类将数据对象序列化为 JSON 字符串,或者将 JSON 字符串反序列化为数据对象。这对于保存游戏设置、玩家进度等游戏数据非常有用。

  • XML:XML 是 eXtensible Markup Language 的缩写,它是一种标记语言,设计用来标记数据并使其具有结构性。在 Unity 中,你可以使用 XmlSerializer 类将数据对象序列化为 XML 文档,或者将 XML 文档反序列化为数据对象。这对于保存复杂的数据结构,如游戏等级、角色属性等非常有用。

代码介绍

  1. FileStream:在Unity中,FileStream主要用于读写文件。

    // 以异步方式写入文件
    using (FileStream fs = new FileStream("test.txt", FileMode.Create, FileAccess.Write, FileShare.None, 4096, true)) {
        byte[] data = Encoding.UTF8.GetBytes("Hello, World!");
        await fs.WriteAsync(data, 0, data.Length);
    }
    
    // 以异步方式读取文件
    using (FileStream fs = new FileStream("test.txt", FileMode.Open, FileAccess.Read, FileShare.Read, 4096, true)) {
        byte[] buffer = new byte[fs.Length];
        await fs.ReadAsync(buffer, 0, buffer.Length);
        string text = Encoding.UTF8.GetString(buffer);
        Debug.Log(text);
    }
    
    
  2. MemoryStreamMemoryStream主要用于处理内存中的数据。

using (MemoryStream ms = new MemoryStream()) {
    byte[] data = Encoding.UTF8.GetBytes("Hello, World!");
    ms.Write(data, 0, data.Length);
    ms.Position = 0;
    StreamReader sr = new StreamReader(ms);
    string text = sr.ReadToEnd();
    Debug.Log(text);
}
  1. StreamReader / StreamWriter:它们通常用于处理文本数据。

    // 写入文件
    using (StreamWriter writer = new StreamWriter("test.txt")) {
        writer.WriteLine("Hello, World!");
    }
    
    // 读取文件
    using (StreamReader reader = new StreamReader("test.txt")) {
        string line = reader.ReadLine();
        Debug.Log(line);
    }
    
  2. BinaryReader / BinaryWriter:它们用于处理二进制数据。

// 写入文件
using (BinaryWriter writer = new BinaryWriter(File.Open("test.dat", FileMode.Create))) {
    writer.Write(123);
    writer.Write(4.56f);
    writer.Write(true);
    writer.Write("Hello, World!");
}

// 读取文件
using (BinaryReader reader = new BinaryReader(File.Open("test.dat", FileMode.Open))) {
    int number = reader.ReadInt32();
    float floatNumber = reader.ReadSingle();
    bool boolean = reader.ReadBoolean();
    string text = reader.ReadString();
    Debug.Log($"{number}, {floatNumber}, {boolean}, {text}");
}

对于JSONXML的序列化和反序列化,这里有两个简单的例子:

JSON:

public class MyClass {
    public int number;
    public string text;
}

MyClass myClass = new MyClass();
myClass.number = 123;
myClass.text = "Hello, World!";

// 序列化
string json = JsonUtility.ToJson(myClass);
File.WriteAllText("test.json", json);

// 反序列化
string jsonFromFile = File.ReadAllText("test.json");
MyClass myClassFromFile = JsonUtility.FromJson<MyClass>(jsonFromFile);
Debug.Log($"{myClassFromFile.number}, {myClassFromFile.text}");

XML:

public class MyClass {
    public int number;
    public string text;
}

MyClass myClass = new MyClass();
myClass.number = 123;
myClass.text = "Hello, World!";

XmlSerializer serializer = new XmlSerializer(typeof(MyClass));

// 序列化
using (StreamWriter writer = new StreamWriter("test.xml")) {
    serializer.Serialize(writer, myClass);
}

// 反序列化
using (StreamReader reader = new StreamReader("test.xml")) {
    MyClass myClassFromFile = (MyClass)serializer.Deserialize(reader);
    Debug.Log($"{myClassFromFile.number}, {myClassFromFile.text}");
}