2011-04-29 8 views
16

Ukradłem ten fragment z sieci. Ale wygląda na to, że jest ograniczone do 4096 bajtów i jest dość brzydkie IMO. Ktoś wie o lepszym podejściu? Jestem rzeczywiście przy Groovy btw ...Konwertuj strumień na ciąg Java/Groovy

String streamToString(InputStream input) { 
     StringBuffer out = new StringBuffer(); 
     byte[] b = new byte[4096]; 
     for (int n; (n = input.read(b)) != -1;) { 
      out.append(new String(b, 0, n)); 
     } 
     return out.toString(); 
    } 

EDIT:

znalazłem lepsze rozwiązanie w Groovy:

InputStream exportTemplateStream = getClass().getClassLoader().getResourceAsStream("export.template") 
assert exportTemplateStream: "[export.template stream] resource not found" 
String exportTemplate = exportTemplateStream.text 

Odpowiedz

36

Kilka dobrych i szybkich odpowiedzi. Jednak myślę, że najlepszy jest Groovy dodała metodę "getText" do InputStream. Więc wszystko, co musiałem zrobić, to stream.text. I dobrze zadzwoń do komentarza 4096.

+2

Sprawdziłeś dokumenty, pytając? Przynajmniej możesz wkleić przykład jego użycia. – Anon

+1

Nadal opiekowałem się zapytałem oczywiście, nie widziałem najpierw metody .text. Oto fragment kodu: InputStream exportTemplateStream = getClass(). GetClassLoader().getResourceAsStream ("export.template") assert exportTemplateStream: "Nie znaleziono zasobu [export.template]" String exportTemplate = exportTemplateStream.text –

+0

Wystarczająco. Ale tak jak powiedziałem innym: użyj wariantu, który przyjmuje jawny zestaw znaków - domyślny zestaw znaków rzadko jest tym, czego potrzebujesz. – Anon

4

można to zrobić dość łatwo za pomocą klasy Scanner:

String streamToSring(InputStream input) { 
    Scanner s = new Scanner(input); 
    StringBuilder builder = new StringBuilder(); 
    while (s.hasNextLine()) { 
     builder.append(s.nextLine() +"\n"); 
    } 
    return builder.toString(); 
} 
+0

Musisz przekazać zestaw znaków lub będziesz mieć trudny do zdiagnozowania błąd. – Anon

+0

@Anon, ten kod może zawierać wiele błędów. Kod jest przedstawiony jedynie jako przykład; nie do wykorzystania w produkcji. – jjnguy

+1

@jinguy - czy prezentuje błędny kod "usprawnić Internet"? Lub po prostu dodać do rep? – Anon

4

Odczytuje dane wejściowe w porcjach 4096 bajtów (4KB), ale rozmiar rzeczywistego łańcucha nie jest limitem ed, ponieważ czyta dalej i dołącza do SringBuffer.

7

Spróbuj IOUtils z Apache Commons:

String s = IOUtils.toString(inputStream, "UTF-8"); 
2

To snippet ma błąd: jeśli wejście wykorzystuje kodowanie znaków multi-bajtowy, istnieje duża szansa, że ​​jedna postać będzie obejmować dwa czyta (a nie być konwertowalny). Ma też półproblem, który polega na domyślnym kodowaniu platformy. Zamiast tego, użyj Jakarta Commons IO. W szczególności wersja IOUtils.toString(), która pobiera InputStream i stosuje do niej kodowanie.

1

Dla przyszłych recenzentów, którzy mają podobne problemy, należy pamiętać, że zarówno IOUtils z Apache, jak i metoda Groovy InputStream.getText() wymagają zakończenia strumienia lub zamknięcia przed powrotem. Jeśli pracujesz z ciągłym strumieniem, nie będziesz w stanie poradzić sobie z "brzydkim" przykładem, który pierwotnie opublikował Phil, lub pracować z nieblokującą IO.

0

Można spróbować czegoś podobnego do tego

new FileInputStream(new File("c:/tmp/file.txt")).eachLine { println it } 
7

Dla Groovy

filePath = ... //< a FilePath object 
stream = filePath.read() //< InputStream object 

content = stream.getText("UTF-16") //< Specify the encoding, and get the String object 

The InputStream class reference

getText() bez kodowania, użyje aktualną kodowanie systemu, ex ("UTF-8 ").