我试图多次读取来自另一个命令输出的数据。
我的命令是这样的: -
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
}
答案 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);