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


Odpowiedzi:


327

ByteArrayInputStream robi także lewę:

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

Następnie przekonwertuj na czytnik:

InputStreamReader reader = new InputStreamReader(is);

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));

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).


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);

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.


2

Możesz wypróbować Cactoos :

InputStream stream = new InputStreamOf(str);

Następnie, jeśli potrzebujesz Reader:

Reader reader = new ReaderOf(stream);
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.