关于.net:我是否需要将流(C#)重置为开头?

Do I need to reset a stream(C#) back to the start?

我不太了解C中的流。现在我有了一个流,我把它放入流阅读器并阅读它。稍后在其他方法中,我需要读取流(同一个流对象),但这次我得到了这个错误

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
System.ArgumentException was unhandled by user code
  Message="Stream was not readable."
  Source="mscorlib"
  StackTrace:
       at System.IO.StreamReader..ctor(Stream stream, Encoding encoding, Boolean detectEncodingFromByteOrderMarks, Int32 bufferSize)
       at System.IO.StreamReader..ctor(Stream stream)
       at ExtractTitle(Stream file) in :line 33
       at GrabWebPage(String webPath) in :line 62
       at lambda_method(ExecutionScope , ControllerBase , Object[] )
       at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)
       at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
       at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
       at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClassa.<InvokeActionMethodWithFilters>b__7()
       at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation)
  InnerException:

所以我在想,也许通过阅读这条小溪,它会走到尽头。然后当我再次尝试阅读它时,它就在流的末尾,这就是为什么我会得到这个错误。

有人能解释一下吗?

谢谢


当你读完一个流,特别是用StreamReaderReadToEnd方法时,你必须把它读回开头。可以这样做:

1
2
3
4
StreamReader sr = new StreamReader(stream);
sr.ReadToEnd();
stream.Seek(0, SeekOrigin.Begin); //StreamReader doesn't have the Seek method, stream does.
sr.ReadToEnd(); // This now works


您的结论是正确的;一旦到达流的末尾,在流中重置位置之前,您将无法读取更多数据:

1
myStream.Position = 0;

这相当于追寻开始。请注意,您的流必须支持寻找这个方法才能工作;并非所有的流都支持。您可以使用CanSeek属性检查这个。


BaseStream表示StreamReader

1
2
 StreamReader sr = new StreamReader(pFileStream);
 sr.BaseStream.Seek(0, SeekOrigin.Begin);