2013-02-23 16 views
20
@POST 
@Path("/getphotos") 
@Produces(MediaType.TEXT_HTML) 
public String getPhotos() throws IOException{ 
    // DataInputStream rd = new DataInputStream(request.getInputStream()); 
    BufferedReader rd = new BufferedReader(
     new InputStreamReader(request.getInputStream(), "UTF-8") 
    ); 
    String line = null; 
    String message = new String(); 
    final StringBuffer buffer = new StringBuffer(2048); 
    while ((line = rd.readLine()) != null) { 
     // buffer.append(line); 
     message += line; 
    } 
    System.out.println(message); 
    JsonObject json = new JsonObject(message); 
    return message; 
} 

Il codice sopra riportato è per il mio servlet. Il suo scopo è quello di ottenere un flusso, creare un file Json da esso e quindi inviare il Json al client. Ma per fare Json, devo leggere l'oggetto BufferedReaderrd usando un ciclo "while". Tuttavia mi piacerebbe convertire rd per stringere il minor numero possibile di righe di codice. Come lo faccio?Come convertire facilmente un BufferedReader in una stringa?

+0

difficile vedere che cosa il vostro obiezione a tre righe in più di codice potrebbe essere. – EJP

risposta

43

Io suggerisco di usare comuni biblioteca IO - allora è un semplice 1 fodera:

String message = org.apache.commons.io.IOUtils.toString(rd); 

naturalmente, essere consapevoli del fatto che l'utilizzo di questo meccanismo, potrebbe essere fatto un attacco denial of service, con l'invio di un senza fine flusso di dati che riempirà la memoria del server.

+0

wow posso farlo, grazie al tuo aiuto. –

+0

esattamente quello di cui avevo bisogno! –

+11

Java ha assolutamente bisogno di più one-liner –

3

utilizzare una variabile come stringa in questo modo:

BufferedReader rd = new BufferedReader(
       new InputStreamReader(response.getEntity().getContent())); 
String line = ""; 
while((line = rd.readLine()) != null){ 

} 
+0

L'ultima riga del buffer non verrà aggiunta alla String se non finisce con ' \ n ' –

+0

@AmineZaine Non è corretto Provalo – EJP

+1

Tuttavia, questo è esattamente uguale al codice che è stato pubblicato, solo peggio – EJP

6

mi sono trovato a fare questo oggi. Non volevo portare in IOUtils, così sono andato con questo:

String response = new String(); 
for (String line; (line = br.readLine()) != null; response += line); 
13

Da Java 8:

rd.lines().collect(Collectors.joining()); 
+1

Eccellente! Le persone dovrebbero dare più valore alle soluzioni che non richiedono l'aggiunta di grosse librerie di grassi A proposito dei miei progetti: –

+1

A proposito, dovevo fare in modo che 'Collectors.joining (" \ n ")' aggiungesse un carattere di fine riga finale a ciascuna linea –

+0

'Call richiede il livello API 24 (min corrente xx): java. io.BufferedReader # linee' –

Problemi correlati