情况是我正在对远程服务器进行WCF调用,该服务器将XML文档作为字符串返回.
大多数时候这个返回值是几K,有时几十K,非常偶尔几百K,但很少可能是几兆(第一个问题是我无法知道).
正是这些罕见的场合引起了悲伤.我得到一个开始的堆栈跟踪:
System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.
at System.Xml.BufferBuilder.AddBuffer()
at System.Xml.BufferBuilder.AppendHelper(Char* pSource, Int32 count)
at System.Xml.BufferBuilder.Append(Char[] value, Int32 start, Int32 count)
at System.Xml.XmlTextReaderImpl.ParseText()
at System.Xml.XmlTextReaderImpl.ParseElementContent()
at System.Xml.XmlTextReaderImpl.Read()
at System.Xml.XmlTextReader.Read()
at System.Xml.XmlReader.ReadElementString()
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderMDRQuery.Read2_getMarketDataResponse()
at Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer2.Deserialize(XmlSerializationReader reader)
at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle)
at System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall)
at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
Run Code Online (Sandbox Code Playgroud)
我已经阅读了,因为大对象堆刚刚变得过于分散,所以即使在调用之前快速检查StringBuilder.EnsureCapacity只会导致OutOfMemoryException被提前抛出(因为我猜测需要什么) ,它可能实际上并不需要那么多,所以我的检查引起的问题比它解决的问题多得多.有些意见认为我无能为力.
我问过自己的一些问题:
已经有很多关于字符串和字符串构建器之间差异的问题,大多数人都认为字符串构建器比字符串更快.我很想知道字符串构建器是否太好所以为什么字符串存在?此外,有些正文可以给我一个例子,其中字符串比字符串构建器更有用吗?
string str = 'my {0} long string {1} need formatting';
Run Code Online (Sandbox Code Playgroud)
我应该做以下事情,
str = string.Format(str, "really", "doesn't");
Run Code Online (Sandbox Code Playgroud)
或者创建一个类似的方法并调用 str = str.ReplaceWithValues("really", "doesn't");
public string ReplaceWithValues(this string str, params object[] values) {
string ret = str;
for (int i = 0; i < values.Length; i++) {
ret = str.Replace(string.Concat("{", i, "}"), values.ToString());
}
return ret;
}
Run Code Online (Sandbox Code Playgroud)
看起来StringBuilder.AppendFormat()在执行像这样的简单替换时效率不高,因为它通过字符串逐个字符地进行.
当我有StringBuilder一个容量为5 的空,我写"你好,世界!" 对它来说,C#标准是否指定了新的容量StringBuilder?我有一个模糊的记忆,它是新字符串长度的两倍(以避免每个新附加的字符串改变容量).
据我所知,StringBuilder通过在concats期间不在字符串池中创建临时字符串实例来帮助减少内存使用量.但是,如果我这样做会发生什么:
StringBuilder sb = new StringBuilder("bu");
sb.append("b"+"u");
Run Code Online (Sandbox Code Playgroud)
它编译成了吗?
sb.append("b");
sb.append("u");
Run Code Online (Sandbox Code Playgroud)
?或者它取决于优化标志?或者,如果使用stringbuilders,我会失去整个好处?或者这个排队没有意义?:)
当NULL对象附加到实例时,我无法理解StringBuilder的以下行为:
public class StringBufferTest {
/**
* @param args
*/
public static void main(String[] args) {
String nullOb = null;
StringBuilder lsb = new StringBuilder();
lsb.append("Hello World");
System.out.println("Length is: " + lsb.length());// Prints 11. Correct
lsb.setLength(0);
System.out.println("Before assigning null" + lsb.length());
lsb.append(nullOb);
System.out.println("Length now is:" + lsb.length()); // Prints 4. ???
}
}
Run Code Online (Sandbox Code Playgroud)
最后一个打印语句不打印0.任何人都可以帮我理解行为吗?
我正在尝试创建一个自定义键盘并在android SDK中使用"SoftKeyboard"示例.我对该示例进行了少量修改并创建了我的自定义键盘.我可以将此自定义键盘与我的Android设备的默认消息应用程序一起使用.
现在,我想单击自定义键盘中的按钮,并在键入SMS时添加图像.我注意到String Builder在"SoftKeyBoard.java" class(private StringBuilder mComposing = new StringBuilder())中,当我们使用键盘输入字母时它会附加字符.
我试图在下面添加我的SD卡图像,
String imageDataString = "";
String path = Environment.getExternalStorageDirectory().toString() + "/SamplePictures/";
File file = new File(path, "myimage.jpg");
try {
FileInputStream imageInFile = new FileInputStream(file);
byte imageData[] = new byte[(int) file.length()];
imageInFile.read(imageData);
// Converting Image byte array into Base64 String
imageDataString = encodeImage(imageData);
imageInFile.close();
} catch (FileNotFoundException e) {
System.out.println("Image not found" + e);
} catch (IOException ioe) {
System.out.println("Exception while reading the Image …Run Code Online (Sandbox Code Playgroud) 我试图创建一个回文检查器.我正在使用StringBuilder,我发现附加空格有点棘手.
当单词没有空格时,此代码有效:
public String palindrome (String anyString) {
StringBuilder sb = new StringBuilder();
for (int i = anyString.length()-1; i>=0; i--) {
sb.append(anyString.charAt(i));
}
String string2 = sb.toString();
return string2;
}
Run Code Online (Sandbox Code Playgroud)
当输入的单词有空格时; 它返回一个字符串,其中包含第一个空格的字符.
例如:
word = "not a palindrome"
palindrome(word) = "emordnilap"
Run Code Online (Sandbox Code Playgroud)
期待 ="emordnilap一吨"
我试过插入
if (anyString.charAt(i) != ' ')
sb.append(anyString.charAt(i));
else
sb.append(' ');
Run Code Online (Sandbox Code Playgroud)
在代码的中间,但它不起作用.
多谢你们!
怎么会?
StringBuilder sb = new StringBuilder();
sb.append("Hello");
sb.append((String)null);
sb.append(" World!");
Log.d("Test", sb.toString());
Run Code Online (Sandbox Code Playgroud)
产生
06-25 18:24:24.354:D/Test(20740):Hellonull World!
我希望附加一个null字符串根本不会附加!!
顺便说一句,演员String是必要的,因为StringBuilder.append()有很多重载版本.
我在这里简化了我的代码,在我的代码中得到了一个返回字符串的方法
public String getString() { ... }
...
sb.append(getString());
...
Run Code Online (Sandbox Code Playgroud)
getString()有时回归null; 现在我必须测试它,如果我想使用StringBuilder!!!!
此外,让我们在这里澄清一下我的问题:如何StringBuilder.append()以优雅的方式接受空字符串,而不是将其转换为文字字符串"null".
优雅,我的意思是我不想得到字符串,测试它是否null只是然后追加它.我正在寻找一个优雅的oneliner.
使用此代码创建了多少个对象? - 我知道3个字符串文字在字符串常量池中,而StringBuilder对象在堆中但是当我调用reverse(),insert()或append()时它是否在池中创建了一个新字符串?
StringBuilder sb = new StringBuilder("abc");
sb.append("def").reverse().insert(3, "---");
System.out.println( sb );
Run Code Online (Sandbox Code Playgroud) stringbuilder ×10
java ×5
c# ×4
string ×4
android ×2
.net ×1
capacity ×1
heuristics ×1
keyboard ×1
null ×1
palindrome ×1
wcf ×1