Java 在大于最大字符串限制的OutputStream上匹配正则表达式模式的有效方法

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

我正在试图找到一种有效的方法来对大小超过的ByteArrayOutputStream进行模式匹配

在适合单个字符串的ByteArrayOutputStream上进行模式匹配非常简单:

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)的串联上进行模式匹配
  • 第2步看起来比第1步更具挑战性,但我知道像Unix这样的实用程序只是在文件上这样做的


    实现这一点的正确方法是什么?

    您可以编写一个简单的包装器类,从流中实现
    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
    ,正如我在前面对这个问题的评论中指出的那样。