2015-05-24 3 views
1

У меня есть странная проблема с ByteArrayOutputStream Явы ..отладка сравнения 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 возвращает false.

EDIT: После ответа указывая исправить отладки кода я получил:

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. Спасибо!

ответ

1

Существует ошибка в коде на

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

Этой ошибка приводит к входной функции изменения: содержание и ожидается модифицируется

+1

О ЮАО, Он должен был быть ад искать ошибку в неправильном месте, две строки теперь: '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 ' – GameDeveloper

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 
Смежные вопросы