C# 在Unity中重新加载场景后StreamReader无法正常工作
我有一个流阅读器,我正在使用它将数据解析到程序中。当我第一次从主菜单打开场景时,流读取器在解析数据时工作正常(我在代码段中省略了解析,因为代码很长)。第一次运行时,屏幕上的text.text输出为G。如果我返回主菜单,然后返回此场景,则text.text输出是文本文档的第一行,我的代码在其中读取text.text=行,我正在尝试找出原因。sr.Close()不是关闭流读取器的正确方法吗?还是该文件仍处于打开状态C# 在Unity中重新加载场景后StreamReader无法正常工作,c#,unity3d,streamreader,C#,Unity3d,Streamreader,我有一个流阅读器,我正在使用它将数据解析到程序中。当我第一次从主菜单打开场景时,流读取器在解析数据时工作正常(我在代码段中省略了解析,因为代码很长)。第一次运行时,屏幕上的text.text输出为G。如果我返回主菜单,然后返回此场景,则text.text输出是文本文档的第一行,我的代码在其中读取text.text=行,我正在尝试找出原因。sr.Close()不是关闭流读取器的正确方法吗?还是该文件仍处于打开状态 void Start () { text.text = "A&qu
void Start () {
text.text = "A";
trimAndPlaceDataSets = GetComponent<TrimAndPlaceDataSets> ();
text.text = "B";
string AthenaData = Application.streamingAssetsPath + "/Athena.txt";
text.text = "C";
PopulateAthenaData(AthenaData);
}
void PopulateAthenaData(string s){
text.text = "D";
using (StreamReader sr = new StreamReader(s)) {
text.text = "E";
string line = sr.ReadLine();
text.text = line;
while (line != null) {
//Do Stuf
sr.ReadLine();
}
sr.Close();
text.text = "G";
}
}
正确使用do close stream,这是因为StreamReader类实现了接口IDisposable,这允许使用using语句,该语句在作用域结束后自动调用SreamReader中的Dispose方法,并在该方法中清除资源和关闭打开的文件,如果需要,最后一步称为垃圾收集器
using (StreamReader sr = new StreamReader(s))
{
//do stuff with stream reader
//sr.Close();
}
正确使用do close stream,这是因为StreamReader类实现了接口IDisposable,这允许使用using语句,该语句在作用域结束后自动调用SreamReader中的Dispose方法,并在该方法中清除资源和关闭打开的文件,如果需要,最后一步称为垃圾收集器
using (StreamReader sr = new StreamReader(s))
{
//do stuff with stream reader
//sr.Close();
}
您的问题是关于“垃圾收集”(访问此Url:)
简单的回答是,C#可以在你使用它们之后释放(处置)很多东西,但像“文件”之类的东西不在其中。您必须在使用后释放它们,如果不这样做,您的文件将被打开,另一个进程无法访问该文件。您需要在工作完成后处理“StreamReader”。而“使用”则可以做到这一点(您不需要为此编写自定义处理器)
之后,文件将自动释放。您的问题是关于“垃圾收集”(访问此Url:)
简单的回答是,C#可以在你使用它们之后释放(处置)很多东西,但像“文件”之类的东西不在其中。您必须在使用后释放它们,如果不这样做,您的文件将被打开,另一个进程无法访问该文件。您需要在工作完成后处理“StreamReader”。而“使用”则可以做到这一点(您不需要为此编写自定义处理器)
之后,文件将自动释放。考虑使用“
using
”语句和实现IDisposable
的类,如StreamReader
。当StreamReader
退出作用域时,它将自动关闭并处理,从而简化您的逻辑,特别是在考虑异常处理时。您如何将其加载回这些场景?运行游戏时是否使用LoadScene()?我使用的是主菜单中的SceneManager.LoadScene(字符串)。在编辑中添加了代码。请不要在问题中添加诸如“高级[sic]中的感谢”之类的注释。请考虑使用“<代码>使用< /代码>”语句,如“代码> StreamReader < /Cord>”,实现<代码> IDISPOSTABLE < /代码>。当StreamReader
退出作用域时,它将自动关闭并处理,从而简化您的逻辑,特别是在考虑异常处理时。您如何将其加载回这些场景?运行游戏时是否使用LoadScene()?我使用的是主菜单中的SceneManager.LoadScene(字符串)。在编辑中添加了代码。请不要在问题中添加诸如“高级[sic]中的感谢”之类的注释。请参阅。看起来像无限循环,因为在您的代码段中,您从未将行分配给null,缺少:line=sr.ReadLine();这个答案和上面的答案有什么区别?您必须在15分钟后添加新答案,即使问题已经解决。也没有什么改进…唯一的区别是我之前回答的和OP使用的是我的解决方案,但被接受的答案更详细哦,是的,我刚刚意识到你首先回答了。很抱歉。请不要在你未来的答案中仅仅张贴代码。否则,您的答案可能会被否决+1。看起来像是无限循环,因为在您的代码段中,您从未将行指定为null,缺少:line=sr.ReadLine();这个答案和上面的答案有什么区别?您必须在15分钟后添加新答案,即使问题已经解决。也没有什么改进…唯一的区别是我之前回答的和OP使用的是我的解决方案,但被接受的答案更详细哦,是的,我刚刚意识到你首先回答了。很抱歉。请不要在你未来的答案中仅仅张贴代码。解释一下,否则你的答案可能会被否决+1。
using (StreamReader sr = new StreamReader("Your file path"))
{
//do your work
}