Java 在大于最大字符串限制的OutputStream上匹配正则表达式模式的有效方法
我正在试图找到一种有效的方法来对大小超过的ByteArrayOutputStream进行模式匹配 在适合单个字符串的ByteArrayOutputStream上进行模式匹配非常简单:Java 在大于最大字符串限制的OutputStream上匹配正则表达式模式的有效方法,java,string,outputstream,Java,String,Outputstream,我正在试图找到一种有效的方法来对大小超过的ByteArrayOutputStream进行模式匹配 在适合单个字符串的ByteArrayOutputStream上进行模式匹配非常简单: private boolean doesStreamContainPattern(Pattern pattern, ByteArrayOutputStream baos) throws IOException { /* * Append external source String to ou
private boolean doesStreamContainPattern(Pattern pattern, ByteArrayOutputStream baos) throws IOException {
/*
* Append external source String to output stream...
*/
if (pattern != null) {
String out = new String(baos.toByteArray(), "UTF-8");
if (pattern.matcher(out).matches()) {
return true;
}
}
/*
* Some other processing if no pattern match
*/
return false;
}
但是如果bas
的大小超过了字符串的最大大小,则问题会变成:
baos
送入多个字符串bas
content)的串联上进行模式匹配实现这一点的正确方法是什么?您可以编写一个简单的包装器类,从流中实现
CharSequence
:
class ByteArrayCharSequence implement CharSequence {
private byte[] array;
public StreamCharSequence(byte[] input) {
array = input;
}
public char charAt(int index) {
return (char) array[index];
}
public int length() {
return array.length;
}
public CharSequence subSequence(int start, int end) {
return new ByteArrayCharSequence(Arrays.copyOfRange(array, start, end));
}
public String toString() {
// maybe test whether we exceeded max String length
}
}
然后再配上
private boolean doesStreamContainPattern(Pattern pattern, ByteArrayOutputStream baos) throws IOException {
if (pattern != null) {
CharSequence seq = new ByteArrayCharSequence(baos.toByteArray());
if (pattern.matcher(seq).matches()) {
return true;
}
}
/*
* Some other processing if no pattern match
*/
return false;
}
使用
char
,并使用copyOfRange
,显然边缘粗糙,但它应该适用于大多数情况,并且您可以针对不适用的情况进行调整。我认为与输出流匹配没有多大意义,不是吗?您不是在向流中写入,而是在读取它-因此它应该是一个InputStream
。感谢您和+1的帮助。请注意,您的解决方案还受到CharSequence的固有大小/长度限制(Integer.MAX_值)的限制。我现在认为解决方案应该更倾向于使用Integer,MAX\u VALUE
可以处理多达2GB的数据,但我想无论哪种方式,Scanner
都是一个好主意。您会发现它接受的是InputStream
而不是OutputStream
,正如我在前面对这个问题的评论中指出的那样。