2008-10-29 21 views

Odpowiedz

278

ByteArrayInputStream robi również trick:

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

naprawdę powinny określić charset, aby być po bezpiecznej stronie. – toolkit

+2

Możesz * chcieć * dziedziczyć domyślny zestaw znaków platformy. – slim

+1

Dzięki. Gotowe. Jaki jest najlepszy sposób na wykrycie domyślnego zestawu znaków plataform? –

31

Czy to musi być konkretnie InputStreamReader? Jak korzystać z StringReader?

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

16

samo pytanie jak @Dan - dlaczego nie StringReader?

Jeśli ma być InputStreamReader, a następnie:

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

Ładne, ale druga linia powinna być "bajtem [] bytes = charset.getBytes();' – abi1964

+1

Nie sądzę, abhishek. W moim przykładzie string jest instancją String, do której chcesz uzyskać dostęp za pomocą InputStreamReader. – toolkit

58

I także, że Apache Commons IOUtils klasę, więc:

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

Konwersja String-> byte [] lub na odwrót bez wspominania o kodowaniu znaków jest prawie zawsze błędem. –

+1

Może to spowodować utratę danych, w zależności od domyślnego kodowania platformy i znaków w łańcuchu. Określenie kodowania Unicode dla operacji kodowania i dekodowania byłoby lepsze. Przeczytaj ten artykuł, aby uzyskać więcej informacji: http://illegalargumentexception.blogspot.com/2009/05/java-rough-guide-to-character-encoding.html#javaencoding_lossyconversions – McDowell

+0

Czy kodowanie nie jest potrzebne, aby uzyskać bajty w pewnych kodowanie? Myślę, że tak długo jak wybierzesz to samo kodowanie dla wywołania String # getBytes, gdy wybierzesz konstruktor InputStreamReader, nie ma to znaczenia, który wybierzesz. Jestem pewien, że Joachim i McDowell nie mają racji w tym konkretnym przypadku. Brak wiedzy o kodowaniu potrzebnej do zawijania InputStreamReader wokół String. –

2

starasz się dostać) Reader funkcjonalność z InputStreamReader lub b) InputStream funkcjonalność z InputStreamReader? Nie dostaniesz b). InputStreamReader nie jest InputStream.

Celem InputStreamReader jest pobranie InputStream - źródła bajtów - i dekodowanie bajtów do znaków w postaci Reader. Masz już swoje dane jako znaki (twój oryginalny ciąg). Zakodowanie ciągu znaków w bajtach i odszyfrowanie bajtów z powrotem do znaków będzie działaniem nadmiarowym.

Jeśli próbujesz uzyskać Reader 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żna spróbować Cactoos:

InputStream stream = new InputStreamOf(str); 

Następnie, jeśli potrzebujemy Reader:

Reader reader = new ReaderOf(stream);