2012-02-08 11 views
2

以下のようにバイト[]を処理しています(このファイルはGlassfishで実行されています。このコードはGlassfishで実行されています)、バイトオーダーのマーク(BOM、3バイトのシーケンス0xEF、0xBB、0xBF、http://en.wikipedia.org/wiki/Byte_order_markを参照してください)、このBOMを削除します。このコードでBOMを検出して削除するにはどうすればよいですか?ありがとう。Javaバイト配列とDataOutputStream処理

private final void serializePayloadToFile(File file, byte[] payload) throws IOException { 

    FileOutputStream fos; 
    DataOutputStream dos; 

    fos = new FileOutputStream(file, true); // true for append 
    dos = new DataOutputStream(fos); 

    dos.write(payload); 
    dos.flush(); 
    dos.close(); 
    fos.close(); 

    return; 
    } 

答えて

2

どのように我々は[...]を検出するであろう

3つのバイトが3ランダムバイトまたはBOMを表す3つのバイトであれば確実に伝えるための方法は明らかにありません。

配列が0xEF、0xBB、0xBFで始まり、その場合はスキップするかどうかを確認できます。

[...] このコードでBOMを削除しますか?このような

何かが行う必要があります。

int off = payload.length >= 3 
     && payload[0] == 0xEF 
     && payload[1] == 0xBB 
     && payload[2] == 0xBF ? 3 : 0 

dos.write(payload, off, payload.length - off); 
+1

'payload.length> 2'をテストすることを忘れないでください。 – user949300

+0

バイトがBOMであることを確認する方法があります。ファイルがUTF-8を使用してエンコードされ、0xEF 0xBB 0xBFで始まる場合、これらの3バイトはBOMです。 – DwB

+0

恐ろしい、ありがとう! – bethesdaboys

0

最も簡単な解決策は、実際にfosにコミットする前に、dosfosの間に別のOutputStreamの実装を追加し、そこに最初の数バイトをバッファリングしているようです。彼らの価値に応じて、あなたはそれらを放棄したいかもしれません。

+0

ありがとうございますが、おそらく少し複雑すぎるかもしれません...? – bethesdaboys

+0

しかし、バイト配列(ストリームのリダイレクトなど)を扱うより複雑なケースではうまくいきます:) –

1

DataOutputStream適切だからバイト順マークをテストおよびオフに設定(およびLEN)オフセットおよび長さ

public void write(byte[] b, int off, int len); 

とwrite()メソッドを有します。

関連する問題