2009-12-11 39 views
18

Nếu tôi bắt đầu với java.io.InputStream, cách dễ nhất để đọc toàn bộ luồng ra thành chuỗi (giả sử là utf-8) là gì?Đọc văn bản từ InputStream

Điều này sẽ khá dễ dàng nhưng tôi chủ yếu là người C# và Google không làm tôi thất vọng. Cảm ơn.

+2

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

+0

doh, tôi đã không tìm kiếm "Đầu vào Luồng "(có khoảng trắng ở giữa). – jthg

Trả lời

17

Tùy thuộc vào giấy phép bạn cảm thấy thoải mái, đó là one liner với thư viện IO-Commons IO.

+2

+1 - trừ khi bạn biết mình đang làm gì, việc sử dụng lại thư viện được sử dụng rộng rãi sẽ tiết kiệm thời gian và công sức. –

+2

Tôi đã sử dụng org.apache.commons.io.IOUtils.toString (đầu vào InputStream, mã hóa chuỗi) – jthg

+2

Tôi luôn bỏ phiếu khi mọi người đề xuất điều gì đó từ Jakarta Commons. Như nhàm chán như nó là, bạn vẫn có một số logic kinh doanh để cung cấp vào cuối ngày và nó không có ý nghĩa để phát minh lại bánh xe mỗi ngày. –

0

Đọc/ghi từ các luồng là rất đáng kể trong 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

trao đổi InputStreamReader mới (luồng) bằng InputStreamReader mới (luồng, "UTF-8") – Buhb

+1

Mã ngắt dòng của bạn. –

+0

Xong, cảm ơn các mẹo –

9

Làm chỉ định mã hóa ký tự. Không mã chất thải, giới thiệu lỗi và thực thi chậm với BufferedReader.

Đây là một ví dụ. Bạn có thể tham số hóa nó với kích thước bộ đệm, mã hóa, v.v.

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 - nhưng một thành ngữ phổ biến là viết vòng lặp như sau: 'int n; trong khi ((n = r.read (buf))> = 0) {s.append (buf, 0, n); } ' –

+4

Thật không may, một thành ngữ phổ biến. Nhưng tôi thích tránh các xét nghiệm với các tác dụng phụ. – erickson

1

Sử dụng Commons-IO có thể là lựa chọn tốt nhất. Đối với sự quan tâm của bạn, cách tiếp cận khác là sao chép tất cả các byte và sau đó chuyển đổi nó thành một chuỗi.

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

Tôi đã tìm thấy một cách tốt đẹp trong Java 8 với suối:

public static String readString(InputStream is) { 
    BufferedReader br = new BufferedReader(new InputStreamReader(is)); 
    String content = br.lines().reduce("", String::concat); 
    return content; 
} 

Như đã trình bày ở trên, bạn có thể trao đổi InputStreamReader mới (là) với InputStreamReader mới (nghĩa là, "UTF-8") , nhưng tôi không có kinh nghiệm với nhà xây dựng này.

+0

Đề xuất của bạn sẽ mất \ n dòng terminators trong kết quả. – Gabriel

+0

@Gabriel điểm tốt. Điều gì về: 'br.lines(). Reduce (" \ n ", String :: concat)' –

Các vấn đề liên quan