我对C#中的流不太了解。现在我有一个流放入流阅读器并阅读它。稍后在其他一些方法中,我需要读取流(相同的流对象),但这次我收到此错误
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:
所以我想也许是通过阅读流程到最后。然后,当我再次尝试读取它时,它就在流的末尾,这就是我收到此错误的原因。
那么有人可以对此有所了解吗?
由于
答案 0 :(得分:66)
当您通过StreamReader
的ReadToEnd
方法阅读结尾的流时,您必须Seek
将其重新开始。这可以这样做:
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 :(得分:30)
你的结论是正确的;一旦到达流的末尾,在重置流中的位置之前,您将无法读取更多数据:
myStream.Position = 0;
这相当于回到起点。请注意,您的流必须支持寻求此工作;不是所有的流都可以。您可以使用CanSeek
属性进行检查。
答案 2 :(得分:4)
BaseStream
使用StreamReader
:
StreamReader sr = new StreamReader(pFileStream);
sr.BaseStream.Seek(0, SeekOrigin.Begin);