Unity基本的文件创建、读写

这篇具有很好参考价值的文章主要介绍了Unity基本的文件创建、读写。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、文件创建、删除、遍历等

1.1 创建文件

使用.NET提供的System.IO库中的File静态类,或者FileInfo类等。删除移动拷贝什么的比较简单就不写了,这两个类都能完成,都提供了对文件的基本操作,只不过FileInfo类提供的信息更加详细,还有文件的名称,所属文件夹等。

值得一提的是使用IO库读取文件使用斜杠'/'还是反斜杠'\'只在Windows平台没有区别,两者是可以互相转化的,用斜杠和反斜杠都能读取。但在移动平台必须使用斜杠。

void Start()
    {

        string path = Application.dataPath + "/object.txt";
        path=path.Replace("/","\\");
        //File静态类方式
        if (File.Exists(path))
        {
            Debug.Log("FileExists");
        }
        else
        {
            Debug.Log("FileNotExists");
            File.CreateText(path);
        }

        //FileInfo方式
        FileInfo fileInfo = new FileInfo(path);        
        if (fileInfo.Exists)
        {
            Debug.Log("fileInfoExists");
        }
        else
        {
            Debug.Log("fileInfoNotExists");
            fileInfo.Create();
        }
    }
1.2 遍历目录下的文件以及文件夹

使用DirectoryInfo类和FileInfo类,这两个类都直接继承自FileSystemInfo类,本质是树的遍历。

    void Start()
    {
        
        string path = Application.dataPath;
        path=path.Replace("/","\\");
        DirectoryInfo directoryInfo = new DirectoryInfo(path);
        Foreach(directoryInfo);
    }

    void Foreach(DirectoryInfo directoryInfo)
    {
        DirectoryInfo[] directoryInfos = directoryInfo.GetDirectories();
        for (int i = 0; i < directoryInfos.Length; i++)
        {
            Debug.Log(directoryInfos[i].Name);
            Foreach(directoryInfos[i]);
        }

        FileInfo[] fileInfos = directoryInfo.GetFiles();
        for (int i = 0; i < fileInfos.Length; i++)
        {
            Debug.Log(fileInfos[i].Name);
        }
        
    }

二、文件分类

文件在物理上只有二进制一种存储方式。

文件在逻辑上分为二进制文件和文本文件,文本文件就是在二进制上多了一个编码解析,比如最常见的使用UTF-8编码格式的文本文件。

文件在物理上只有二进制一种存储方式,但我们在读取写入使用时仍然要用逻辑文件的方式。

这句话怎么理解呢,先问一个问题,为什么.NET库会提供这么多的读写API呢,什么文件流啊,什么二进制读写器,什么文本流读写器等等?不都是写个文件吗,最终不都是二进制吗,为啥还要搞这么多不同类型的API。

答案很简单,编码方式,即便在硬盘上存储了一个二进制值是0100 0001(65),我们可以认为这个一字节的二进制是直接按int存的,那么读出来就是65的int类型数据,也可以认为是按ASCII编码存的,那么65对应的字符值为'A'。

再举一个例子,比如我现在有一个数字1要写入硬盘,我下次加载游戏时要使用,那么就有两种方式存储,一,直接以数字1对应的二进制0000 0001写入,二,以字符数据的形式存入,字符'1'的ASCII值写入硬盘,也就是整数49,0011 0001。

我们虽然在物理上只有这一种纯二进制的方式,但是我们存的时候可能是直接存数字,也可能是存数字对应的字符。往绝对方向去讲,.NET完全可以只提供一种读写器,只读写字节流,数据什么的额外做转化就行,这些API本质是一样的,底层都是读取的字节流,只是省去了你手动转化字节数据的过程。你要是用的好,完全可以混着读写。不过最好还是配套读写。

二进制文件可以保存元数据,文本文件不可以,二进制位文件相较于文本文件更节省空间,更多区别自行百度。

三、使用System.IO库实现文件读写

