首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >StringBuilder诉StringWriter/StringReader

StringBuilder诉StringWriter/StringReader
EN

Stack Overflow用户
提问于 2010-08-03 00:26:22
回答 4查看 25.1K关注 0票数 36

我最近读到,在StringWriterStringReader中,这是用来从StringBuilder中写和读的。

当我使用StringBuilder对象时,它看起来是一个自给自足的类。

我们有各种读写StringBuilder的方法,使用StringBuilder.Append()Insert()Replace()Remove()等。

  1. StringWriterStringReader的可能用途是什么?StringBuilder本身无法做到这一点?
  2. 它们的实际用途是什么?
  3. 他们不使用Stream作为输入(因为其他任何作者和读者都将流作为要操作的构造器参数)的可能原因是什么?
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-08-03 00:38:10

StringWriter和StringReader的可能用途是什么? StringBuilder本身无法做到这一点?

StringReaderStringWriter分别来源于TextReaderTextWriter。因此,它们所能做的就像一个TextReaderTextWriter实例,而stringStringBuilder不能这样做,因为它们没有派生出这两种类型。

它们的实际用途是什么?

当您拥有/想要的是一个TextReaderStringBuilder时,它们允许您调用期望使用stringStringBuilder的API。

除了StringBuilder之外,他们不接受Stream作为输入(因为其他任何作者和读者都将流作为构造器参数来操作)的可能原因是什么?

因为它们不工作在流上;它们工作在stringStringBuilder上,它们只是简单的包装类,它们将这些类型调整为API,期望有不同的接口。见:适配器模式

票数 37
EN

Stack Overflow用户

发布于 2010-11-30 04:47:36

其他人已经说过了,但这是因为它们是从TextReader/TextWriter派生出来的,可以用来代替它们。首先,如果您只想将内容作为字符串使用,那么使用相同的方法输出文件行就更有意义了。如果您想要跨越内存中多行的输出,那么为什么要记住将"\r\n“放在带有StringBuilder的每一行的末尾?如果希望代码在只对换行使用"\n“的系统上运行或格式化数据,怎么办?

代码语言:javascript
复制
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附加到文件并在测试时输出网页底部的内容。

票数 7
EN

Stack Overflow用户

发布于 2014-09-08 13:35:56

可以使用StringReader读取字符串中的所有整数。

代码语言:javascript
复制
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类:

代码语言:javascript
复制
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();
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3392794

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档