在第二集中讲过,IO读取按照读取的文件大小分成了两种,一种用来读小文件,一种用来读大文件。Unity 读取外配-第二集-本地读取(IO.File)形式读取txt内容_unity读取本地文件_菌菌巧乐兹的博客-CSDN博客
一、为什么要用FileStram数据流
假如,我让你喝一杯水,你可能吨吨吨就喝完了。
如果我让你喝一桶水,你总不能直接抱着桶往嘴里倒吧,这样要么水漏出去了,要么撑死了。
一般来说,我们会搞个吸管什么的,一点一点喝。
二、程序逻辑
1.创建一个数据流(先创建一个吸管)
2.根据读取文件的大小,创建一个Byte数组来接这个数据
3.慢慢读取文件,装进bytes里
4.读完文件后,数据流(吸管)用完了,扔了吧
5.建立一个Texture
6.把Texture变成Sprite
三、以上逻辑代码
//建一个列表储存图片
public List<Sprite> sprites;
//读取图片
void GetImageFromIO(string path) {
//创建数据流 地址 打开 读取
FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read);
//创建一个和fileStream一样大的Byte数组用来接数据
byte[] bytes = new byte[fileStream.Length];
//慢慢读取文件,装进bytes里,从0开始,装到数据流读完
fileStream.Read(bytes, 0, (int)fileStream.Length);
//数据流(吸管)用完了,扔了吧
fileStream.Dispose();
//创建Texture,后面的宽高都不要紧,是临时建的
Texture2D texture2D = new Texture2D(10, 10);
texture2D.LoadImage(bytes);
//把Texture变成sprite
Sprite sprite = Sprite.Create(texture2D, new Rect(0, 0, texture2D.width, texture2D.height), new Vector2(0.5f, 0.5f));
sprites.Add(sprite);
}
四、批量读取某一文件夹下图片程序逻辑
1.获取文件夹内所有的地址
2.如果这些地址的后缀是图片格式
3.读取这些图片
五、批量读取某一文件夹下图片程序代码
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
public class Tool_ReadPics : MonoBehaviour
{
string path;
public List<Sprite> sprites;
void Start()
{
//我把图片放在streamingAssets里的photos里的
path = Application.streamingAssetsPath + "/photos";
StartCoroutine(ReadFolders(path));
}
IEnumerator ReadFolders(string path) {
//获取path下的所有地址
string[] allPath = Directory.GetFiles(path);
//判断这些地址是否是图片格式
foreach (string singlePath in allPath)
{
if(Path.GetExtension(singlePath)==".jpg"
|| Path.GetExtension(singlePath) == ".png")
{
//是图片格式就读取图片
GetImageFromIO(singlePath);
yield return new WaitForEndOfFrame();
}
}
}
//读取图片
void GetImageFromIO(string path) {
//创建数据流 地址 打开 读取
FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read);
//创建一个和fileStream一样大的Byte数组用来接数据
byte[] bytes = new byte[fileStream.Length];
//慢慢读取文件,装进bytes里,从0开始,装到数据流读完
fileStream.Read(bytes, 0, (int)fileStream.Length);
//数据流(吸管)用完了,扔了吧
fileStream.Dispose();
//创建Texture,后面的宽高都不要紧,是临时建的
Texture2D texture2D = new Texture2D(10, 10);
texture2D.LoadImage(bytes);
//把Texture变成sprite
Sprite sprite = Sprite.Create(texture2D, new Rect(0, 0, texture2D.width, texture2D.height), new Vector2(0.5f, 0.5f));
sprites.Add(sprite);
}
}
六、如果某一文件夹内还有很多文件夹,图片在这些文件夹内,或者文件夹套文件夹再有图片
重点语法:获取地址下所有文件夹的地址
string[] p = Directory.GetDirectories(path);
没找到文件夹就算了,找到文件夹就继续执行ReadFolders()这个方法
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
public class Tool_ReadPics : MonoBehaviour
{
string path;
public List<Sprite> sprites;
void Start()
{
path = Application.streamingAssetsPath + "/photos";
StartCoroutine(ReadFolders(path));
}
IEnumerator ReadFolders(string path) {
//获取path下的所有地址
string[] allPath = Directory.GetFiles(path);
//判断这些地址是否是图片格式
foreach (string singlePath in allPath)
{
if(Path.GetExtension(singlePath)==".jpg"
|| Path.GetExtension(singlePath) == ".png")
{
GetImageFromIO(singlePath);
yield return new WaitForEndOfFrame();
}
}
//获取地址下所有文件夹的地址
string[] p = Directory.GetDirectories(path);
if (p.Length == 0)
{
}
else
{
foreach (string p0 in p)
{
yield return StartCoroutine(ReadFolders(p0));
}
}
}
//读取图片
void GetImageFromIO(string path) {
//创建数据流 地址 打开 读取
FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read);
//创建一个和fileStream一样大的Byte数组用来接数据
byte[] bytes = new byte[fileStream.Length];
//慢慢读取文件,装进bytes里,从0开始,装到数据流读完
fileStream.Read(bytes, 0, (int)fileStream.Length);
//数据流(吸管)用完了,扔了吧
fileStream.Dispose();
//创建Texture,后面的宽高都不要紧,是临时建的
Texture2D texture2D = new Texture2D(10, 10);
texture2D.LoadImage(bytes);
//把Texture变成sprite
Sprite sprite = Sprite.Create(texture2D, new Rect(0, 0, texture2D.width, texture2D.height), new Vector2(0.5f, 0.5f));
sprites.Add(sprite);
}
}