2009-11-19 51 views
17

假設我有一個InputStream包含文本數據,我想將其轉換爲String(例如,以便我可以將流的內容寫入日誌文件)。如何將InputStream轉換爲Java中的字符串?

InputStream轉換爲String的最簡單方法是什麼?

public String convertStreamToString(InputStream is) { 
    // ??? 
} 
+4

的可能重複[在Java中如何做到讀取到一個字符串輸入流?](HTTP://計算器。 com/questions/309424/in-java-how-do-a-read-an-input-stream-in-to-a-string) – 2010-08-13 18:24:20

+0

同意。我已投票決定將其作爲重複關閉並編輯另一個問題,以包含來自此處的一些標題關鍵字和問題文本。 – 2010-08-17 09:26:46

回答

17

這是我的版本,

public static String readString(InputStream inputStream) throws IOException { 

    ByteArrayOutputStream into = new ByteArrayOutputStream(); 
    byte[] buf = new byte[4096]; 
    for (int n; 0 < (n = inputStream.read(buf));) { 
     into.write(buf, 0, n); 
    } 
    into.close(); 
    return new String(into.toByteArray(), "UTF-8"); // Or whatever encoding 
} 
0

可以使用BufferedReader來讀取流到循環中的StringBuilder,然後從StringBuilder得到的全部內容:

public String convertStreamToString(InputStream is) { 
    BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
    StringBuilder sb = new StringBuilder(); 

    String line = null; 

    try { 
    while ((line = reader.readLine()) != null) { 
    sb.append(line + "\n"); 
    } 
    } catch (IOException e) { 
    e.printStackTrace(); 
    } finally { 
    try { 
     is.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    } 

    return sb.toString(); 
} 

全面披露:這是一個解決方案,我發現在KodeJava.org。我在這裏發表評論和批評。

+2

請記住,您正在使用的BufferedReader構造函數假定平臺對來自InputStream的字節進行了默認文本編碼,這可能是錯誤的。您必須知道編碼並在Reader構造函數中指定它。 – 2009-11-19 14:51:43

+4

通過使用此構造函數,您可以告訴InputStreamReader使用默認的平臺編碼,應該避免這種情況。您應該指定數據編碼的字符集,以便使用其他三種構造函數之一正確解碼。 – Sylar 2009-11-19 14:54:34

+2

使用BufferedReader在換行符上分割輸入也是不必要的,只是爲了將換行符手動添加到StringBuilder,並且幾乎是一個WTF來實際使用StringBuilder來防止創建String對象,但是隨後調用append(line +「 \ n「)而不是append(line).append(」\ n「)。關閉InputStream也不是特別聰明。 – jarnbjo 2009-11-19 15:49:07

23

如果你想簡單可靠地做到這一點,我建議使用Apache Jakarta Commons IO庫IOUtils.toString(java.io.InputStream, java.lang.String)的方法。

+1

這是一條簡短又甜美的道路。 – 2009-11-19 15:20:29

+2

唯一的缺點就是你需要在這個庫中使用外部依賴,這可能並不總是需要的。 – 2009-11-19 16:20:21

+1

您*需要*指定編碼,否則它將使用平臺默認值,這是任何可靠的。 – 2011-03-10 15:25:06

4
String text = new Scanner(inputStream).useDelimiter("\\A").next(); 

here

+0

* BEST *答案。 – 2013-06-14 15:42:59

相關問題