我注意到在使用ReadLine()
orStreamReader
时StringReader
,如果文件或字符串以换行符结尾,则该字符序列将完全丢失。考虑以下示例:
static void Main(string[] args)
{
string data = "First Line\r\nSecond Line\r\n\r\n\r\n";
List<string> lineData = new List<string>();
string[] splitData = data.Split(
new string[] { "\r\n" },
StringSplitOptions.None);
using (StringReader sr = new StringReader(data))
{
string line;
while ((line = sr.ReadLine()) != null)
lineData.Add(line);
}
Console.WriteLine("Raw Line Count: " + splitData.Length);
Console.WriteLine("StringReader Line Count: " + lineData.Count);
Console.WriteLine("Split Data: ");
foreach (string s in splitData)
Console.WriteLine(string.IsNullOrEmpty(s) ? "[blank line]" : s);
Console.WriteLine("StringReader Data: ");
foreach (string s in lineData)
Console.WriteLine(string.IsNullOrEmpty(s) ? "[blank line]" : s);
Console.ReadKey();
}
输出如下:
Raw Line Count: 5
StringReader Line Count: 4
Split Data:
First Line
Second Line
[blank line]
[blank line]
[blank line]
StringReader Data:
First Line
Second Line
[blank line]
[blank line]
为什么StringReader
/会StreamReader
这样?我可以想到几种解决方法,但是因为读者的行为方式出乎意料而不得不重新编写我的代码似乎很愚蠢。某些 .NET 库中是否有一些设置会影响流处理最终换行符的方式?
编辑
这是另一个示例:比较先运行该示例时的结果"First Line\r\nSecond Line"
,然后再对"First Line\r\nSecond Line\r\n"
. 结果完全相同(就示例的 StringReader 部分而言)。为什么 StringReadernull
在第二个示例中会返回而不是空字符串?我知道从返回的字符串ReadLine()
不包括换行符,但为什么最后一行被解释为null
而不是""
?