2008-10-29 19 views

cevap

278

ByteArrayInputStream da hile yapar?

o zaman InputStreamReader olmak zorundaysa:

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

gerçekten güvenli tarafta olmak üzere, charset belirtmelidir. – toolkit

+2

Platformun varsayılan karakter kümesini miras almak için * isteyebilirsiniz. – slim

+1

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

31

Özellikle bir InputStreamReader olması gerekiyor mu? StringReader'u kullanmaya ne dersiniz?

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

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

aynı soruyu @Dan olarak - neden StringReader değil:

+0

Güzel, ama 2. satır byte olmalıdır [] bytes = charset.getBytes(); ' – abi1964

+1

Ben Abhishek düşünmüyorum. Örneğimde string, bir InputStreamReader kullanarak erişmek istediğiniz String örneğidir. – toolkit

58

veya b) InputStreamReader dışında InputStream işlevselliği? B) alamayacaksın. InputStreamReader, InputStream değil.

InputStreamReader'un amacı InputStream - bir bayt kaynağı almak ve baytları Reader biçiminde chars olarak çözmektir. Verilerinizi zaten karakter olarak (orijinal dizginiz) var. String'inizi baytlara kodlamak ve baytları tekrar chars'a çözmek, gereksiz bir işlem olacaktır.

Kaynağınızdan Reader almaya çalışıyorsanız, StringReader kullanın.

InputStream (yalnızca bayt verir) almaya çalışıyorsanız, diğer yanıtlar tarafından önerilen şekilde apache commons IOUtils.toInputStream(..) kullanın.

+31

Dize-> bayt [] 'ı dönüştürme veya bunun tersi bir karakter kodlamasını belirtmeden hemen hemen her zaman bir hatadır. –

+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 Unicode kodlaması belirtmek daha iyi olurdu. Daha fazla bilgi için bunu okuyun: http://illegalargumentexception.blogspot.com/2009/05/java-rough-guide-to-character-encoding.html#javaencoding_lossyconversions – McDowell

+0

Kodlama paramının sadece belirli bir bayt almak için gerekli değil mi kodlama? Ben InputSTreamReader yapıcı için seçtiğiniz gibi String # getBytes çağrısı için aynı kodlamayı seçtiğiniz sürece, hangisini seçeceğiniz önemli değil. Bu özel durum için Joachim ve McDowell'in yanlış olduğuna eminim. Bir InputStreamReader'ı bir String'in etrafına sarmak için kodlama bilgisi gerekmez. –

2

Eğer InputStreamReader dışarı) Reader işlevselliği çıkarmaya mı çalışıyorsunuz: Ben de Apache Commons yüzden IOUtils sınıfı, bulunan

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

Sen Cactoos deneyebilirsiniz:

InputStream stream = new InputStreamOf(str); 

Sonra bir Reader gerekirse:

Reader reader = new ReaderOf(stream); 
İlgili konular