Jak przekształcić ciąg w InputStreamReader w Javie?

281

Jak mogę przekształcić Stringwartość w InputStreamReader?

Yossale
źródło

Odpowiedzi:

327

ByteArrayInputStream robi także lewę:

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

Następnie przekonwertuj na czytnik:

InputStreamReader reader = new InputStreamReader(is);
Guido
źródło
3
Możecie chce dziedziczyć domyślnego kodowania platformy.
szczupły
2
Dzięki. Gotowe. Jaki jest najlepszy sposób na wykrycie domyślnego zestawu znaków platformy?
Guido
5
Lub po prostu użyj getBytes () bez parametru ... Prawdopodobnie nie powinien istnieć, ale użyje domyślnego kodowania.
Michael Borgwardt,
1
ByteArrayInputStream : Od: JDK1.0 Nie ma najmniejszego powodu, aby zakładać, że ta klasa jest „od Java 1.4”. Ten nieprawidłowy numer wersji jest szczególnie dziwny, gdy wprowadzono Javę 1.4 NIOi nie ma sensu wprowadzać API i jego następcy koncepcyjnego w tej samej wersji.
Holger
61

Znalazłem także IOUtilsklasę apache commons , więc:

InputStreamReader isr = new InputStreamReader(IOUtils.toInputStream(myString));
Yossale
źródło
35
Konwersja ciągu-> bajt [] lub odwrotnie bez wspominania o kodowaniu znaków jest prawie zawsze błędem.
Joachim Sauer,
1
Może to spowodować utratę danych, w zależności od domyślnego kodowania platformy i znaków w ciągu. Lepsze byłoby określenie kodowania Unicode zarówno dla operacji kodowania, jak i dekodowania. Przeczytaj to, aby uzyskać więcej informacji: niedozwolonyargumentexception.blogspot.com/2009/05/…
McDowell,
Czy parametr kodowania nie jest potrzebny tylko do uzyskania bajtów w określonym kodowaniu? Myślę, że dopóki wybierzesz to samo kodowanie dla wywołania String # getBytes, jak wybierzesz konstruktor InputSTreamReader, tak naprawdę nie ma znaczenia, który wybierzesz. Jestem pewien, że Joachim i McDowell mylą się w tej konkretnej sprawie. Nie jest wymagana wiedza na temat kodowania do zawijania InputStreamReadera wokół ciągu znaków.
Stijn de Witt,
4
@Stijn de Witt - spóźniona odpowiedź Wiem, ale właśnie to widziałem. Jeśli domyślne kodowanie platformy nie obsługuje punktów kodowych w łańcuchu, nastąpi utrata danych. Jeśli domyślnym kodowaniem jest UTF-8, nie ma problemu. Jeśli używasz systemu Windows, stracisz większość zestawu Unicode, ponieważ te środowiska JRE domyślnie kodują starsze kodowania „ANSI”. Dowód znajduje się w linku, który opublikowałem. new InputStreamReader(IOUtils.toInputStream(myString, "UTF-16"), "UTF-16")byłby bezstratny.
McDowell,
Brawo, używając biblioteki innej firmy, aby zmienić jeden liniowiec w… większy jeden liniowiec. Nie mówiąc już o bezużytecznej konwersji Stringdo byte[]tablicy do konwersji bajtów z powrotem do chars potem ...
Holger
32

Czy musi to być konkretnie InputStreamReader? Co powiesz na korzystanie z StringReader ?

W przeciwnym razie możesz użyć StringBufferInputStream , ale jest on przestarzały z powodu problemów z konwersją znaków (dlatego powinieneś preferować StringReader).

Dan Dyer
źródło
16

To samo pytanie co @Dan - dlaczego nie StringReader?

Jeśli musi to być InputStreamReader, to:

String charset = ...; // your charset
byte[] bytes = string.getBytes(charset);
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
InputStreamReader isr = new InputStreamReader(bais);
zestaw narzędzi
źródło
Fajnie, ale druga linia powinna byćbyte[] bytes = charset.getBytes();
AabinGunz
1
Nie sądzę, Abhishek. W moim przykładzie string jest instancją klasy String, do której chcesz uzyskać dostęp za pomocą InputStreamReader.
zestaw narzędzi
3

Czy próbujesz uzyskać a) Readerfunkcjonalność InputStreamReaderlub b) InputStreamfunkcjonalność InputStreamReader? Nie dostaniesz b). InputStreamReadernie jest InputStream.

Celem InputStreamReaderjest pobranie InputStream- źródła bajtów - i zdekodowanie bajtów na znaki w postaci Reader. Masz już swoje dane jako znaki (oryginalny ciąg). Kodowanie łańcucha w bajtach i dekodowanie bajtów z powrotem do znaków byłoby operacją nadmiarową.

Jeśli próbujesz wydostać Readersię ze źródła, użyj StringReader.

Jeśli próbujesz uzyskać InputStream(który daje tylko bajty), użyj apache commons, IOUtils.toInputStream(..)jak sugerują inne odpowiedzi tutaj.

Fai Ng
źródło
2

Możesz wypróbować Cactoos :

InputStream stream = new InputStreamOf(str);

Następnie, jeśli potrzebujesz Reader:

Reader reader = new ReaderOf(stream);
yegor256
źródło