Java 8 Base64 потоковая обертка ест последние два символа?
У меня есть следующий код:
public static String encode(Object object)
{
final String result;
try (ByteArrayOutputStream bOut = new ByteArrayOutputStream();
Output output = new Output(bOut))
{
KRYO.writeObject(output, object);
output.flush();
result = Base64.getUrlEncoder().encodeToString(bOut.toByteArray());
} catch (IOException e)
{
// Do nothing, should never happen!
throw new RuntimeException("MEGA FAIL");
}
return result;
}
public static String encodeTest(Object object)
{
final String result;
try (ByteArrayOutputStream bOut = new ByteArrayOutputStream();
OutputStream base64Out = Base64.getUrlEncoder().wrap(bOut);
Output output = new Output(base64Out))
{
KRYO.writeObject(output, object);
output.flush();
result = bOut.toString();
} catch (IOException e)
{
// Do nothing, should never happen!
throw new RuntimeException("MEGA FAIL");
}
return result;
}
Тестовое задание:
String test = "asdf";
System.out.println(encode(test));
System.out.println(encodeTest(test));
выдает результат (с помощью kryo logger):
00:10 TRACE: [kryo] Write: asdf
00:10 TRACE: [kryo] Object graph complete.
YXNk5g==
00:10 TRACE: [kryo] Write: asdf
00:10 TRACE: [kryo] Object graph complete.
YXNk
Так есть ли ошибка в моем коде?
Я неправильно использую упаковщик?
Ошибка в kryo (протестировано с версиями 3.0.3 и 4.0.0)?
1 ответ
Решение
Согласно документации для Base64.Encoder.wrap()
, вам нужно закрыть поток, как только вы закончите с ним:
Рекомендуется незамедлительно закрыть возвращенный выходной поток после использования, во время которого он сбросит все возможные оставшиеся байты в основной выходной поток.
призвание bOut.toString()
после того, как поток кодировщика будет закрыт, исправим проблему:
public static String encodeTest(Object object)
{
ByteArrayOutputStream bOut = new ByteArrayOutputStream();
try (OutputStream base64Out = Base64.getUrlEncoder().wrap(bOut);
Output output = new Output(base64Out))
{
KRYO.writeObject(output, object);
} catch (IOException e)
{
// Do nothing, should never happen!
throw new RuntimeException("MEGA FAIL");
}
return bOut.toString();
}