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