即时过滤InputStream

时间:2014-11-11 18:47:46

标签: java

来自输入流的数据由每行上的多个JSON对象组成。我只对从流中传入的一小部分(5-8%)对象感兴趣,这些对象包含特定的JSON键值组合。

我正在从InputStream中读取数据并将其写入文件。是否可以仅写入与特定简单正则表达式匹配的对象(即行)? (由于对象很大,将其解析为json并查找密钥将浪费时间,正则表达式匹配会更快。)

这只是一个疯狂的想法,我不确定这是否可行。如果是,任何提示,链接,指针?

来自EMR中40个独立主机上的各种不同InputStream的总数据约为3TB。由于各种原因(主要是那些here),我想避免对此进行后处理。

2 个答案:

答案 0 :(得分:0)

您可以在BufferedReader上使用InputStreamReader。然后你会readLine()并将该特定线与模式匹配。如果匹配,则将其写入文件。确保您的阅读器具有正确的字符编码。

BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
PrintWriter writer = new PrintWriter(new BufferedWriter(new File(...)))

String line;
while ((line=reader.readLine())!=null) {
    if (line.matches(patternString)) {
        writer.println(line);
    }
}

使用BufferedReader明显快于Scanner

答案 1 :(得分:0)

您可以使用可以扫描InputStream的java.util.Scanner

Scanner scanner = new Scanner(yourInputStream);

scanner.findWithinHorizon("your_pattern", 0);

请注意:

    如果匹配稀疏,
  • findWithinHorizon可能会导致大量数据被缓冲。所以你可能想先用较小的匹配进行过滤,比如最大长度。
  • 正则表达式在分析像{{}}这样的嵌套模式时并不优雅,例如Json允许的。因此,相应地设计你的模式。