您的位置:首页 > 其它

Filter (seach and replace) array of bytes in an InputStream

2013-05-08 19:23 736 查看
import java.io.*;
import java.util.*;

class ReplacingInputStream extends FilterInputStream {

LinkedList<Integer> inQueue = new LinkedList<Integer>();
LinkedList<Integer> outQueue = new LinkedList<Integer>();
final byte[] search, replacement;

protected ReplacingInputStream(InputStream in, byte[] search,
byte[] replacement) {
super(in);
this.search = search;
this.replacement = replacement;
}

private boolean isMatchFound() {
Iterator<Integer> inIter = inQueue.iterator();
for (int i = 0; i < search.length; i++)
if (!inIter.hasNext() || search[i] != inIter.next())
return false;
return true;
}

private void readAhead() throws IOException {
// Work up some look-ahead.
while (inQueue.size() < search.length) {
int next = super.read();
inQueue.offer(next);
if (next == -1)
break;
}
}

@Override
public int read() throws IOException {

// Next byte already determined.
if (outQueue.isEmpty()) {

readAhead();

if (isMatchFound()) {
for (int i = 0; i < search.length; i++)
inQueue.remove();

for (byte b : replacement)
outQueue.offer((int) b);
} else
outQueue.add(inQueue.remove());
}

return outQueue.remove();
}

// TODO: Override the other read methods.
}

class Test {
public static void main(String[] args) throws Exception {

byte[] bytes = "hello xyz world.".getBytes("UTF-8");

ByteArrayInputStream bis = new ByteArrayInputStream(bytes);

byte[] search = "xyz".getBytes("UTF-8");
byte[] replacement = "abc".getBytes("UTF-8");

InputStream ris = new ReplacingInputStream(bis, search, replacement);

ByteArrayOutputStream bos = new ByteArrayOutputStream();

int b;
while (-1 != (b = ris.read()))
bos.write(b);

System.out.println(new String(bos.toByteArray()));

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