Come faccio a trasformare una stringa in un InputStreamReader in Java?


281

Come posso trasformare un Stringvalore in un InputStreamReader?

Risposte:


327

ByteArrayInputStream fa anche il trucco:

InputStream is = new ByteArrayInputStream( myString.getBytes( charset ) );

Quindi converti in lettore:

InputStreamReader reader = new InputStreamReader(is);

3
Potresti voler ereditare il set di caratteri predefinito della piattaforma.
magro,

2
Grazie. Fatto. Qual è il modo migliore per rilevare il set di caratteri predefinito del plataform?
Guido,

5
O semplicemente usa getBytes () senza un parametro ... Probabilmente non dovrebbe esistere, ma utilizzerà la codifica predefinita.
Michael Borgwardt,

1
ByteArrayInputStream : Since: JDK1.0 Non c'è il minimo motivo di ritenere che questa classe sia "da Java 1.4". Quel numero di versione errato è particolarmente strano come introdotto in Java 1.4 NIOed ha poco senso introdurre un'API e il suo successore concettuale nella stessa versione.
Holger

61

Ho anche trovato la IOUtilsclasse commons apache , quindi:

InputStreamReader isr = new InputStreamReader(IOUtils.toInputStream(myString));

35
La conversione di String-> byte [] o viceversa senza menzionare una codifica dei caratteri è quasi sempre un bug.
Joachim Sauer,

1
Ciò può causare la perdita di dati, a seconda della codifica della piattaforma predefinita e dei caratteri nella stringa. Specificare una codifica Unicode sia per le operazioni di codifica che di decodifica sarebbe meglio. Leggi questo per maggiori dettagli: illegalargumentexception.blogspot.com/2009/05/…
McDowell

Il parametro di codifica non è solo necessario per ottenere byte in una determinata codifica? Penso che finché scegli la stessa codifica per la chiamata String # getBytes che scegli per il costruttore InputSTreamReader, non importa quale scegli. Sono abbastanza sicuro che Joachim e McDowell abbiano torto in questo caso specifico. Nessuna conoscenza di codifica necessaria per avvolgere un InputStreamReader attorno a una stringa.
Stijn de Witt,

4
@Stijn de Witt - risposta tardiva Lo so, ma ho appena visto questo. Se la codifica della piattaforma predefinita non supporta i punti di codice nella stringa, si verificherà una perdita di dati. Se la codifica predefinita è UTF-8, nessun problema. Se si esegue Windows, si perderebbe la maggior parte del set Unicode perché tali JRE predefiniti sono codifiche "ANSI" legacy. La prova è nel link che ho pubblicato. new InputStreamReader(IOUtils.toInputStream(myString, "UTF-16"), "UTF-16")sarebbe senza perdita di dati.
McDowell,

evviva, usando una libreria di terze parti per trasformare una copertina in ... una copertina più grande. Per non parlare della conversione inutile di a Stringin un byte[]array per convertire i byte in chars poi ...
Holger

32

Deve essere specificamente un InputStreamReader? Che ne dici di usare StringReader ?

Altrimenti, potresti usare StringBufferInputStream , ma è obsoleto a causa di problemi di conversione dei caratteri (motivo per cui dovresti preferire StringReader).


16

Stessa domanda di @Dan - perché non StringReader?

Se deve essere InputStreamReader, quindi:

String charset = ...; // your charset
byte[] bytes = string.getBytes(charset);
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
InputStreamReader isr = new InputStreamReader(bais);

Bello, ma la seconda linea dovrebbe esserebyte[] bytes = charset.getBytes();
AabinGunz,

1
Non penso così Abhishek. Nel mio esempio, stringa è l'istanza di String a cui si desidera accedere utilizzando un InputStreamReader.
toolkit,

3

Stai cercando di ottenere a) Readerfunzionalità da InputStreamReadero b) InputStreamfunzionalità da InputStreamReader? Non otterrai b). InputStreamReadernon è un InputStream.

Lo scopo di InputStreamReaderè prendere un InputStream- una fonte di byte - e decodificare i byte in caratteri sotto forma di a Reader. Hai già i tuoi dati come caratteri (la tua stringa originale). Codificare la stringa in byte e decodificare i byte in caratteri sarebbe un'operazione ridondante.

Se stai cercando di Readerestrarre la tua fonte, usa StringReader.

Se stai cercando di ottenere un InputStream(che ti dà solo byte), usa i comuni apache IOUtils.toInputStream(..)come suggerito da altre risposte qui.


2

Puoi provare Cactoos :

InputStream stream = new InputStreamOf(str);

Quindi, se hai bisogno di un Reader:

Reader reader = new ReaderOf(stream);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.