[解決済み] Javaです。文字列のByteBufferへの変換とそれに伴う問題
2023-05-24 14:49:08
質問
私はソケット接続にJava NIOを使用しており、私のプロトコルはテキストベースなので、SocketChannelに書き込む前にStringをByteBufferに変換し、受信したByteBufferをStringに変換できるようにする必要があります。 現在、私はこのコードを使用しています。
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;
}
これはほとんどの場合うまくいきますが、この変換の各方向を行うのにこれが望ましい(あるいは最も単純な)方法なのか、あるいは他に試すべき方法があるのか、疑問に思っています。 時々、そして一見ランダムに
encode()
と
decode()
は
java.lang.IllegalStateException: Current state = FLUSHED, new state = CODING_END
例外、または同様のものを投げます。 これらのメソッドを同期させる必要があるのでしょうか? StringsとByteBufferの間の変換に何か良い方法があれば教えてください。 ありがとうございます。
どのように解決するのですか?
をチェックしてください。
CharsetEncoder
と
CharsetDecoder
API の説明 - API の説明には
メソッド呼び出しの特定のシーケンスに従うべきです。
に従ってください。 例えば
CharsetEncoder
:
-
エンコーダをリセットするには
reset
メソッドでリセットします。 -
を呼び出す。
encode
メソッドをゼロ回以上呼び出すことができます。false
を渡し、入力バッファを満たし、出力バッファをフラッシュします。 -
を呼び出す。
encode
メソッドを最後にもう一度呼び出します。true
を渡し、次に -
を呼び出す。
flush
メソッドを呼び出して、エンコーダが内部状態を出力バッファにフラッシュできるようにします。
ところで、これは私が NIO で使用しているのと同じアプローチですが、私の同僚の中には、ASCII しか使用していないことを承知で、各文字を直接バイトに変換している人もいます。
関連
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み] Javaで文字列値からenum値を取得する方法
-
[解決済み] Javaで文字列を分割する方法
-
[解決済み] ファイルの内容からJavaの文字列を作成するにはどうすればよいですか?
-
[解決済み] Pythonで整数から文字列に変換する
-
[解決済み] Javaで「ArrayList<String>」を「String[]」に変換する。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Eclipse の問題 アクセス制限。タイプ 'jfxrt' はAPI解決されていません。
-
java.sql.SQLException: executeQuery()でデータ操作文を発行できません。
-
ApplicationContextの起動エラーです。条件レポートを表示するには、アプリケーションを'de'で再実行します。
-
StringBuilderが投げるArrayIndexOutOfBoundsExceptionの探索
-
ajax コミット リソースの読み込みに失敗しました: サーバーはステータス 400 で応答しました ()
-
Java appears タイプEを囲むインスタンスがアクセスできない。
-
Java Runtime Environmentを継続するためのメモリが不足しています。
-
春ブート複数のデータソースの管理(atomikos)同じサーバーホスト上の複数のプロジェクトを開始する複数のJava - jarのエラーソリューション
-
ApiModel と @ApiModelProperty の使用法
-
[解決済み] Java バイトバッファから文字列