Откройте InputStream как Читатель - PullRequest
4 голосов
/ 04 июля 2010

Могу ли я легко конвертировать InputStream в BufferedReader, используя Гуава?

Я ищу что-то вроде:

InputStream inputStream = ...;
BufferedReader br = Streams.newBufferedReader(inputStream);

Я могу открывать файлы, используя Files.newReader(File file, Charset charset). Это круто, и я хочу сделать то же самое, используя InputStream.

UPDATE:

Использование CharStreams.newReaderSupplier кажется мне многословным. Поправьте меня, если я ошибаюсь, но для того, чтобы легко конвертировать InputStream в BufferedReader, используя Guava, мне нужно сделать что-то вроде этого:

final InputStream inputStream = new FileInputStream("/etc/fstab");
Reader bufferedReader = new BufferedReader(CharStreams.newReaderSupplier(new InputSupplier<InputStream>(){
      public InputStream getInput() throws IOException {
        return inputStream;
      }
    }, Charset.defaultCharset()).getInput());

Конечно, я могу создать помощника, например:

return new BufferedReader(new InputStreamReader(inputStream));

Однако я думаю, что такой помощник должен предлагать Guava IO. Я могу сделать такой трюк для экземпляра файла. Почему я не могу для InputStream?

// Guava can do this
Reader r = Files.newReader(new File("foo"), charset);
// but cannot do this
Reader r = SomeGuavaUtil.newReader(inputStream, charset);

Поправьте меня, если я ошибаюсь, но мне кажется, что не хватает API.

1 Ответ

3 голосов
/ 04 июля 2010

Нет, в Гуаве нет ничего подобного. CharStreams - это общий класс для работы с Reader s и Writer s, и он имеет метод

InputSupplier<InputStreamReader> newReaderSupplier(
    InputSupplier<? extends InputStream> in, Charset charset)

, что может быть полезно для любого поставщика InputStream с.

Очевидно, что вы можете просто написать new BufferedReader(new InputStreamReader(in, charset)) или обернуть это в свой собственный фабричный метод.

Изменить:

Да, вы не захотите использовать версию InputSupplier, если у вас уже есть InputStream. Это вроде как плохая идея сделать Iterable, который на самом деле может работать только один раз, например, обернуть существующий Iterator или Enumeration или что-то подобное. В общем, использование InputSupplier требует, чтобы вы думали о том, как вы делаете ввод-вывод, немного по-другому, например, думая о File как о чем-то, что может выступать в качестве поставщика FileInputStream с. Я использовал InputSupplier s, которые упаковывают целые запросы на сервер и возвращают содержимое ответа в виде InputStream, что позволяет мне использовать утилиты Guava для копирования этого в файл и т. Д.

В любом случае, я не совсем уверен, почему у CharStreams нет способа создать Reader из InputStream, кроме того, что, возможно, они не чувствовали, что это необходимо. Вы можете подать вопрос, запрашивающий это.

...