2

したがって、ByteArrayOutputStream の最初の 4 バイトには、ストリームのヘッダーの長さが含まれます。ストリームからそのヘッダーを削除して、ビジネスを続行する必要があります。

ByteArrayOutputStream oStream = new ByteArrayOutputStream();
/* populate ByteArrayOutputStream */

//grab first int
int headerLength = oStream.toByteArray()[4];

//remove headerLength
String newString = oStream.toString().substring(jsonLength, oStream.size());
oStream.write(newString.getBytes());

これが適切な方法だとは思いませんが、誰か提案はありますか?

4

2 に答える 2

4

簡単な答えは、最初に4バイトを書き込むことです...それが達成できれば。

別の答えは、書き込まれた最初の 4 バイトを無視するカスタム FilterOutputStream サブクラスを作成することです。

さらに別の方法として、バイトを抽出し、Arrays.copy メソッドの 1 つを使用して、必要なオリジナルの「スライス」を含む新しいバイト配列を作成します。例えば

byte[] subarray = Arrays.copyOfRange(original, 4, original.length - 4);

または、アプリケーションがバイト配列の末尾の「未定義」領域に対処できる場合は、次のようにすることができます。

System.arraycopy(array, 4, array.length - 4, array, 0);  // YMMV - check javadoc

最後に、バイト配列の使用目的によっては、最初の 4 バイトを削除せずに無視できる可能性が高くなります。たとえば、バイトをストリームに書き込むとき、バイトから文字列を作成するとき、バイトを ByteBuffer にコピーするときなどにこれを行うことができます。

于 2012-06-27T13:26:09.017 に答える
1

あなたが求めていることを実行する方法はありません。
remove メソッドを使用して、独自の OutputStream を作成する必要があります。
この OutputStream がパラメーターとして別の OutputStream を受け入れることをお勧めします。書き込みを実行すると、バイトが蓄積されます (ByteArrayOutputStream と同様の手法を使用)
。削除すると、内部データ構造 (配列としましょう) にアクセスできるようになります。削除アルゴリズムをコーディングします(たとえば、位置 N から始まる配列からの M エントリの削除)。
もう1つのオプションは、ByteArrayOutputStreamを拡張することです-コードをチェックしたところ、内部バッファーが保護されていることがわかりました(フィールドの名前は「buf」です)-これで上記の提案を実装します。コードは次のようになります (完全なコードは示しません)。

public class MyByteArrayOutputStream extends ByteArrayOutputStream {
   //Implement all the CTORs

   public int remove (int startFrom, int length)  {
       //Implement removal algorithm on array on the field "buf" 
       //return the number of removed elements
   }
}
于 2012-06-27T13:25:32.200 に答える