295

How can I transform a String value into an InputStreamReader?

dantiston
5,4212 gold badges28 silver badges30 bronze badges
asked Oct 29, 2008 at 15:06
0

6 Answers 6

339

ByteArrayInputStream also does the trick:

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

Then convert to reader:

InputStreamReader reader = new InputStreamReader(is);
rogerdpack
67.5k40 gold badges288 silver badges408 bronze badges
answered Oct 29, 2008 at 15:12
4
  • 3
    You might want to inherit the platform's default charset. Commented Oct 29, 2008 at 15:21
  • 2
    Thanks. Done. What's the best way to detect the plataform's default charset ? Commented Oct 29, 2008 at 16:14
  • 5
    Or just use getBytes() without a parameter... Arguably it should not exist, but it will use the default encoding. Commented Aug 11, 2009 at 15:34
  • 1
    ByteArrayInputStream : Since: JDK1.0 There’s not the slightest reason to assume that this class is "since Java 1.4". That wrong version number is especially weird as Java 1.4 introduced NIO and it makes little sense to introduce an API and its conceptional successor within the same version. Commented Mar 31, 2015 at 11:00
64

I also found the apache commons IOUtils class , so :

InputStreamReader isr = new InputStreamReader(IOUtils.toInputStream(myString));
Termininja
7,05412 gold badges51 silver badges50 bronze badges
answered Oct 29, 2008 at 15:52
6
  • 36
    Converting String->byte[] or vice versa without mentioning a character encoding is almost always a bug. Commented Aug 11, 2009 at 15:31
  • 1
    This may cause data loss, depending on the default platform encoding and characters in the string. Specifying a Unicode encoding for both encoding and decoding operations would be better. Read this for more details: illegalargumentexception.blogspot.com/2009/05/… Commented Aug 11, 2009 at 15:44
  • Isn't the encoding param just needed to get bytes in a certain encoding? I think as long as you pick the same encoding for the String#getBytes call as you pick for the InputSTreamReader constructor, it doesn't really matter which one you pick. I am pretty sure that Joachim and McDowell are wrong for this specific case. No encoding knowledge needed for wrapping an InputStreamReader around a String. Commented Dec 3, 2010 at 15:10
  • 4
    @Stijn de Witt - belated reply I know, but I just saw this. If the default platform encoding does not support the code points in the string, data loss will result. If your default encoding is UTF-8, no problem. If you're running on Windows, you'd lose most of the Unicode set because those JREs default to legacy "ANSI" encodings. The proof is in the link I posted. new InputStreamReader(IOUtils.toInputStream(myString, "UTF-16"), "UTF-16") would be lossless. Commented Feb 22, 2011 at 20:46
  • hooray, using a 3rd party library to turn a one-liner into...a larger one-liner. Not to speak about useless conversion of a String into a byte[] array to convert the bytes back to chars then... Commented Mar 31, 2015 at 11:04
34

Does it have to be specifically an InputStreamReader? How about using StringReader?

Otherwise, you could use StringBufferInputStream, but it's deprecated because of character conversion issues (which is why you should prefer StringReader).

answered Oct 29, 2008 at 15:08
0
17

Same question as @Dan - why not StringReader ?

If it has to be InputStreamReader, then:

String charset = ...; // your charset
byte[] bytes = string.getBytes(charset);
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
InputStreamReader isr = new InputStreamReader(bais);
answered Oct 29, 2008 at 15:13
2
  • Nice, but 2nd line should be byte[] bytes = charset.getBytes(); Commented Nov 18, 2011 at 6:53
  • 1
    I don't think so Abhishek. In my example, string is the instance of String that you wish to access using an InputStreamReader. Commented Nov 18, 2011 at 10:35
4

Are you trying to get a) Reader functionality out of InputStreamReader, or b) InputStream functionality out of InputStreamReader? You won't get b). InputStreamReader is not an InputStream.

The purpose of InputStreamReader is to take an InputStream - a source of bytes - and decode the bytes to chars in the form of a Reader. You already have your data as chars (your original String). Encoding your String into bytes and decoding the bytes back to chars would be a redundant operation.

If you are trying to get a Reader out of your source, use StringReader.

If you are trying to get an InputStream (which only gives you bytes), use apache commons IOUtils.toInputStream(..) as suggested by other answers here.

answered Jan 12, 2015 at 17:21
2

You can try Cactoos:

InputStream stream = new InputStreamOf(str);

Then, if you need a Reader:

Reader reader = new ReaderOf(stream);
answered Aug 27, 2017 at 12:56

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.