12

タイトルがすべてを物語っています。途中で文字列を使用せずに StringBuilder から byte[] に変換する方法はありますか?

問題は、私が非常に大きな文字列 (数百万文字) を管理していて、最後に文字を追加して byte[] を取得するサイクルがあることです。StringBuffer を String に変換するプロセスにより、このサイクルが非常に遅くなります。

これを達成する方法はありますか?前もって感謝します!

4

6 に答える 6

2

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());

いつものように、走行距離は異なる場合があります。

于 2016-09-22T18:06:46.020 に答える
1

残念ながら、ByteBuffer の array() メソッドを扱う上記の回答には少しバグがあります...問題は、割り当てられた byte[] が予想よりも大きくなる可能性があることです。したがって、Java では配列を「サイズ変更」できないため、取り除くのが難しい末尾の NULL バイトが存在します。

これについて詳しく説明している記事は次のとおりです

于 2014-03-02T00:41:44.443 に答える
1

通常は不要な同期オーバーヘッドがあるStringBuilderため、まず、おそらく を使用する必要があります。StringBuffer

残念ながら、s に直接アクセスする方法はありませbyteんが、s を配列にコピーするか、 tocharから反復して各 を読み取ることができます。0length()charAt()

于 2013-10-19T22:57:45.777 に答える
0

「百万文字」で何を達成しようとしていますか? これらのログは解析する必要がありますか? 単なるバイトとして読み取り、 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"
于 2013-10-19T23:05:21.067 に答える