[英]Use StringWriter, StringBuilder and XmlTextWriter to load an XML and write it into a string
[英]StringBuilder Vs StringWriter/StringReader
我最近读到在StringWriter
和StringReader
中用于从StringBuilder
写入和读取。
好吧,当我使用StringBuilder
对象时,它看起来是一个自给自足的类。
我们有各种方法来读取和编写StringBuilder
,使用StringBuilder.Append()
, Insert()
, Replace()
, Remove()
等...
StringWriter
和StringReader
的可能用途是什么, StringBuilder
本身无法做到这一点? Stream
作为输入(因为任何其他编写器和读者都将流作为Constructor参数进行操作)但是StringBuilder
? StringWriter和StringReader的可能用途是什么,StringBuilder本身无法做到这一点?
StringReader
和StringWriter
分别从TextReader
和TextWriter
派生。 那么他们可以做什么充当TextReader
或TextWriter
实例,哪个string
或StringBuilder
不能,因为他们不会派生这些类型。
它们的实际用途是什么?
当您拥有/想要的是string
或StringBuilder
时,它们允许您调用期望TextReader
或TextWriter
API。
可能的原因是他们没有将Stream作为输入(因为任何其他编写器和读者都将流作为Constructor参数进行操作)但是StringBuilder?
因为他们不在溪流上工作; 它们适用于string
s或StringBuilder
。 它们只是简单的包装类,它们适用于期望不同接口的API。 请参阅: 适配器模式 。
其他人已经说过了,但这是因为它们来自TextReader / TextWriter,可以代替它们使用。 首先,如果您只想将内容作为字符串,则使用相同的方法输出用于文件的行更有意义。 如果你想要在内存中跨越多行的输出,为什么还要记得用StringBuilder将“\\ r \\ n”放在每一行的末尾? 如果您希望代码运行或格式化仅使用“\\ n”进行换行的系统的数据,该怎么办?
StringBuilder sb = new StringBuilder();
// will be invalid on systems that only use \n
sb.AppendFormat("{0:yyyy-MM-dd HH:mm:ss} - Start\r\n", DateTime.Now);
// still have to add an extra parameter
sb.AppendFormat("The current time is {0:yyyy-MM-dd HH:mm:ss}{1}", DateTime.Now,
Environment.NewLine);
StringWriter sw = new StringWriter();
// Don't have to worry about it, method name tells you there's a line break
sw.WriteLine("{0:yyyy-MM-dd HH:mm:ss} - Start", DateTime.Now);
// no extra parameters
sw.WriteLine("The current time is {0:yyyy-MM-dd HH:mm:ss}", DateTime.Now);
假设您想逐行处理文件,您可能会使用StreamReader而不是将整个文件加载到StringBuilder中并将换行符分成数组,对吧? 使用StringReader,您可以使用完全相同的方法(只要它采用通用的TextReader),方法是从TextBox或Web表单的字符串创建StringReader。
Linq2Sql DataContexts有一个Log属性,您可以将其设置为TextWriter,以便在执行查询之前输出查询,以准确查看正在运行的内容。 您可以将其设置为附加到文件的TextWriter,但您可以将StringWriter附加到它,并在测试时输出网页底部的内容...
您可以使用StringReader从字符串中读取所有整数。
private static void Main()
{
var str = @"
13
13
0 6
0 5
0 1
0 2
5 3
6 4
5 4
3 4
7 8
9 10
11 12
9 11
9 12";
using (StandardInput input = new StandardInput(new StringReader(str)))
{
List<int> integers = new List<int>();
int n;
while ((n = input.ReadInt32()) != -1)
{
integers.Add(n);
}
}
}
StandardInput类:
class StandardInput : IDisposable
{
private readonly TextReader reader;
public StandardInput(TextReader reader)
{
this.reader = reader;
}
public int ReadInt32()
{
while (!char.IsDigit((char)reader.Peek()) && reader.Peek() != -1)
{
reader.Read();
}
var builder = new StringBuilder();
while (char.IsDigit((char) reader.Peek()))
builder.Append((char) reader.Read());
return builder.Length == 0 ? -1 : int.Parse(builder.ToString());
}
public double ReadDouble()
{
while (!char.IsDigit((char)reader.Peek()) && reader.Peek() != '.'
&& reader.Peek() != -1)
{
reader.Read();
}
var builder = new StringBuilder();
if (reader.Peek() == '.')
builder.Append((char) reader.Read());
while (char.IsDigit((char)reader.Peek()))
builder.Append((char)reader.Read());
if (reader.Peek() == '.' && !builder.ToString().Contains("."))
{
builder.Append((char)reader.Read());
while (char.IsDigit((char)reader.Peek()))
builder.Append((char)reader.Read());
}
return builder.Length == 0 ? -1 : double.Parse(builder.ToString());
}
public void Dispose()
{
reader.Dispose();
}
}
我不确定是谁告诉你他们的目的是与StringBuilder一起使用,但这绝对不正确。 正如您所指出的,可以在不使用其他类的情况下读取和写入StringBuilder。 StringWriter和StringReader类扩展了TextReader和TextWriter .Net Framework基类,并为处理文本数据提供了类似流的功能。 例如,如果您需要使用某些XmlDocument类型类,某些方法允许您通过TextReader加载Xml数据,因此如果您将Xml文本作为字符串变量,则可以将其加载到StringReader中然后将其提供给XmlDocument。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.