IOUtils.toString(InputStream)에 상당하는 Guava
Apache Commons IO는 읽기 쉬운 IOTils.toString() 메서드를 가지고 있습니다.InputStream
스트링에 접속합니다.
Apache Commons에서 Guava로 이사하려고 하는데 Guava에 동등한 것이 있나요?모든 수업 내용을 살펴보았습니다.com.google.common.io
그렇게 간단한 건 찾을 수 없었어요
편집: 문자 집합의 문제를 이해하고 감사하게 생각합니다.다만, 모든 소스가 ASCII(네, ASCII, ANSI 등이 아님)로 되어 있는 것을 알 수 있기 때문에, 이 경우 부호화는 문제가 되지 않습니다.
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
method는 작성과 닫힘을 모두 처리합니다.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
구아바가 못생긴 부분을 처리하도록 함으로써 당신의 삶을 쉽게 만드는 것이다.try-finally
block을 사용하여 리소스가 올바르게 닫히는지 확인합니다.
편집: 개인적으로 다음과 같은 것을 발견했습니다(실제로 쓰는 방법은 위의 코드에 기재되어 있는 단계를 세분화한 것입니다).
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();
만약 당신이 가지고 있는 것은Readable
사용할 수 있습니다.CharStreams.toString(Readable)
따라서 다음 작업을 수행할 수 있습니다.
String string = CharStreams.toString( new InputStreamReader( inputStream, "UTF-8" ) );
문자 집합을 지정하도록 강제합니다. 이 작업은 사용자가 수행해야 합니다.
거의요. 이런 게 필요할 거예요.
InputSupplier<InputStreamReader> readerSupplier = CharStreams.newReaderSupplier
(streamSupplier, Charsets.UTF_8);
String text = CharStreams.toString(readerSupplier);
저는 개인적으로 그렇게 생각하지 않습니다.IOUtils.toString(InputStream)
는 "nice"입니다.이는 항상 플랫폼의 기본 인코딩을 사용하기 때문에 원하는 인코딩은 거의 없습니다.인코딩의 이름을 따는 오버로드가 있지만 이름을 사용하는 것은 좋은 생각이 아닙니다. 그래서 저는Charsets.*
.
편집: 기필 edit edit edit edit edit edit edit edit edit edit edit edit edit edit edit edit edit edit edit edit edit edit edit가 필요한 .InputSupplier<InputStream>
처 streamSupplier
스트림을 이미 가지고 있다면 충분히 쉽게 구현할 수 있습니다.
InputSupplier<InputStream> supplier = new InputSupplier<InputStream>() {
@Override public InputStream getInput() {
return stream;
}
};
업데이트: 돌이켜보면, 이전 솔루션이 마음에 들지 않습니다.게다가 지금은 2013년이고 Java7을 위한 더 나은 대안이 있다.현재 사용하고 있는 것은 다음과 같습니다.
InputStream fis = ...;
String text;
try ( InputStreamReader reader = new InputStreamReader(fis, Charsets.UTF_8)){
text = CharStreams.toString(reader);
}
또는 Input Supplier를 사용하는 경우
InputSupplier<InputStreamReader> spl = ...
try ( InputStreamReader reader = spl.getInput()){
text = CharStreams.toString(reader);
}
또 다른 옵션은 스트림에서 바이트를 읽고 바이트에서 문자열을 작성하는 것입니다.
new String(ByteStreams.toByteArray(inputStream))
new String(ByteStreams.toByteArray(inputStream), Charsets.UTF_8)
'순수한' 과바는 아니지만 조금 더 짧다.
에서는, 받아들여진 회답에 해, 「이러다」의을 소개합니다.IOUtils.toString()
(문자 집합)이전전 전전? ???
public static String toString(final InputStream is) throws IOException{
return toString(is, Charsets.UTF_8);
}
public static String toString(final InputStream is, final Charset cs)
throws IOException{
Closeable closeMe = is;
try{
final InputStreamReader isr = new InputStreamReader(is, cs);
closeMe = isr;
return CharStreams.toString(isr);
} finally{
Closeables.closeQuietly(closeMe);
}
}
입력 스트림이 클래스 경로 리소스에서 오는 경우 자동 클로징 솔루션은 훨씬 짧습니다.
URL resource = classLoader.getResource(path);
byte[] bytes = Resources.toByteArray(resource);
String text = Resources.toString(resource, StandardCharsets.UTF_8);
IOExplained에서 영감을 받아 Guava 리소스를 사용합니다.
편집 (2015):Okio는 Java/Android에서 I/O를 위한 최고의 추상화 및 도구입니다.항상 쓰고 있어요.
WWIW는 이렇게 써요.
이미 스트림이 있는 경우:
final InputStream stream; // this is received from somewhere
String s = CharStreams.toString(CharStreams.newReaderSupplier(new InputSupplier<InputStream>() {
public InputStream getInput() throws IOException {
return stream;
}
}, Charsets.UTF_8));
스트림을 만드는 경우:
String s = CharStreams.toString(CharStreams.newReaderSupplier(new InputSupplier<InputStream>() {
public InputStream getInput() throws IOException {
return <expression creating the stream>;
}
}, Charsets.UTF_8));
예를 들어 다음과 같은 Android 텍스트 파일 자산을 읽을 수 있습니다.
final Context context = ...;
String s = CharStreams.toString(CharStreams.newReaderSupplier(new InputSupplier<InputStream>() {
public InputStream getInput() throws IOException {
return context.getAssets().open("my_asset.txt");
}
}, Charsets.UTF_8));
예를 들어 Android 텍스트 파일 자산을 읽는 방법은 다음과 같습니다.
public static String getAssetContent(Context context, String file) {
InputStreamReader reader = null;
InputStream stream = null;
String output = "";
try {
stream = context.getAssets().open(file);
reader = new InputStreamReader(stream, Charsets.UTF_8);
output = CharStreams.toString(reader);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (stream != null) {
try {
stream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return output;
}
언급URL : https://stackoverflow.com/questions/4185665/guava-equivalent-for-ioutils-tostringinputstream
'programing' 카테고리의 다른 글
다른 모듈의 돌연변이로 rootState에 액세스합니다. (0) | 2023.02.04 |
---|---|
Chrome 송신 요청 오류:TypeError: 원형 구조를 JSON으로 변환하는 중 (0) | 2023.02.04 |
Node.js 파일에 쓸 때 디렉토리 생성 (0) | 2023.02.04 |
URL에서 YouTube 비디오 ID를 얻으려면 어떻게 해야 하나요? (0) | 2023.02.04 |
window.onload vs $(최소)입니다.ready() (0) | 2023.01.25 |