使用.NET提供的System.IO库。只演示最基本的写法,不涉及异步等操作。

3.1使用File类或FileInfo类读写

只演示File类读写。File类还可以协助创建FileStream流对象,然后用流的方式去读写数据。

    void Start()
    {
        string path = Application.dataPath+"\\object.txt";
        path=path.Replace("/","\\");
        //直接以文本的方式读取        
        string content=File.ReadAllText(path);
        Debug.Log(content);
        //使用字节数组读取
        byte[] bytes = File.ReadAllBytes(path);
        //做解码,当然不止这一个类可以做解码
        content=System.Text.Encoding.UTF8.GetString(bytes);
        Debug.Log(content);
        //File文件协助创建文件流的方式读取
        FileStream fileStream= File.Open(path,FileMode.Open);
        fileStream.Read(bytes, 0, bytes.Length);
        content=System.Text.Encoding.UTF8.GetString(bytes);
        fileStream.Close();
        Debug.Log(content);
        
        File.WriteAllText(path,"Hello world!",Encoding.Default);
              
    }
3.2 使用FileStream读写

FileStream用于以字节流的方式(以字节为单位)读取文件,读出来的数据是字节数组,写入同理。

既支持同步读写操作,也支持异步读写操作,适合读取大文件,同时也可以读取音频以及图片等资源,不过音频什么的一般用Unity的API直接读取了,省的再去解析数据。使用.NET主要是做一些配置文件的读取,至于其他资源Unity有自己可用的资源加载方案。

同一时间只允许对一个文件进行读写,文件流用完之后要及时关闭并释放资源。

文件流的读写不要同时进行,除非你清楚这么做。文件流内部维护了一个文件指针用于读写文件,文件流读完后指针指向文末,而在这一次流内要是写文件就从当前流的文件指针位置即文末开始写。变成了以追加的方式写入数据。

void Start()
    {
        string path = Application.dataPath+"\\object.txt";
        path=path.Replace("/","\\");        

        FileStream fileStream = new FileStream(path,FileMode.Open);
        
        byte[] bytes = new byte[1024];
        fileStream.Read(bytes,0,bytes.Length);
        string content=System.Text.Encoding.UTF8.GetString(bytes);
        Debug.Log(content);
        
        //以Append的方式写入数据,不能在同一次流内读和写,除非你清楚这么做。
        string content1 = "hello world!";
        bytes=System.Text.Encoding.Default.GetBytes(content1);
        //fileStream.Write(bytes);
        fileStream.Write(bytes,0,bytes.Length);
        fileStream.Close();
        
        //从头写入数据,要是想从文末追加内容,只需设置为FileMode.Append
        FileStream fileStream1 = new FileStream(path, FileMode.Open);
        fileStream1.Write(bytes);
        fileStream1.Close();
    }
3.3 使用StreamReader读取,使用StreamWriter写入

StreamReader以一种特定的编码从字节流中读取字符,或者说以字符流的方式读取文件,不同于FileStream,StreamReader直接返回解码后的字符串,省去了程序员手动转换字节数组的过程。写入同理。

void Start()
    {
        string path = Application.dataPath+"\\object.txt";    

        StreamReader streamReader = new StreamReader(path);
        string content=streamReader.ReadToEnd();
        Debug.Log(content);
        streamReader.Close();
        
        StreamWriter streamWriter = new StreamWriter(path);
        string content1 = "hello world!";
        streamWriter.Write(content1);
        streamWriter.Close();
    }
3.4 使用BinaryReader 读取,使用BinaryWriter写入

BinaryReader直接读取二进制值,官网的话来说就是用特定的编码将基元数据类型读作二进制值。这个理解起来有点困难,官网举的代码可以很好的说明问题。

BinaryReader 类 (System.IO) | Microsoft Learn

使用这个要注意的是,你要是用BinaryReader读的话,那么这个文件最好是用BinaryWriter写入的,否则BinaryReader无法知道怎么读的数据,很容易读超过文件流的范围,或者读错数据。

