在Java中通过管道多次(基本上2次)从stdin读取相同的数据

时间:2015-09-04 22:27:32

标签: java pipe

我试图多次读取来自另一个命令输出的数据。

我的命令是这样的: -

cat input.txt | java -Xmx128m abcJavaFile | sort -k1,1 | java -Xmx128m xyzJavaFile inputTextFile > output.txt

现在在xyzJavaFile中我想在一些变量中存储来自sort commmand的一些数据,然后再次访问管道输出以使用相同的数据执行某些操作。

像这样: -

BufferedReader consoleInput1 = new BufferedReader(new InputStreamReader(System.in));
String curDoc1 = null;
while((curDoc1 = consoleInput1.readLine()) != null) {
    //do something here
}

BufferedReader consoleInput2 = new BufferedReader(new InputStreamReader(System.in));
String curDoc2 = null;
while((curDoc2 = consoleInput2.readLine()) != null) {
    //again do something here
}

2 个答案:

答案 0 :(得分:1)

不可能,管道传输数据。如果数据不是太大,您可以存储数据,或者在第一次读取时将其写入临时文件,并使用该文件再次读取数据以进行第二个处理步骤。

BufferedReader consoleInput1 = new BufferedReader(new InputStreamReader(System.in));

String curDoc1 = null;
File temp = File.createTempFile("data", null);
try (BufferedWriter bw = Files.newBufferedWriter(temp.toPath())) {
    while((curDoc1 = consoleInput1.readLine()) != null) {
        doSomething(curDoc1);
        bw.write(curDoc1 + "\n");
    }
}

BufferedReader br = Files.newBufferedReader(temp.toPath());
String curDoc2 = null;
while((curDoc2 = br.readLine()) != null) {
    //again do something here
}

根据计算的性质,也可以将两个循环合并为一个。

答案 1 :(得分:1)

如果您的输入不是超大(非常小于128米),您可以将数据读入内存缓冲区,然后根据需要随时从该缓冲区构建读取器。

File tempFile = File.createTempFile("data", ".tmp");
tempFile.deleteOnExit();

// copy input into buffer
Reader reader = new InputStreamReader(System.in);
try (Writer writer = new FileWriter(tempFile)) {
    char[] transfer = new char[4096];
    int count;
    while ((count = reader.read(transfer)) != -1) {
        writer.write(transfer, 0, count);
    }
}
// use stream from buffer as often as you want
BufferedReader consoleInput1 = new BufferedReader(new FileReader(tempFile));
BufferedReader consoleInput2 = new BufferedReader(new FileReader(tempFile));

如果它太大,您可以将数据存储在磁盘上:

console.log(json);