我有一个ModSecurity日志文件,其中包含包含文本或二进制数据的部分。我需要根据每个部分开头记下的标签拆分这个文件,这样我就可以过滤数据进行永久存储。
例如,我有:
--tag1--
<text>
--tag2--
<binary data>
--tag3--
<text>
起初我认为这是所有文本所以我做了一个解析器来解析所有不同的部分,通过读取该行并使用模式来检查它是否是一个新的部分。但现在我需要以二进制文件读取文件。那么实现这一目标的最佳方法是什么?
到目前为止,我已经通过将字符串缓冲区中的最后几个字符保留以检查字符串然后在缓冲区包含该字符串时开始打印来进行测试以获取特定部分。做同样的事情就是停下来。但是,由于缓冲区需要在检查结束标记之前填满,所以结束标记将被添加到字节数组中,因此一旦部分完成,我将从数组中删除最后的字节以获得所需的部分。
public byte[] binaryDataReader(String startTag, String endTag) throws IOException{
File file = new File("20160926-161148-V@ksog7ZjVRfyQUPtAdOmgAAAAM");
try (FileInputStream fis = new FileInputStream(file);ByteArrayOutputStream buffer = new ByteArrayOutputStream()) {
System.out.println("Total file size to read (in bytes) : "+ fis.available());
int content;
String lastChars = "";
String status = "nok";
while ((content = fis.read()) != -1) {
if (lastChars.length() > 14) {
lastChars = lastChars.substring(lastChars.length() - 14, lastChars.length()) + (char) content;
} else {
lastChars += (char) content;
}
if(status.equals("ok")){
buffer.write(content);
}
if (lastChars.equals(startTag)) {
status = "ok";
}else if(lastChars.equals(endTag)){
status = "nok";
}
}
buffer.flush();
byte[] data = buffer.toByteArray();
data = Arrays.copyOf(data, data.length-15);
return data;
} catch (IOException e) {
//log
throw e;
}
}
现在我需要通过包含模式使这成为更多标签的通用解决方案。但我想知道:这是分割二进制文件的一种不错的方式还是有更好/更简单的方法来实现这个目标?