我应该如何实施以下内容?我将不得不处理一个包含多行文本的字节数组。数据的平均大小可能约为10千字节的数据。
在未指定数量的行之后会有一行以特殊标记(“FIRSTSTRING”)开头。稍后在同一个文件的某个地方会有另一行也以特殊标记(“SECONDSTRING”)开头。如果第一行和第二行都在字节数组中定义,则应复制第二行代替第一行。之后,应返回结果字节数组。
以下是我的第一次尝试。我没有重构它以降低复杂性。我担心可靠性,也非常关注性能。似乎有太多方法绕过这个,我缺乏判断所需的经验。我真的很感激这方面的一些好的建议。
private byte[] handleHeader(final byte[] input) throws IOException {
// input
ByteArrayInputStream bais = new ByteArrayInputStream(input);
InputStreamReader isr = new InputStreamReader(bais);
BufferedReader brs = new BufferedReader (isr);
// output
ByteArrayOutputStream data = new ByteArrayOutputStream();
ByteArrayOutputStream after = new ByteArrayOutputStream();
String line=null;
String original=null;
String changeWith=null;
while ((line = brs.readLine())!=null) {
line+="\n";
if (line.startsWith("FIRSTSTRING")) {
original = line;
continue;
}
if (line.startsWith("SECONDSTRING")) {
changeWith = line;
continue;
}
if ("".equals(original)) {
data.write(line.getBytes());
} else {
after.write(line.getBytes());
}
}
if (changeWith!=null && original != null) {
changeWith+="\n";
data.write(changeWith.getBytes());
} else if (original != null){
data.write(original.getBytes());
}
after.writeTo(data);
return data.toByteArray();
}
答案 0 :(得分:0)
我觉得你可以使用guava io库@ http://code.google.com/p/guava-libraries/或commons-io library @ http://commons.apache.org/io/来简化代码
答案 1 :(得分:0)
对于初学者而言,听起来并不是说你已经准确地定义了你的问题 - 你说将成为“FIRSTSTRING”行,并且将成为一个“SECONDSTRING”行,但接着你继续说“如果两条线都存在”......如果你知道总会有第二行事情变得更简单
在任何情况下,以下算法应该相当容易实现和理解,并且不应该太低效:
哦,你在没有指定明确的字符编码的情况下将字节转换为字符串。永远不要那样做。如果您知道字符编码是什么,请明确指定它(在InputStreamReader
的构造函数中)。如果不知道字节流的字符编码是什么,那么你就无法可靠地读取它。