Filter (seach and replace) array of bytes in an InputStream
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())); } }