4

GuavaInputStreamを使用するように簡単に変換できますか?BufferedReader

私は次のようなものを探しています:

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

を使用してファイルを開くことができますFiles.newReader(File file, Charset charset)。それはクールです。私はInputStream.

アップデート:

使用CharStreams.newReaderSupplierは私にとって冗長に思えます。私が間違っている場合は修正してください。ただし、Guava を使用InputStreamするように簡単に変換するには、次のようにする必要があります。BufferedReader

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 によって提供されるべきだと思います。File インスタンスに対してそのようなトリックを行うことができます。InputStream を使用できないのはなぜですか?

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

私が間違っている場合は修正してください。ただし、API が不足しているように思えます。

4

1 に答える 1

3

いいえ、Guava にはそのようなものはまったくありません。s およびs をCharStreams操作するための一般的なクラスであり、メソッドがありますReaderWriter

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

これは、あらゆる種類の s のサプライヤに役立ちInputStreamます。

明らかに、new BufferedReader(new InputStreamReader(in, charset))独自のファクトリ メソッドでそれを記述またはラップすることもできます。

編集:

はい、InputSupplierすでにInputStream. Iterable既存の などをラップする など、実際には 1 回しIteratorか機能しない を作成するのは悪い考えであるようEnumerationなものです。一般に、 を使用するには、 を s のサプライヤとして機能できるものとInputSupplier考えるなど、少し異なる I/O を行う方法について考える必要があります。リクエスト全体をサーバーにラップし、レスポンスコンテンツを として返す を使用しました。これにより、Guava ユーティリティを使用してそれをファイルなどにコピーできます。FileFileInputStreamInputSupplierInputStream

いずれにせよ、fromCharStreamsを作成する方法がない理由は完全にはわかりません。これを要求する問題を提出することをお勧めします。ReaderInputStream

于 2010-07-04T00:21:39.220 に答える