我最近读到,在StringWriter和StringReader中,这是用来从StringBuilder中写和读的。
当我使用StringBuilder对象时,它看起来是一个自给自足的类。
我们有各种读写StringBuilder的方法,使用StringBuilder.Append()、Insert()、Replace()、Remove()等。
StringWriter和StringReader的可能用途是什么?StringBuilder本身无法做到这一点?Stream作为输入(因为其他任何作者和读者都将流作为要操作的构造器参数)的可能原因是什么?发布于 2010-08-03 00:38:10
StringWriter和StringReader的可能用途是什么? StringBuilder本身无法做到这一点?
StringReader和StringWriter分别来源于TextReader和TextWriter。因此,它们所能做的就像一个TextReader或TextWriter实例,而string或StringBuilder不能这样做,因为它们没有派生出这两种类型。
它们的实际用途是什么?
当您拥有/想要的是一个TextReader或StringBuilder时,它们允许您调用期望使用string或StringBuilder的API。
除了StringBuilder之外,他们不接受Stream作为输入(因为其他任何作者和读者都将流作为构造器参数来操作)的可能原因是什么?
因为它们不工作在流上;它们工作在string或StringBuilder上,它们只是简单的包装类,它们将这些类型调整为API,期望有不同的接口。见:适配器模式。
发布于 2010-11-30 04:47:36
其他人已经说过了,但这是因为它们是从TextReader/TextWriter派生出来的,可以用来代替它们。首先,如果您只想将内容作为字符串使用,那么使用相同的方法输出文件行就更有意义了。如果您想要跨越内存中多行的输出,那么为什么要记住将"\r\n“放在带有StringBuilder的每一行的末尾?如果希望代码在只对换行使用"\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有一个日志属性,您可以将其设置为TextWriter,以便在执行查询之前输出查询,以查看正在运行的是什么。您可以将其设置为附加到文件的TextWriter,但可以将StringWriter附加到文件并在测试时输出网页底部的内容。
发布于 2014-09-08 13:35:56
可以使用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();
}
}https://stackoverflow.com/questions/3392794
复制相似问题