2012-02-08 56 views
2

我們正在處理一個byte [],如下所示(該文件被POST到一個web服務器,這段代碼在Glassfish中運行),並且發現一些文件有一個字節順序標記(BOM,三字節序列0xEF,0xBB,0xBF,請參閱:http://en.wikipedia.org/wiki/Byte_order_mark),我們希望刪除此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

我們如何檢測 [...]

有明顯沒有辦法肯定告訴如果三個字節是三個隨機字節或代表BOM三個字節。

您可以檢查數組是否以0xEF,0xBB,0xBF開頭,並在這種情況下跳過它們。

[...] 並刪除此代碼中的物料清單?

像這樣的東西應該做的:

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 2012-02-08 16:32:53

+0

有一種方法可以確保字節是BOM;如果文件使用UTF-8編碼,並且以0xEF 0xBB 0xBF開頭,那麼這三個字節就是BOM。 – DwB 2012-02-08 16:36:45

+0

太棒了,謝謝! – bethesdaboys 2012-02-08 16:40:50

0

最簡單的辦法似乎是增加dosfos之間的另一個OutputStream實施和緩衝的前幾個字節有,其實他們承諾fos之前。取決於他們的價值觀,你可能會也可能不想扔掉它們。

+0

謝謝,但聽起來可能有些複雜......? – bethesdaboys 2012-02-08 16:41:58

+0

然而,它將工作在比處理字節數組更復雜的情況下(如重定向流等):) – 2012-02-08 16:47:06

1

DataOutputStream具有偏移量的write()方法和長度

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

因此,測試了在字節次序標誌和設置爲OFF(和len)適當。