Calum의 답변에 대한 귀하의 의견에서 사용할 예정이라고 말했습니다.
CharStreams.toString(new InputStreamReader(supplier.get(), Charsets.UTF_8))
이 코드는 과부하 CharStreams.toString(Readable)
상태로 인해 문제가 됩니다.
을 닫습니다하지 않습니다 Readable
.
즉 InputStreamReader
, 이 코드가 완료된 후에도 에서 InputStream
반환 된 supplier.get()
이 (가) 닫히지 않습니다.
반면에 이미있는 것으로 보이며 InputSupplier<InputStream>
오버로드를 사용 했다는 사실을 활용 CharStreams.toString(InputSupplier<R extends Readable & Closeable>
하면 toString
메서드가의 생성과 종료를 모두 처리 Reader
합니다.
이것은 어떤 과부하 사실이없는 것을 제외하고 존 소총이 제안 정확히 무엇을 CharStreams.newReaderSupplier
하는가 소요 InputStream
입력으로 ... 당신은 그것을에게주고 있습니다 InputSupplier
:
InputSupplier<? extends InputStream> supplier = ...
InputSupplier<InputStreamReader> readerSupplier =
CharStreams.newReaderSupplier(supplier, Charsets.UTF_8);
// InputStream and Reader are both created and closed in this single call
String text = CharStreams.toString(readerSupplier);
요점은 InputSupplier
Guava가 추악한 try-finally
블록 이 필요한 부품을 처리하여 리소스가 제대로 닫히 도록함으로써 삶을 더 쉽게 만드는 것입니다.
편집 : 개인적으로 다음을 찾습니다 (실제로 작성하는 방법은 위 코드의 단계를 분해하는 것입니다)
String text = CharStreams.toString(
CharStreams.newReaderSupplier(supplier, Charsets.UTF_8));
일하기 훨씬 덜 장황 이보다 :
String text;
InputStreamReader reader = new InputStreamReader(supplier.get(),
Charsets.UTF_8);
boolean threw = true;
try {
text = CharStreams.toString(reader);
threw = false;
}
finally {
Closeables.close(reader, threw);
}
이 문제를 직접 처리하기 위해 작성해야 할 내용은 어느 정도입니다.
편집 : 2014 년 2 월
InputSupplier
그리고 OutputSupplier
이를 사용하는 방법은 Guava 16.0에서 더 이상 사용되지 않습니다. 이들의 교체는 ByteSource
, CharSource
, ByteSink
와 CharSink
. 가 주어지면 ByteSource
이제 다음 String
과 같은 내용을 얻을 수 있습니다 .
ByteSource source = ...
String text = source.asCharSource(Charsets.UTF_8).read();
Charsets.US_ASCII
"어, 내가 추측 한 문자셋이 무엇이든간에?"라고 말하는 것보다 다루고있는 문자셋 (예 :)을 알고 있음을 지정하도록 요구하는 것이 좋습니다. 많은 사람들에게 행복해 보입니다. 특히 Java는 UTF-8과 같은 의미있는 기본값을 사용하지 않기 때문입니다.