在我的java代码中,我创建了执行某些shell命令的场景,特别是执行了-scp-
和-mv-
命令。
是否可以记录执行结果?例如,如果找不到要复制的文件,或者-scp-
或-mv-
未正确发生,则会记录到我准备好的日志文件中。目前我的命令执行代码如下:
if ("command") {
String command = "mv " + source_file_path + "/"
+ " " + dest_file_path;
Process child = Runtime.getRuntime().exec(command);
exitVal = child.waitFor();
// Get the input stream and read from it
InputStream in = child.getInputStream();
BufferedInputStream bis = new BufferedInputStream(in);
ByteArrayOutputStream buf = new ByteArrayOutputStream();
int c = bis.read();
while (c != -1) {
byte b = (byte) c;
buf.write(b);
c = bis.read();
}
in.close();
System.out.println("Input Stream: " + buf.toString());
buf.close();
bis.close();
InputStream ein = child.getErrorStream();
BufferedInputStream ebis = new BufferedInputStream(ein);
ByteArrayOutputStream ebuf = new ByteArrayOutputStream();
int ce = ebis.read();
while (ce != -1) {
// process((char)c);
byte be = (byte) ce;
ebuf.write(be);
ce = ebis.read();
}
ein.close();
System.out.println("Error Stream: " + ebuf.toString());
ebuf.close();
ebis.close();
}
System.exit(0);
无论如何我可以在其上添加日志记录组件吗?要记录未找到文件的时间,当文件传输不正确时,文件传输出现问题时..等等
答案 0 :(得分:1)
解析您在名为buf
的ByteArrayOutputStream中捕获的命令的输出以确定结果并记录它。您还可以从exitVal
中获得一条线索,该线索存储在{{1}}。
请注意,通过在读取stdout和stderr流之前调用child.waitFor(),您可以保证如果进程的输出太大,这将不起作用。根据{{3}}:“因为某些本机平台仅为标准输入和输出流提供有限的缓冲区大小,无法及时写入输入流或读取子进程的输出流可能导致子进程阻塞,甚至死锁。“