Кодировка Guava в вспомогательный StringBuilder?

#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();