2011-04-29 18 views
16

Ho rubato questo frammento dal web. Ma sembra essere limitato a 4096 byte ed è piuttosto brutto IMO. Qualcuno sa di un approccio migliore? In realtà sto usando Groovy btw ...Converti stream in stringa 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:

ho trovato una soluzione migliore in Groovy:

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

risposta

36

Alcune buone e veloci risposte. Comunque penso che il migliore sia Groovy ha aggiunto un metodo "getText" a InputStream. Quindi tutto ciò che dovevo fare era stream.text. E buona chiamata sul commento 4096.

+2

Quindi hai controllato i documenti _dopo_ chiedere? Almeno potresti incollare un esempio del suo utilizzo. – Anon

+1

Ho continuato a curare, naturalmente, non ho visto il metodo .text all'inizio. Ecco lo snippet di codice: InputStream exportTemplateStream = getClass(). GetClassLoader().getResourceAsStream ("export.template") assert exportTemplateStream: "[export.template stream] risorsa non trovata" String exportTemplate = exportTemplateStream.text –

+0

sufficientemente corretto. Ma come ho detto agli altri: usa la variante che prende un set di caratteri esplicito - il set di caratteri predefinito è raramente quello che vuoi. – Anon

4

si può fare abbastanza facilmente utilizzando la classe 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

È necessario passare un set di caratteri o si avrà un errore difficile da diagnosticare. – Anon

+0

@non, questo codice potrebbe contenere molti bug. Il codice è presentato solo come un esempio; da non utilizzare in produzione. – jjnguy

+1

@jinguy - la presentazione del codice buggy "migliora Internet"? O semplicemente aggiungere al rappresentante? – Anon

4

Sta leggendo l'input in blocchi di 4096 byte (4KB), ma la dimensione della stringa effettiva non è limite ed in quanto continua a leggere di più e ad aggiungerlo a SringBuffer.

7

Prova IOUtils da Apache Commons:

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

Questo frammento ha un bug: se l'ingresso utilizza una codifica dei caratteri multi-byte, c'è una buona probabilità che un singolo carattere si articolerà in due letture (e non essere convertibile). E ha anche il semi-bug che si basa sulla codifica predefinita della piattaforma.

Utilizzare invece Jakarta Commons IO. In particolare, la versione di IOUtils.toString() che prende uno InputStream e applica una codifica ad esso.

1

Per i revisori futuri che hanno problemi simili, si prega di notare che sia IOUtils di Apache che Groovy's InputStream.getText() richiedono il flusso per essere completato, o essere chiuso prima di tornare. Se stai lavorando con un flusso persistente, non dovrai occuparti dell'esempio "brutto" che Phil ha originariamente pubblicato, o lavorare con IO non bloccante.

0

Si può provare qualcosa di simile a questo

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

Per 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

Il getText() senza codifica, userà la codifica attuale sistema, ex ("UTF-8 ").