Java bir InputStreamReader bir dize nasıl dönüştürebilirim?


281

Bir Stringdeğeri nasıl bir haline dönüştürebilirim InputStreamReader?

Yanıtlar:


327

ByteArrayInputStream hile de yapar:

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

Ardından okuyucuya dönüştürün:

InputStreamReader reader = new InputStreamReader(is);

3
Sen belki istediğiniz platformun varsayılan karakter kümesi miras.
ince

2
Teşekkürler. Bitti. Plataform'un varsayılan karakter kümesini tespit etmenin en iyi yolu nedir?
Guido

5
Veya sadece parametre olmadan getBytes () kullanın ... Muhtemelen mevcut olmamalı, ancak varsayılan kodlamayı kullanacaktır.
Michael Borgwardt

1
ByteArrayInputStream : Since: JDK1.0 Bu sınıfın “Java 1.4'ten beri” olduğunu varsaymanın en ufak bir nedeni yoktur. Bu yanlış sürüm numarası özellikle Java 1.4'ün tanıtımı kadar tuhaftır NIOve aynı sürümde bir API ve onun kavramsal halefini tanıtmak çok mantıklı değildir.
Holger

61

Ayrıca apache commons IOUtilssınıfı buldum , yani:

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

35
Bir karakter kodlamadan bahsetmeden String-> byte [] veya tersini dönüştürmek neredeyse her zaman bir hatadır.
Joachim Sauer

1
Bu, varsayılan platform kodlamasına ve dizedeki karakterlere bağlı olarak veri kaybına neden olabilir. Hem kodlama hem de kod çözme işlemleri için bir Unicode kodlaması belirtmek daha iyi olur. Daha fazla bilgi için bunu okuyun: illegalargumentexception.blogspot.com/2009/05/…
McDowell

Belirli bir kodlamada bayt elde etmek için kodlama parametresine ihtiyaç duyulmuyor mu? Eğer InputSTreamReader yapıcı için seçtiğiniz String # getBytes çağrısı için aynı kodlama seçtiğiniz sürece, gerçekten hangisini seçtiğiniz önemli değil. Joachim ve McDowell'in bu özel durum için yanlış olduğundan eminim. Bir InputStreamReader öğesini bir Dizenin etrafına sarmak için kodlama bilgisi gerekmez.
Stijn de Witt

4
@Stijn de Witt - gecikmiş cevap biliyorum, ama bunu gördüm. Varsayılan platform kodlaması dizedeki kod noktalarını desteklemiyorsa, veri kaybı oluşur. Varsayılan kodlamanız UTF-8 ise sorun değil. Windows üzerinde çalışıyorsanız, bu JRE'ler varsayılan olarak "ANSI" kodlamaları varsayılan olduğundan Unicode kümesinin çoğunu kaybedersiniz. Kanıt gönderdiğim bağlantıda. new InputStreamReader(IOUtils.toInputStream(myString, "UTF-16"), "UTF-16")kayıpsız olurdu.
McDowell

Yaşasın, bir astarı daha büyük bir astara dönüştürmek için 3. taraf bir kütüphane kullanmak. A'nın Stringbir byte[]diziye gereksiz bir dönüşümünden bahsetmemek için, baytları chars'ye geri dönüştürmek için ...
Holger

32

Özellikle bir InputStreamReader olmalı mı? StringReader kullanmaya ne dersiniz ?

Aksi takdirde, StringBufferInputStream kullanabilirsiniz , ancak karakter dönüştürme sorunları nedeniyle kullanımdan kaldırılmıştır (bu nedenle StringReader'ı tercih etmelisiniz).


16

@Dan ile aynı soru - neden StringReader olmasın?

InputStreamReader olması gerekiyorsa, o zaman:

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

Güzel, ama 2. satır olmalıdırbyte[] bytes = charset.getBytes();
AabinGunz

1
Bence Abhishek. Örneğimde, string bir InputStreamReader kullanarak erişmek istediğiniz String örneğidir.
araç seti

3

A) Readerişlevselliğinden InputStreamReaderveya b) InputStreamişlevsellikten çıkmaya InputStreamReadermı çalışıyorsunuz? B) elde edemezsiniz. InputStreamReaderbir değil InputStream.

Amacı, InputStreamReaderbir almaktır InputStreambir şeklinde karakter bayt ve deşifre - bayt bir kaynak - Reader. Verilerinizi char (orijinal Dizeniz) olarak zaten aldınız. String'inizi baytlara kodlamak ve baytları karakterlere geri çözmek gereksiz bir işlemdir.

ReaderKaynağınızdan çıkmaya çalışıyorsanız kullanın StringReader.

Bir InputStream(yalnızca size bayt veren) almaya çalışıyorsanız, IOUtils.toInputStream(..)burada diğer yanıtların önerdiği şekilde apache ortaklarını kullanın .


2

Cactoos'u deneyebilirsiniz :

InputStream stream = new InputStreamOf(str);

Ardından, aşağıdakilere ihtiyacınız varsa Reader:

Reader reader = new ReaderOf(stream);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.