2012-02-08 54 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)适当。