我有一个 InputStream ,它将 html 文件作为输入参数。我必须从输入流中获取字节。
我有一个字符串:"XYZ"
。我想将此字符串转换为字节格式,并检查从 InputStream 获得的字节序列中是否存在与该字符串匹配的字符串。如果有的话,我必须将匹配替换为其他字符串的再见序列。
有谁可以帮助我解决这个问题吗?我使用正则表达式来查找和替换。但是查找和替换字节流,我不知道。
以前,我使用 jsoup 来解析 html 并替换字符串,但是由于一些 utf 编码问题,当我这样做时,文件似乎已损坏。
TL;DR:我的问题是:
有一种方法可以在Java中的原始InputStream中查找和替换字节格式的字符串吗?
不确定您是否选择了解决问题的最佳方法。
也就是说,我不喜欢(并且按照政策不)用“不”回答问题,所以这里......
看一下FilterInputStream http://download.oracle.com/javase/6/docs/api/java/io/FilterInputStream.html.
从文档中:
FilterInputStream 包含一些其他输入流,它用作基本数据源,可能会一路转换数据或提供附加功能。
写下来是一个有趣的练习。这是一个完整的示例:
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()));
}
}
给定字符串的字节数"Hello xyz world"
它打印:
Hello abc world
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)