问题很简单:网络流的 StreamWriter 中的 WriteLine() 是否总是传递整行?还是有一些限制?例如,它只提供某种尺寸的线。
我的意思是,如果我调用 WriteLine(1 行上的一些非常长的字符串(例如 10000000 个字符)),StreamReader 的 ReadLine() 会像我发送它一样接收它吗?或者它只会收到一部分?
问题很简单:网络流的 StreamWriter 中的 WriteLine() 是否总是传递整行?还是有一些限制?例如,它只提供某种尺寸的线。
我的意思是,如果我调用 WriteLine(1 行上的一些非常长的字符串(例如 10000000 个字符)),StreamReader 的 ReadLine() 会像我发送它一样接收它吗?或者它只会收到一部分?
是的,ReadLine
在StreamReader
流的另一端总是会读取一个完整的行(或产生OutOfMemoryException
),但这是ReadLine
网络流的更多属性。在网络级别,对于NetworkStream
,它可能已被拆分为多个单独的发送和接收。
ReadLine
在看到换行符序列之前不会返回。
(警告 - 如果您传递给的字符串在WriteLine
内部包含换行符序列,那么您只会收到该部分的字符串,直到第一个换行符序列)
WriteLine
可能会将您的字符串分成许多数据包,但只要您在ReadLine
另一端使用,您就不需要关心。
ReadLine
将始终读取整行,无论它是否包含多个数据包,只要连接不会失败(并且有足够的内存等)。
更准确地说:您StreamWriter
将始终将整个字符串传送到您的 NetworkStream,它可能会或可能不会一次发送所有字符串,具体取决于包括字符串、网络配置等在内的多种因素。另一方面,类似的事情发生了。NetworkStream.Read 将一次读取尽可能多的内容,并将其全部传递给 StreamReader,但如果您使用StreamReader.ReadLine
,该方法将在获得完整行之前不会返回任何内容。
无论如何,它都会写和读它。
例如,就在今天早些时候,我正在BigIntegers
使用流写入超过183,000 位数字的数字WriteLine
(尽管花了一段时间!)。