如何正确使用StreamWriter类?
我正在使用StreamWriter
类进行文件操作,这段代码中是否有任何我没有看到的问题?
比如我需要把它放到try catch finally
块中吗?
StreamWriter sr = new StreamWriter(streamFolder); sr.Write(details); File.SetAttributes(streamFolder, FileAttributes.Hidden); sr.Close();
您的代码有什么问题? 如果在关闭流之前发生某些exception,则流将保持打开状态,并且不会释放系统资源:
StreamWriter sr = new StreamWriter(streamFolder); sr.Write(details); // some exception occurs here File.SetAttributes(streamFolder, FileAttributes.Hidden); sr.Close();
因此,您需要确定该流将被关闭。 这可以通过try...finally
块来实现:
StreamWriter sr = new StreamWriter(streamFolder); try { sr.Write(details); // some exception occurs here File.SetAttributes(streamFolder, FileAttributes.Hidden); } finally { sr.Close(); }
但StreamWriter实现了IDisposable接口,因此您可以让C#编译器通过将writer使用包装到using
块中来自动执行:
using(StreamWriter sr = new StreamWriter(streamFolder)) { sr.Write(details); // some exception occurs here File.SetAttributes(streamFolder, FileAttributes.Hidden); }
此代码将编译为:
StreamWriter sr = new StreamWriter(streamFolder); try { sr.Write(details); // some exception occurs here File.SetAttributes(streamFolder, FileAttributes.Hidden); } finally { if (sr != null) sr.Dispose(); }
手动实现之间的唯一区别是null-check和方法Dispose
被调用而不是Close
。 但实际上,当您调用Close()
或Dispose()
将执行相同的代码:
this.Dispose(true); GC.SuppressFinalize(this);
您可以阅读有关Dispose方法实现的更多信息。
您应该使用using语句:
using (StreamWriter sr = new StreamWriter(streamFolder)) { sr.Write(details); File.SetAttributes(streamFolder, FileAttributes.Hidden); }
在using块的末尾,将调用StreamWriter.Dispose,无论是exception还是代码成功运行。
你想用:
using (StreamWriter sr = new StreamWriter(streamFolder)) { sr.Write(details); File.SetAttributes(streamFolder, FileAttributes.Hidden); }
你不需要Close
。
将其包裹在using
块中
using(StreamWriter sr = new StreamWriter(streamFolder)) { sr.Write(details); File.SetAttributes(streamFolder, FileAttributes.Hidden); }
确保你的命名很好,所以streamFolder
可能应该是一个fName
。 如果您觉得可以处理一些IO(或其他)exception,也可以将此代码放入try-catch-finally:
StreamWriter sr; try { sr = new StreamWriter(streamFolder); sr.Write(details); File.SetAttributes(streamFolder, FileAttributes.Hidden); } catch(IOException ex) { //handling IO } finally { if (sr != null) sr.Dispose(); }
System.IO.StreamWriter是System.IDisposable
你必须处理它。 你为什么要关闭一些你不打开的东西?