我有一个流阅读器,用于将数据解析为程序。当我第一次从主菜单打开场景时,流阅读器在解析数据时正常工作(由于代码很长,我省略了我的代码段中的解析)。第一次运行时输出到屏幕的text.text是G.如果我加载回主菜单,然后返回到这个场景,但text.text输出是我的代码读取文本的文本文档的第一行.text = line我试图找出原因。 sr.Close()不是关闭流阅读器的正确方法吗?或者文件仍以某种方式打开?非常感谢任何人都可以提供的任何帮助。
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";
}
}
这就是我加载场景的方式
public void LoadPressed() {
scenesDropdown.gameObject.SetActive(false);
loadButton.SetActive(false);
SceneManager.LoadScene(scenesArray[scenesDropdown.value]);
}
答案 0 :(得分:3)
以正确的方式使用do close stream,这是因为StreamReader类已经实现了接口IDisposable,这让我们可以使用using语句,它在SreamReader中自动调用Dispose方法并在该方法中清除资源并关闭打开文件,如果需要,作为最后一步称为垃圾收集器
using (StreamReader sr = new StreamReader(s))
{
//do stuff with stream reader
//sr.Close();
}
答案 1 :(得分:2)
您的问题与“垃圾收集”有关(请访问此网址:“https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/”) 简单的答案是C#可以在你使用它们之后释放(处理)很多东西,但像“files”这样的东西不是其中之一。您必须在使用后释放它们,如果不这样做,您的文件将被打开,而另一个进程无法访问它。完成工作后,您需要处理“StreamReader”。并且“使用”这样做(你不需要为此编写自定义处理器)。
using (StreamReader sr = new StreamReader("Your file path"))
{
//do your work
}
之后,文件将自动释放。