我遇到了一个问题,我不知道会发生什么。
我有一个类调用第二个类来通过ssh发送命令并返回结果。
结果是BufferedReader,然后在我的第一堂课中处理这个结果。
头等舱:
.
.
.
String command = "ping " + ip + " -c 1";
BufferedReader result = instance.sendCommand(command);
// close only after all commands are sent
System.out.println("out of sshManager result : "+result);
System.out.println("out of sshManager line : "+result.readLine());
String line = null;
while ((line = result.readLine()) != null) {
System.out.println("out of sshManager line: "+line);
}
第二课:
public BufferedReader sendCommand(String command) throws JSchException, IOException {
//StringBuilder outputBuffer = new StringBuilder();
Channel channel = sesConnection.openChannel("exec");
((ChannelExec) channel).setCommand(command);
channel.connect();
InputStream commandOutput = channel.getInputStream();
System.out.println("This is in sshmanager SSHManager: " + commandOutput);
result = new BufferedReader(new InputStreamReader(commandOutput));
String line = null;
System.out.println(" sshmanager result : " + result());
System.out.println(" sshmanager result line : " + result.readLine());
while ((line = result.readLine()) != null) {
System.out.println("in sshmanager: " + line);
}
System.out.println("in sshmanager result : " + result);
channel.disconnect();
return result;
}
结果:
This is in sshmanager SSHManager: com.jcraft.jsch.Channel$MyPipedInputStream@40d5bd18
sshmanager result : java.io.BufferedReader@10a5ae6e
sshmanager result line : PING 192.168.11.11 (192.168.11.11) 56(84) bytes of data.
in sshmanager: From 192.168.11.77 icmp_seq=1 Destination Host Unreachable
in sshmanager:
in sshmanager: --- 192.168.11.11 ping statistics ---
in sshmanager: 1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 3006ms
in sshmanager:
in sshmanager result: java.io.BufferedReader@10a5ae6e
out of sshManager result: java.io.BufferedReader@10a5ae6e
out of sshManager line: null
我的第二堂课很好地创造了对象,但我不知道为什么,当我尝试在第一堂课中管理对象时,内容为空。
你知道什么是狼人吗?
答案 0 :(得分:3)
BufferedReader
在返回第一个方法时已经读完了文件。您可能希望返回包含文件内容的List<String>
而不是BufferedReader
。
public List<String> sendCommand(String command) throws JSchException, IOException {
List<String> lines = new LinkedList<String>();
Channel channel = sesConnection.openChannel("exec");
((ChannelExec) channel).setCommand(command);
channel.connect();
InputStream commandOutput = channel.getInputStream();
result = new BufferedReader(new InputStreamReader(commandOutput));
String line = null;
while ((line = result.readLine()) != null) {
lines.add(line);
}
channel.disconnect();
return lines;
}
答案 1 :(得分:1)
这一切都来自流媒体的概念。
一旦你在“第二课”中推进了流,你实际上就消耗了这个流。因此,在您将其返回到“第一类”时,流将被完全消耗。因此,您不能再流式传输任何内容了。
请注意,即使您将流包装到阅读器中,读取操作(例如readLine
)也会转发到流中。
答案 2 :(得分:1)
缓冲读取器就像一串字节,您可以从一次中读取。
你的基本问题是在函数内部你已经从阅读器中提取了文本,所以当你再次尝试时你只是得到null(因为读者 NOW 为空)。