programing

IOUtils.toString(InputStream)에 상당하는 Guava

randomtip 2023. 2. 4. 08:28
반응형

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>),toStringmethod는 작성과 닫힘을 모두 처리합니다.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-finallyblock을 사용하여 리소스가 올바르게 닫히는지 확인합니다.

편집: 개인적으로 다음과 같은 것을 발견했습니다(실제로 쓰는 방법은 위의 코드에 기재되어 있는 단계를 세분화한 것입니다).

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그리고.OutputSupplierGuava 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

반응형