- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
StringWriter
和 StringBuilder
之间有什么区别?何时应该使用其中之一?
最佳答案
我认为现有的任何答案都不能真正回答这个问题。两个类之间的实际关系是the adapter pattern的例子。
StringWriter
通过转发到存储在字段中的 StringBuilder
实例来实现其所有 Write...
方法。这不仅仅是一个内部细节,因为 StringWriter
有一个公共(public)方法 GetStringBuilder返回内部字符串生成器,以及 a constructor它允许您传入现有的 StringBuilder
。
因此,StringWriter
是一个适配器,允许希望与 TextWriter
一起使用的代码将 StringBuilder
用作目标。就基本行为而言,它们之间显然没有什么可选择的...除非您可以测量转发调用的开销,在这种情况下 StringWriter
稍微慢一些,但这似乎不太可能很重要.
那么为什么他们不让 StringBuilder
直接实现 TextWriter
呢?这是一个灰色地带,因为乍一看界面背后的意图并不一定总是很清楚。
TextWriter
非常是一个接受字符流的接口(interface)。但它还有一个额外的问题:一个名为 Encoding 的属性。 。这意味着 TextWriter
是一个接受字符流并将其转换为字节的接口(interface)。
这是 StringWriter
中无用的痕迹,因为它不执行编码。 documentation说:
This property is necessary for some XML scenarios where a header must be written containing the encoding used by the StringWriter. This allows the XML code to consume an arbitrary StringWriter and generate the correct XML header.
但这不可能是正确的,因为我们无法为StringWriter
指定Encoding
的值。该属性始终具有值 UnicodeEncoding
。因此,任何检查此属性以构建 XML header 的代码都将始终显示 utf-16
。例如:
var stringWriter = new StringWriter();
using (var xmlWriter = XmlWriter.Create(stringWriter))
xDocument.WriteTo(xmlWriter);
生成标题:
<?xml version="1.0" encoding="utf-16"?>
如果你使用 File.WriteAllText 会怎么样?将 XML 字符串写入文件?默认情况下,您将拥有一个带有 utf-16
header 的 utf-8
文件。
在这种情况下,使用 StreamWriter
会更安全,并使用文件路径或 FileStream
构造它,或者如果您想检查数据,则使用MemoryStream
等等 obtain an array of bytes 。所有这些组合将确保字节编码和 header 生成由 StreamWriter
中相同的 Encoding
值引导。
Encoding
属性的目的是允许字符流生成器将有关编码的准确信息包含到字符流本身中(例如在 XML 示例中;其他示例包括电子邮件 header 和等等)。
但是通过引入 StringWriter
,内容生成和编码之间的链接被破坏,因此此类自动机制将停止工作并可能容易出错。
尽管如此,如果您小心的话,StringWriter
是一个有用的适配器,即您了解内容生成代码不应依赖于 Encoding
属性的无意义值。但这种警告通常与适配器模式相关。这通常是一种允许您将方形但几乎圆形的钉子安装到圆孔中的技巧。
关于.net - StringWriter 或 StringBuilder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/602279/
公共(public)类TestMyStringBuilderII { public static void main(String[] args) { StringBuilder sb = n
我们都知道字符串是不可变的而StringBuilder是可变的。正确的。那么为什么它的方法会返回一个 StringBuilder 对象。它们不应该都是 void 方法吗? 为什么会这样 public
当我读到 equals() 方法用于比较 java 中的字符串是否相等但是当我运行这段代码时我得到输出 false 。为什么? public class TestStringBuilder { pu
我收到一份模型列表。模型的数量可能很大。这个模型有一堆属性,其中任何一个都可能是null。 我需要根据模型的属性为每个模型构建一个字符串。如果 property == null,那么我会在结果字符串中
我写了一些代码,其中有很多字符串创建。为了尽量避免一遍又一遍地创建昂贵的字符串,我使用了 java StringBuilder 类。 我的代码有点像这样: public String createSt
这个问题在这里已经有了答案: 关闭10年前。 Possible Duplicate: StringBuilder vs String concatenation in toString() in Ja
类 StringBuilder 定义了四个构造函数,它们都不接受 StringBuilder,但以下编译: StringBuilder sb = new StringBuilder(new Strin
我正在努力在我的代码中使用 StringBuilder,而不是 String使代码在所有解析和连接过程中具有时间效率。 但是当我查看它的源代码时,substring() 方法AbstractStrin
我想知道 StringBuilder,我有一个问题希望社区能够解释。 让我们忘掉代码的可读性,哪些是更快,为什么? StringBuilder.Append: StringBuilder sb = n
这个问题在这里已经有了答案: Single exclamation mark in Kotlin (6 个回答) Example of when should we use run, let, app
我已经附加了一些带有一些字符的 strBuild 并将该 strBuild 放入 stringBuildArr 中。然后在strBuild上调用java.lang.StringBuilder.dele
在 C# 中哪个内存效率更高:选项 #1 还是选项 #2? public void TestStringBuilder() { //potentially a collection with
当使用 StringBuilder.ToString() 时,我遇到了 OutOfMemory 异常。因为我的字符串需要很大的空间。这就是为什么我需要一种方法(也许通过流式传输)来让它工作。 这是我的
这个问题已经有答案了: What's the difference between instance method reference types in Java 8? (3 个回答) 已关闭 7 年
这个问题在这里已经有了答案: What's the difference between instance method reference types in Java 8? (3 个答案) 关闭
最近的 question came up关于使用 String.Format()。我的部分回答包括使用 StringBuilder.AppendLine(string.Format(...)) 的建议
在 SO 上看到一个关于连接字符串的问题后,我做了一些测试,了解到在 foreach 中连接字符串比使用 for 循环和使用数组中的索引慢。由于对数组进行绑定(bind)检查,for 循环不应该变慢吗
我的问题是如果我有时在同一个字符串上使用多线程 字符串不会被替换。(我在记事本上写了这个,所以语法可能是 错误) 使用 System.Thread ...当然还有其他 class .... {
如果我创建一个不可变类。所有字段都必须是最终的。如果我像这样使用 stringbuilder final StringBuilder s = new StringBuilder("你好"); ,那么
是否可以配置 Java StringBuilder类在每次调用之间追加一个新行以追加? 最佳答案 我不认为 StringBuilder内置了该功能。既然你不能只是扩展它,你可以尝试使用装饰器模式...
我是一名优秀的程序员,十分优秀!