CharSink Гуавы в поддержку StringBuilder?

1

Я хотел бы предоставить 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

Есть ли удобный способ использования существующего метода? Я добавлю свой нынешний подход в качестве ответа, но я ожидаю, что есть лучшие способы.

  • 1
    Это то, что я подумал, было бы неплохо иметь, но пока не определился с хорошим API. В идеале такой вещью могут быть как CharSink и CharSource , но, учитывая, что это абстрактные классы (я бы сделал их интерфейсами с множеством методов по умолчанию, если бы они были разработаны для Java 8), который не работает. Итак, есть неловкое решение: «Должно ли оно расширять CharSink и иметь метод для получения представления CharSource , или наоборот, или же не расширять и иметь методы для обоих представлений?»
  • 1
    @ColinD согласился. Возможно, класс с методами asCharSink и asCharSource.
Теги:
guava

1 ответ

3

В настоящее время я использую класс следующим образом:

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню