调试ByteArrayOutputStream字符串比较

时间:2015-05-24 10:40:22

标签: java encoding

我的Java的ByteArrayOutputStream有一个奇怪的问题..

public static void main(String[] args) {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    PrintStream ps = new PrintStream(baos);
    String expected = "{x={x=4, y=true}, y=true}";
    printToStream(ps);

    try {
        String content =  new String(baos.toByteArray());
        System.out.println(">content : "+content);
        System.out.println("-expected: "+expected);
        printBytes(content);
        printBytes(expected);
        if(content.equals(expected)==false) //HERE
            throw new RuntimeException( "program failed");
        baos.close();

    } catch ( UnsupportedEncodingException e) {
        throw new RuntimeException(" failed string extraction");
    } catch ( IOException e) {
        throw new RuntimeException(" cannote close the stream");
    } 
}

程序以“程序失败”异常结束,因为字符串不相等,但在Eclipse控制台上它们看起来完全相同:

>content : {x={x=4, y=true}, y=true}
-expected: {x={x=4, y=true}, y=true}

此外,要检查字符串的单个字节(因为如果我可以隔离单字符,我可以找到字符串创建或编码的错误)我创建了一个方法来查看其字节的十六进制值。但是它们不会被打印!

public static void printBytes( String st){
    String bytes="";
    for(byte it: st.getBytes())
        st+=Integer.toHexString(it)+" ";
    System.out.println("HexValues: "+bytes);
}

而不是HexValues我得到一个空字符串

HexValues: 
HexValues: 

getBytes()方法文档中的进一步调查带来了这个

  

此字符串无法在默认字符集中编码时此方法的行为未指定

但是,如果我提供的字符集应该接受所有可能的字符(UTF8或UTF16)作为getBytes的参数,它仍然会失败(因为String是UTF16应始终可以将其转换为UTF8或UTF16理论上,唯一应该失败的转换例如是非ASCII字符的ASCII。)

方法printToStream( PrintStream ps)是规范的一部分,因此我无法对其进行更改。

真正的问题是:我需要理解为什么String的equals方法返回false。

编辑: 在回答指向正确的调试代码后,我得到了:

HexValues:  fffffffe  ffffffff  0  74  0  72  0  75  0  65  0  d  0  a 
HexValues:  fffffffe  ffffffff  0  74  0  72  0  75  0  65  0  a 

这是一个缺少的回车0x0d。 谢谢!

2 个答案:

答案 0 :(得分:1)

您的代码在

时出错
 st+=Integer.toHexString(it)+" ";
 bytes+=Integer.toHexString(it)+" ";//use this instead

此错误导致功能输入修改:内容和预期被修改

答案 1 :(得分:1)

在方法中,您不会更改打印的字符串值。因此,字节值为空。您正在更改参数字符串。

你应该使用

public static void printBytes( String st){
    String bytes="";
    for(byte it: st.getBytes())
        bytes+=Integer.toHexString(it)+" "; // not st
    System.out.println("HexValues: "+bytes);
}

对于平等案例。可能是你在字符串中有空格。尝试修剪字符串并进行compparision

if(content.trim().equals(expected.trim()) // no need to explicitly check if true or flase