文字介绍
在Unity中,你会遇到一些不同的对象流,它们都是用于处理不同类型的输入和输出的。这些流对象基本都源自. NET Framework,并且具有各自的特点和适用场景。这里是一些你可能在Unity中用到的流对象:
-
FileStream:FileStream 类提供了对文件的读写访问。你可以使用 FileStream 对象来操作文件或文件系统。由于它是一个流,所以你可以使用它来进行异步读写操作,这在处理大型文件或进行网络操作时非常有用。另外,它允许你直接访问文件系统,这意味着你可以使用它来读写元数据,如文件属性和权限。
-
MemoryStream:MemoryStream 类创建一个流,其后备存储是内存。这个类非常有用,因为它允许你在内存中操作数据,而无需每次都写入磁盘或网络。这在处理需要频繁读写的数据时可以提高性能。因为你可以控制数据什么时候写入或读取,所以它非常适合处理大量数据。
-
StreamReader / StreamWriter:这两个类是基于文本的数据流和文件操作的工具。StreamReader 提供了从一个字节流中读取字符的方法,而 StreamWriter 则提供了向一个字节流中写入字符的方法。这些类是处理文本文件的理想工具,因为它们提供了大量的方法来读取和写入文本,包括对新行字符的支持。
-
BinaryReader / BinaryWriter:这两个类提供了从二进制流中读取和写入原始数据类型的方法。这使得它们成为处理二进制文件的理想工具。二进制数据的优点是,它占用的空间小,而且读写速度快。这是因为二进制数据是计算机的原生格式,计算机不需要将它转换为其他格式。
-
XmlReader:XmlReader 是一个抽象类,它为 XML 数据提供了一种快速、非缓存的前向只读访问方式。因为 XmlReader 是一个前向的读取器,它在读取大型 XML 数据文件时非常有用,因为它不需要一次性将整个文件加载到内存中。另一方面,由于 XmlReader 只提供了前向的读取,因此它不支持类似随机访问或回退等功能。
-
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 文档反序列化为数据对象。这对于保存复杂的数据结构,如游戏等级、角色属性等非常有用。
代码介绍
-
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); }
-
MemoryStream:
MemoryStream
主要用于处理内存中的数据。
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);
}
-
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); }
-
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}");
}
对于JSON和XML的序列化和反序列化,这里有两个简单的例子:
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}");
}