比如你用BinaryWriter写入非记事本默认编码的数据,然后用记事本打开,就会出现奇奇怪怪的数据,你用二进制编辑器打开才会显示正确数据,你可以理解你存进去一个int值,但是你用记事本默认读取时把int数当成对应的字符编码读取,自然出现其他怪怪的数据。

BinaryReader一次读取多少字节的数据由你给出的数据类型或者说调用的API指出,读出的二进制字节会直接转成你需要的数据类型。

3.5 使用using释放资源

文件流使用完后要及时调用Dispose接口释放资源,但很多时候我们可能会忘记关闭,using就可以帮助我们。

        using (FileStream stream=File.Open(path,FileMode.Open))
        {
            stream.Write(null,0,0);
        }

使用using会帮我们自动释放流资源。

3.6 怎么使用这几个API

读写字符数据(比如Json字符串)的时候使用StreamReader,不读写字符数据时(比如大量数字)可以考虑使用 BinaryReader。

单纯读写字节数组使用FileStream,FileStream返回的是纯粹的字节数组(直接从硬盘读取的二进制流),需要自己根据存储时用的编码做额外转化。使用字节数组也可以根据某种算法实现文件加密,比如在字节序列中随机插入几个0和1等等。

还有就是你是怎么写入文件时,最好也用配套的读取,当然如果你很熟悉各个读写API的功能和你写入时的方式,也可以混着读写,毕竟物理本质是二进制文件。

四、使用Unity提供的API进行文件读取

UnityAPI大多都提供了对文件的读取,但无法动态写入数据。Unity的API必须使用正斜杠'/'读取。官网原话:Unity 中的所有资源名称和路径都使用正斜杠,即使是在 Windows 上。

4.1使用UnityEngine.Windows.File下的File类

这个功能不多,不再赘述。

4.2使用UnityWebRequest类读取

UnityWebRequest类也可用于访问本地文件。

    void Start()
    {
        string path = Application.dataPath + "/object.txt";      

        UnityWebRequest webRequest = UnityWebRequest.Get(path);
        webRequest.SendWebRequest();
        while (true)
        {
            if (webRequest.downloadHandler.isDone)
            {
                string content=webRequest.downloadHandler.text;
                webRequest.Dispose();
                Debug.Log(content);
                break;
            }
        }
    }
4.3使用Resources类读取

Resources读取的文件必须处于Resources下,且一旦打包会被加密无法通过IO库写入。并且文件路径不需要扩展名。路径直接从Resources下出发,不含Resources。

    void Start()
    {
        string path = "object";
        TextAsset textAsset = Resources.Load<TextAsset>(path);
        Debug.Log(textAsset.text);
    }
4.4 使用AssetBundle类读取

文本文件必须位于AB包内。

void Start()
    {
        
        string path =Application.dataPath+ "/object.ab";
        AssetBundle assetBundle=AssetBundle.LoadFromFile(path);
        TextAsset textAsset=assetBundle.LoadAsset<TextAsset>("object.txt");
        Debug.Log(textAsset.text);
    }
4.5 使用AssetDatabase类读取

只适用于编辑器下,文件路径从Assets下出发,包含Assets。

void Start()
    {
        
        string path ="Assets/object.txt";
        TextAsset textAsset=AssetDatabase.LoadAssetAtPath<TextAsset>(path);
        Debug.Log(textAsset.text);
    }

四、数据反序列化

文件被读取之后一般都是字节流或者直接字符串,我们需要按照序列化时的格式进行反序列化后才能使用。文章来源地址https://www.toymoban.com/news/detail-462715.html

