2009-12-11 3 views
18

java.io.InputStream으로 시작하는 경우 전체 스트림을 String으로 읽는 가장 쉬운 방법은 무엇입니까 (utf-8이라고 가정)?InputStream의 텍스트 읽기

이것은 꽤 쉬워야하지만 나는 거의 C# 인물이고 google은 나를 실패하고있다. 감사.

+2

http://stackoverflow.com/questions/309424/in-java-how-do-a-read-an-input-stream-in-to-a-string – akuhn

+0

doh, 검색하지 않았습니다. "입력 스트림 "(중간에 공백이 있음). – jthg

답변

17

당신이 편안 라이센스 무엇에 따라, 자카르타 커먼즈 IO 라이브러리와 one liner입니다.

+2

+1 - 널리 사용되는 라이브러리를 재사용하면 시간과 노력을 절약 할 수 있습니다. –

+2

org.apache.commons.io.IOUtils.toString (InputStream input, String encoding)을 사용하여 종료했습니다. – jthg

+2

자카르타 커먼즈에서 사람들이 제안 할 때 항상 투표합니다. 지루하고, 하루가 끝날 때까지 제공해야 할 비즈니스 로직이 아직 남아 있으며, 일상을 바꾸는 것이 타당하지 않습니다. –

0

스트림에서 읽기/쓰기는 Java에서 매우 고통 스럽습니다.

public static String getStreamContents(InputStream stream) throws IOException { 

    StringBuilder content = new StringBuilder() 

    Reader reader = new BufferedReader(new InputStreamReader(stream, "UTF-8")) 
    String lineSeparator = System.getProperty("line.separator"); 

    try { 
     String line 
     while ((line = reader.readLine()) != null) { 
      content.append(line + lineSeparator) 
     } 
     return content.toString() 

    } finally { 
     reader.close() 
    } 

} 
+1

새로운 InputStreamReader (스트림, "UTF-8")로 새로운 InputStreamReader (stream) 교환 – Buhb

+1

코드가 줄 바꿈을 버립니다. –

+0

완료, 팁 덕분에 –

9

은 문자 인코딩을 지정합니다. 코드를 낭독하지 말고 버그를 도입하고 BufferedReader으로 실행 속도를 줄입니다.

다음은 예입니다. 버퍼 크기, 인코딩 등으로 매개 변수화 할 수 있습니다.

static String readString(InputStream is) throws IOException { 
    char[] buf = new char[2048]; 
    Reader r = new InputStreamReader(is, "UTF-8"); 
    StringBuilder s = new StringBuilder(); 
    while (true) { 
    int n = r.read(buf); 
    if (n < 0) 
     break; 
    s.append(buf, 0, n); 
    } 
    return s.toString(); 
} 
+3

+1 - 그러나 일반적인 관용구는 다음과 같이 루프를 작성하는 것입니다.'int n; while ((n = r.read (buf))> = 0) {s.append (buf, 0, n); }' –

+4

불행히도 일반적인 관용구입니다. 하지만 부작용이있는 테스트는 피하는 편이 낫습니다. – erickson

1

Commons-IO를 사용하는 것이 가장 좋은 방법입니다. 또 다른 방법은 모든 바이트를 복사 한 다음 문자열로 변환하는 것입니다.

public static String readText(InputStream is, String charset) throws IOException { 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    byte[] bytes = new byte[4096]; 
    for(int len;(len = is.read(bytes))>0;) 
     baos.write(bytes, 0, len); 
    return new String(baos.toByteArray(), charset); 
} 
1

나는 스트림 자바 8 좋은 방법을 발견했습니다

새로운 InputStreamReader 새로운 InputStreamReader를 (입니다) 교환 할 수 위에 언급 한 바와 같이
public static String readString(InputStream is) { 
    BufferedReader br = new BufferedReader(new InputStreamReader(is)); 
    String content = br.lines().reduce("", String::concat); 
    return content; 
} 

(이다 "UTF-8") ,하지만이 생성자에 대한 경험이 없습니다.

+0

귀하의 제안은 결과에서 \ n 줄 종결자가 없어집니다. – Gabriel

+0

@Gabriel 좋은 지적. 무엇에 대해서 :'br.lines(). reduce ("\ n", String :: concat)' –