ReadAllLines的Stream对象?

存在一个File.ReadAllLines而不是Stream.ReadAllLines

 using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("Test_Resources.Resources.Accounts.txt")) using (StreamReader reader = new StreamReader(stream)) { // Would prefer string[] result = reader.ReadAllLines(); string result = reader.ReadToEnd(); } 

有没有办法做到这一点,或者我必须手动循环逐行通过文件?

你可以写一个逐行读取的方法,如下所示:

 public IEnumerable<string> ReadLines(Func<Stream> streamProvider, Encoding encoding) { using (var stream = streamProvider()) using (var reader = new StreamReader(stream, encoding)) { string line; while ((line = reader.ReadLine()) != null) { yield return line; } } } 

然后将其称为:

 var lines = ReadLines(() => Assembly.GetExecutingAssembly() .GetManifestResourceStream(resourceName), Encoding.UTF8) .ToList(); 

Func<>部分是为了应对多次读取,避免不必要地打开stream。 当然,你可以很容易地把这些代码包装在一个方法中。

如果你一次不需要全部内存,你甚至不需要ToList

.EndOfStream属性可以在循环中使用,而不是检查下一行是否为空。

 List<string> lines = new List<string>(); using (StreamReader reader = new StreamReader("example.txt")) { while(!reader.EndOfStream) { lines.Add(reader.ReadLine()); } } 
 using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("Test_Resources.Resources.Accounts.txt")) using (StreamReader reader = new StreamReader(stream)) { // Would prefer string[] result = reader.ReadAllLines(); string[] result = reader.ReadToEnd().Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries); } 

这里使用Split

 reader .ReadToEnd() .Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries); 

不等同于ReadLine 。 如果您查看ReadLine , StreamReader.cs的源代码,则会看到它正确处理行结束符:\ r,\ n和\ r \ n。 当行结束符是\ r \ n时, ReadLine不会返回多余的空string,这在DOS / Windows中是典型的。 Split “看到”(parsing)\ r后面\ n作为2个单独的分隔符,并返回一个空string。

上面代码中的“StringSplitOptions.RemoveEmptyEntries”确实会删除这些空string,但是它也会删除出现在input中的空行。

因此对于inputline1 \ r \ r line3 \ r ReadLine返回3行。 第二个是空的。 Split创build4个string。 (在最后一个\ r之后还有一个string)然后删除第二个和第四个。

请注意, Split不太适合parsing“post-fix”分隔的文本行。 这是令牌之后出现的分隔符。 Split适用于中缀,分隔符出现在令牌之间。 它是a,b,c和line1 \ r,line2,line3 \ r之间的区别。 对于这些input, Split返回3个string或4个string。

如果您想要使用StreamReader,那么您需要使用ReadLine并循环读取StreamReader,逐行读取。

类似的东西:

 string line; using (StreamReader reader = new StreamReader(stream)) { while ((line = reader.ReadLine()) != null) { Console.WriteLine(line); } } 

或尝试

 using (StreamReader reader = new StreamReader("file.txt")) { string[] content = reader.ReadToEnd().Replace("\n","").Split('\t'); }