タイトルがすべてを物語っています。途中で文字列を使用せずに StringBuilder から byte[] に変換する方法はありますか?
問題は、私が非常に大きな文字列 (数百万文字) を管理していて、最後に文字を追加して byte[] を取得するサイクルがあることです。StringBuffer を String に変換するプロセスにより、このサイクルが非常に遅くなります。
これを達成する方法はありますか?前もって感謝します!
タイトルがすべてを物語っています。途中で文字列を使用せずに StringBuilder から byte[] に変換する方法はありますか?
問題は、私が非常に大きな文字列 (数百万文字) を管理していて、最後に文字を追加して byte[] を取得するサイクルがあることです。StringBuffer を String に変換するプロセスにより、このサイクルが非常に遅くなります。
これを達成する方法はありますか?前もって感謝します!
StringBuilder
を別のものに置き換えても構わないと思っている場合、さらに別の可能性は、 にWriter
裏打ちされたByteArrayOutputStream
:
ByteArrayOutputStream bout = new ByteArrayOutputStream();
Writer writer = new OutputStreamWriter(bout);
try {
writer.write("String A");
writer.write("String B");
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(bout.toByteArray());
try {
writer.write("String C");
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(bout.toByteArray());
いつものように、走行距離は異なる場合があります。
残念ながら、ByteBuffer の array() メソッドを扱う上記の回答には少しバグがあります...問題は、割り当てられた byte[] が予想よりも大きくなる可能性があることです。したがって、Java では配列を「サイズ変更」できないため、取り除くのが難しい末尾の NULL バイトが存在します。
これについて詳しく説明している記事は次のとおりです 。
通常は不要な同期オーバーヘッドがあるStringBuilder
ため、まず、おそらく を使用する必要があります。StringBuffer
残念ながら、s に直接アクセスする方法はありませbyte
んが、s を配列にコピーするか、 tochar
から反復して各 を読み取ることができます。0
length()
charAt()
「百万文字」で何を達成しようとしていますか? これらのログは解析する必要がありますか? 単なるバイトとして読み取り、 ByteBufferに固執できますか? 次に、次のことができます。
buffer.array()
を得るためにbyte[]
何をしているかによって異なりますが、単に achar[]
またはCharBufferを使用することもできます:
CharBuffer cb = CharBuffer.allocate(4242);
cb.put("Depends on what it is you need to do");
...
次に、次のように取得できますchar[]
。
cp.array()
REPL を実行するのは常に良いことです。楽しく、要点を証明します。Java REPL は私たちが慣れ親しんだものではありませんが、Clojure が Java を流暢に話すことを可能にしてくれます。
user=> (import java.nio.CharBuffer)
java.nio.CharBuffer
user=> (def cb (CharBuffer/allocate 4242))
#'user/cb
user=> (-> (.put cb "There Be") (.array))
#<char[] [C@206564e9>
user=> (-> (.put cb " Dragons") (.array) (String.))
"There Be Dragons"