首页 > 代码库 > Java 使用StringBuffer注意
Java 使用StringBuffer注意
Stringbuffer使用注意
问题背景:
模拟客户端使用Socket请求服务器核心系统,核心系统正常响应,内容较大,近2715KB,大于2.6M多。
使用指定编码GBK来接收响应内容到过程中没有什么问题,正常接受,内容全部接受到,使用Stringbuffer.append。
问题是响应内容是这样格式的274429200019XXXX结尾内容,需要将前面一段数字内容清除,只留下中间那一段XXX的XML内容。这种情况理所当然substring。我是这样处理的,将响应结果res(String名字为res)转成toCharArray()。得到一个char Array,然后遍历这个char Array,使用Stringbuffer.append追加char。但是最后的处理结果老是丢失一段内容,弄得我怀疑Stringbuffer追加有数据容量限制,试了一下容量调整,最后无效果。考虑到接受响应结果也是用的StringBuffer,那里接受时没出问题,内容都没丢失,况且还是我要截取之前的内容,内容更大,这就不像是StringBuffer的问题,后来怎么整都不行,整了一天(不然我不会记录这个问题)。最后我用土办法,输出!一个一个char输出,遍历一次Char Array输出一次char。加了一个这样的处理,我发现最后几位char输出的竟然是经常看到的乱码内容"口口口口",晕倒了,我马上反应过来,肯定是乱码内容"口"影响到了StringBuffer.append,于是我用substring把乱码内容去掉,然后再次运行,OK!,数据没有丢失了。
总结:Stringbuffer.append追加的内容千万不要是乱码内容"口口口口"之类的,不然StringBuffer.toString()得到的结果可能丢失内容
PS(Postscript):
囧,不应该用toCharArray(),然后利用数字的有位置特点来实现这个截取,被前一个创建此方法的人影响了!直接用substring就好了,问题是之前用substring也是会丢失内容,所以我就采用StringBuffer,估计是接受响应结果使用StringBuffer.append(str + "\n")有问题,应该是StringBuffer.append(str),改成这样后,使用substring没有出现问题。喔,等待,刚测试,不是StringBuffer.append(str + "\n")造成substring截取内容丢失,还是乱码问题!需要截取的内容中不要有乱码!
附上代码:
package com.dafsdfsd.core.service;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.io.UnsupportedEncodingException;import java.net.Socket;import java.net.UnknownHostException;import org.apache.log4j.Logger;import org.dom4j.Document;import org.dom4j.DocumentHelper;import org.junit.Test;import com.dafsdfsd.core.common.PorpertiesConfig;import com.dafsdfsd.core.utils.StringUtils;import com.dafsdfsd.core.utils.xml.XmlUtil4Jdom;public class SendMessageToCore { private static Logger logger = Logger.getLogger(SendMessageToCore.class); /** * 核心返回报文中状态代码节点 */ public static final String MESSAGE_STATUS_CODE = "MessageStatusCode"; /** * 核心返回报文中状态描述节点 */ public static final String MESSAGE_STATUS_DESCRIPTION = "MessageStatusDescription"; /** * 核心返回报文中表示成功的代码 */ public static final String CORE_RETURN_CODE_SUCCESS = "0001"; /** * 发送报文到核心系统<br><pre> * 核心接收GBK编码的报文,在调用这个方法之前应该将报文转换为GBK的编码 <br> * 创建时间:2013-5-30 下午04:21:15 </pre> * @param message 发送到核心的报文 * @return String 核心返回的报文 * @throws 异常类型 说明 */ public static String sendMessage(String message) throws Exception { logger.info("收到的报文内容是:" + message); String coreAddress = PorpertiesConfig.getProperty("core.socketAddress"); String corePortString = PorpertiesConfig.getProperty("core.socketPort"); Socket socket = null; PrintWriter out = null; BufferedReader in = null; BufferedWriter bout = new BufferedWriter(new FileWriter(new File("G:/test.txt"))); BufferedWriter bout1 = new BufferedWriter(new FileWriter(new File("G:/test1.txt"))); // 收到的报文 StringBuffer stringBuffer = new StringBuffer(); String receiveString = null; if (coreAddress != null && corePortString != null) { int corePort = Integer.parseInt(corePortString); try { socket = new Socket(coreAddress, corePort); out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream())); out.println(message); out.flush(); in = new BufferedReader(new InputStreamReader(socket.getInputStream(), XmlUtil4Jdom.GBK_ENCODING)); while ((message = in.readLine()) != null) {// bout.write(message); stringBuffer.append(message + "\n");// stringBuffer.append(message); } // BufferedReader流已指定编码输出,这里不需要再次转码了// receiveString = new String(stringBuffer.toString().getBytes(XmlUtil4Jdom.GBK_ENCODING), XmlUtil4Jdom.GBK_ENCODING); receiveString = stringBuffer.toString(); bout.write(receiveString); } catch (UnknownHostException e) { logger.error("没有找到核心的服务器", e); throw new Exception("没有找到核心的服务器", e); } catch (IOException e) { logger.error("与核心服务器通信出现异常", e); throw new Exception("与核心服务器通信出现异常", e); } finally { if (out != null) out.close(); if (in != null) in.close(); if (bout != null) bout.close(); } } // receiveString = stringBuffer.toString();// logger.info("核心返回的原始内容是:" + receiveString); String msgString = null; if(null != receiveString && !receiveString.isEmpty()){ msgString = getXmlContent(receiveString); // int msgLength = Integer.parseInt(receiveString.substring(0, 6).trim()); // 前12位为报文长度和接口代码// msgString = substring4CharArray(receiveString, 12, msgLength);// msgString = receiveString.replaceFirst(msgLength, "");// msgString = receiveString.substring(12);// byte[] msg = msgString.getBytes(XmlUtil4Jdom.GBK_ENCODING);// // byte[] newMsg = new byte[msgLength];// for (int i = 0; i < msgLength; i++) {// newMsg[i] = msg[i];// }// // msgString = new String(newMsg // logger.info("将核心返回的报文内容做编码转换及长度截取之后的结果:" + msgString); logger.info("将核心返回的报文内容做编码转换及长度截取之后的结果:已处理"); } try { bout1.write(msgString); if (bout1 != null) bout1.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } Document doc = DocumentHelper.parseText(msgString); return msgString; } public static String getXmlContent(String src) {// StringBuffer sb = new StringBuffer(); String rs = null; try {// byte[] byteArray = null;// char[] charArray = null;// byteArray = src.getBytes(XmlUtil4Jdom.GBK_ENCODING);// charArray = src.toCharArray();// System.out.println(src.length());// System.out.println(charArray.length);// System.out.println(byteArray.length);// System.out.println(src.charAt(1));// System.out.println(src.charAt(src.length() - 2));// System.out.println(src.charAt(src.length() - 1)); // 获取代码内容 String srcCode = org.apache.commons.lang.StringUtils.substring(src, 0, 12); System.out.println(srcCode); // 获取xml内容 rs = org.apache.commons.lang.StringUtils.substring(src, 12, src.lastIndexOf(">") + 1);// return src;// charArray = src.toCharArray();// for (int i = 0; i < charArray.length; i++) {// sb.append(charArray[i]);// } // System.out.println(); // System.out.println(); // System.out.println(); // System.out.println(src.length()); // System.out.println(charArray.length); // System.out.println(byteArray.length); //String // for (int i = 0; i < src.length(); i++) { //// sb.append(charArray[i]); //// sb.append(src.charAt(i)); // char s = src.charAt(i); //// System.out.println(s); // sb.append(s); // } //byte // for (int i = 0; i < byteArray.length; i++) { // sb.append((char)byteArray[i]); // } // return new String(byteArray, XmlUtil4Jdom.GBK_ENCODING); // System.out.println(); // System.out.println(); // System.out.println(); // System.out.println(src.charAt(src.length() - 3)); // System.out.println(src.charAt(src.length() - 2)); // System.out.println(src.charAt(src.length() - 1)); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return rs; } @Test public void test() { StringBuffer buffer = new StringBuffer(); FileReader fr = null; BufferedReader br = null; try {// fr = new FileReader("E:/workspace3/i-myproject/b_LOG/temp.xml"); fr = new FileReader("G:/workspace/i-myproject/temp.xml"); br = new BufferedReader(fr); String content = br.readLine(); while (content != null) { buffer.append(content); content = br.readLine(); } String msg = buffer.toString(); sendMessage(new String(msg.getBytes(), XmlUtil4Jdom.GBK_ENCODING)); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } finally { try { br.close(); fr.close(); } catch (IOException e) { e.printStackTrace(); } } } }
Java 使用StringBuffer注意
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。