到了这里,关于Unity基本的文件创建、读写的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android开发创建txt文件并读写txt文件数据

    在Android开发过程中,经常会遇到需要创建txt文件并写入数据的情况。今天我们来介绍一下如何实现这样的功能。 代码中的mStrPath为txt文件存储的路径,根据个人的需求确定路径,此处以 根目录,并命名为transcript.txt 为例,即 1. 读出txt文件的数据 3. 写入txt数据 [注]: ①当F

    2024年02月12日
    浏览(48)
  • 2.php开发-个人博客项目&文件操作类&编辑器&上传下载删除读写

    ​ ​ ​ 文件上传类: form表单上传文件 --文件上传,--php接收,处理 action ---提交给谁处理 move函数移到文件 ---文件上传漏洞啊!!! ——ueditor 实现编辑器的加载 上传文件的方法: 用了编辑器,就要用编辑器去验证了(编辑器没漏洞,那就没漏洞——他有问题就有问题,

    2024年01月21日
    浏览(48)
  • 【数据结构】单链表基本操作:查找、插入、删除、创建

     链表由结点组成,结点由数据域和指针域组成。其中,数据域存放的就是数据元素,指针域存放下一个结点的地址。数据元素可以只有一个,也可以有多个不同类型的数据元素,甚至是数组。下图和代码来自《C Primer Plus》,该链表每个节结点同时含char类型和int类型。 ​​

    2024年02月02日
    浏览(64)
  • Unity自带方法读写JSON文件

    最近使用JSON文件保存模型表情数据,简单记录一下。 首先自定义数据类,需要记录表情每帧的所有BlendShape及时间戳: 使用Unity自带的JSON读写方法: 保存与读取JSON文件: 简单记录,部分变量与方法未展示,仅供参考。

    2024年02月12日
    浏览(50)
  • Unity使用CSV读写表格文件

    CSV(逗号分隔值文件格式):以纯文本形式存储表格数据。 1.挂载脚本 2.回到unity,在脚本组件上输入数据 3.右击Assets文件夹,点击Refresh,可以看到多出了一个StreamingAssets文件夹和data文件 4.使用记事本打开,可以看到写入的数据(使用excel打开会出现乱码,使用wps不会,这里

    2024年02月16日
    浏览(37)
  • Unity 创建/删除/启用/禁用组件的惯用方法

    1、创建组件: Unity 创建组件可以通过编辑器中的\\\"Add Component\\\"创建,或者代码动态创建:GameObject.AddComponentT(),如: 2、删除组件: Unity 删除组件可以通过编辑器中组件的“Remove Component”删除,或者代码动态,使用Destroy()或DestroyImmediate()方法,如: 3、启用/禁用组件: 对于

    2024年02月04日
    浏览(39)
  • Unity中的文件读写TXT 与XML

    在游戏开发中,有的单机游戏会用到保存数据到本地,或者根据本地的数据来进行下次的设置。这里,鄙人介绍TXT与xml 的读写。 首先是txt: 新建一个unity工程,创建一个cube,新建一个脚本:CreatTxt挂载到cube上。然后打开脚本。输入一下的代码: 然后保存运行: 运行后的截

    2024年02月04日
    浏览(44)
  • 【Python】Python读写.xlsx文件(基本操作、空值补全等)

    本文介绍如何使用使用 pandas 库来读取xlsx文件中的数据。 需要安装openpyxl库才可以读取xlsx文件,使用pip install openpyxl。 当然也可以用其他的库,比如openpyxl、xlrd,可以参考: https://blog.csdn.net/moasad/article/details/120120673 https://blog.csdn.net/liuyingying0418/article/details/101066630 2.1 基本操

    2023年04月13日
    浏览(56)
  • MySQL数据库——存储过程-介绍以及基本语法(特点、创建、调用、查看、删除、示例)

    目录 介绍 特点 基本语法 创建 调用 查看 删除  示例  存储过程是 事先经过编译 并 存储在数据库 中的一段 SQL 语句的 集合 ,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的。 存储过程思想

    2024年02月06日
    浏览(72)
  • Flask 创建文件目录,删除文件目录

     项目结构  app.py templates / index.html 效果图  

    2024年02月16日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包