Java: Dize Dönüştürme ve ByteBuffer ve ilişkili sorunlar için
Ben kullanarak Java NİO benim için soket bağlantıları, ve benim protokolü metin tabanlı, çok ihtiyacım var edebilmek için Dizeleri dönüştürmek için ByteBuffers yazmadan önce onlara SocketChannel ve dönüştürmek gelen ByteBuffers geri Dizeler. Şu anda bu kodu kullanıyorum:
public static Charset charset = Charset.forName("UTF-8");
public static CharsetEncoder encoder = charset.newEncoder();
public static CharsetDecoder decoder = charset.newDecoder();
public static ByteBuffer str_to_bb(String msg){
try{
return encoder.encode(CharBuffer.wrap(msg));
}catch(Exception e){e.printStackTrace();}
return null;
}
public static String bb_to_str(ByteBuffer buffer){
String data = "";
try{
int old_position = buffer.position();
data = decoder.decode(buffer).toString();
// reset buffer's position to its original so it is not altered:
buffer.position(old_position);
}catch (Exception e){
e.printStackTrace();
return "";
}
return data;
}
Bu çoğu zaman çalışır, ama eğer bu dönüşüm her yöne (veya basit) tercih edilen yolu ise, ya da denemek için başka bir yol varsa ben bir soru. Bazen, görünüşte rastgele, encode()
decode()
çağrıları bir durum oluşturur
java.lang.IllegalStateException: Current state = FLUSHED, new state = CODING_END
istisna veya benzer, eğer yeni ByteBuffer nesnesi her zaman kullanıyorum, hatta bir dönüşüm yapılır. Bu yöntemler senkronize gerek var mı? Dizeleri ve ByteBuffers arasında dönüştürmek için daha iyi bir yolu? Teşekkürler!
CEVAP
CharsetEncoder
CharsetDecoder
API açıklamaları kontrol - takip etmelisinizyöntem çağrıları belirli bir sırabu sorunu önlemek için. CharsetEncoder
örneğin:
- Daha önce kullanılmamış sürece
reset
yöntemi ile kodlayıcının sıfırlama; - Çağırmak
encode
yöntem sıfır veya daha fazla kez, sürece ek giriş olabilir mevcut, geçenfalse
endOfİnput tartışma ve dolum giriş arabelleği ve kızarma çıkış arabelleği arasındaki çağırmaları; encode
yöntemi son kez, endOfİnput bağımsız değişkeni içintrue
geçen çağırmak; ve sonra- Kodlayıcı çıkış arabelleği için herhangi bir iç devlet floş böylece
flush
yöntemini çağırır.
Bu arada, bu aynı yaklaşımı ben kullanarak NİO karşın, bazı iş arkadaşlarım dönüştürme her char doğrudan bir bayt bilgi sadece kullanarak ASCII, tahmin edebiliyorum. muhtemelen daha hızlı.
Java tarih için dize dönüştürme...
Neden char[] şifreler için Dize Java t...
Bir kodlama kullanmadan bayt dizisi iç...
Java ile bir numaralama için bir Dize ...
Nasıl bir dosyanın içeriğini bir Java ...