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

yzmm
680 阅读

byte[] byte替换,From:Filter (seach and replace) array of bytes in an InputStream

ReplacingInputStream.java

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;
			}
		}
	}
	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();
	}
}

Test.java

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
class Test {
	public static void main(String[] args) throws Exception {
		byte[] bytes = "hello xyz aa 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()));
	}
}

评论 (0)

发表评论