#java #guava
#java #guava
Вопрос:
Я хотел бы предоставить API, который принимает кодировку и записывает в нее, вместо того, чтобы принимать Appendable, в соответствии с:
public class Foo {
public void writeTo(CharSink sink) { .. }
}
Это сделало бы наиболее распространенное использование API очень удобным без регулярных махинаций с открытием и закрытием потоков.
Однако иногда я хотел бы получать выходные данные в виде последовательности символов:
new Foo().writeTo(...);
CharSequence s = ...; // s now contains the chars written by writeTo
Есть ли удобный способ использовать существующий метод? Я добавлю свой текущий подход в качестве ответа, но я ожидаю, что есть способы получше.
Комментарии:
1.Это то, что, как я думал, было бы неплохо иметь, но пока не определился с хорошим API для этого. В идеале такой вещью были бы как
CharSink
, так иCharSource
a, но, учитывая, что они являются абстрактными классами (я бы сделал их интерфейсами с множеством методов по умолчанию, если бы они были разработаны для Java 8), это не работает. Итак, возникает неловкое решение: «должен ли он расширятьсяCharSink
и иметь метод для полученияCharSource
представления или наоборот, или не расширяться ни тем, ни другим и иметь методы для обоих представлений?»2. @ColinD согласен. Возможно, класс с методами asCharSink и asCharSource.
Ответ №1:
В настоящее время я использую класс, подобный следующему:
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();