Я хотел бы предоставить API, который принимает CharSink и записывает на него вместо того, чтобы принимать Appendable, в соответствии с:
public class Foo {
public void writeTo(CharSink sink) { .. }
}
Это сделало бы наиболее распространенные применения API очень удобными без регулярных махинаций открытия и закрытия потоков.
Иногда, однако, я хотел бы получить вывод в последовательности символов:
new Foo().writeTo(...);
CharSequence s = ...; // s now contains the chars written by writeTo
Есть ли удобный способ использования существующего метода? Я добавлю свой нынешний подход в качестве ответа, но я ожидаю, что есть лучшие способы.
В настоящее время я использую класс следующим образом:
public class InMemoryCharSink extends CharSink {
private final StringBuilder sb = new StringBuilder();
@Override
public Writer openStream() throws IOException {
return CharStreams.asWriter(sb);
}
public CharSequence getChars() {
return sb;
}
}
Тогда использование будет:
InMemoryCharSink sink = new InMemoryCharSink();
new Foo().writeTo(sink);
CharSequence s = sink.getChars();
CharSink
иCharSource
, но, учитывая, что это абстрактные классы (я бы сделал их интерфейсами с множеством методов по умолчанию, если бы они были разработаны для Java 8), который не работает. Итак, есть неловкое решение: «Должно ли оно расширятьCharSink
и иметь метод для получения представленияCharSource
, или наоборот, или же не расширять и иметь методы для обоих представлений?»