SORU
9 AĞUSTOS 2009, Pazar


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
9 AĞUSTOS 2009, Pazar


CharsetEncoder CharsetDecoder API açıklamaları kontrol - takip etmelisinizyöntem çağrıları belirli bir sırabu sorunu önlemek için. CharsetEncoder örneğin:

  1. Daha önce kullanılmamış sürece reset yöntemi ile kodlayıcının sıfırlama;
  2. Çağırmak encode yöntem sıfır veya daha fazla kez, sürece ek giriş olabilir mevcut, geçen false endOfİnput tartışma ve dolum giriş arabelleği ve kızarma çıkış arabelleği arasındaki çağırmaları;
  3. encode yöntemi son kez, endOfİnput bağımsız değişkeni için true geçen çağırmak; ve sonra
  4. 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ı.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • iZAPPA

    iZAPPA

    16 Temmuz 2010
  • Michael Zhang

    Michael Zhan

    8 EYLÜL 2012
  • Viktorija A.

    Viktorija A.

    28 Mart 2009