Java 如果输出大小较大,则JSch终端输出读取失败

Java 如果输出大小较大,则JSch终端输出读取失败,java,jsch,Java,Jsch,我试图使用JSch在远程机器上执行cat命令并读取输出。如果文件很小,我会得到输出。但若文件大小很大,我就不会得到输出,命令的执行也会被挂起 请建议我如何克服这个问题 守则的一部分: JSch jSch = new JSch(); Properties config = new Properties(); config.put("StrictHostKeyChecking", "no"); command = "cat test1.properties" Session jsession = j

我试图使用JSch在远程机器上执行cat命令并读取输出。如果文件很小,我会得到输出。但若文件大小很大,我就不会得到输出,命令的执行也会被挂起

请建议我如何克服这个问题

守则的一部分:

JSch jSch = new JSch();
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
command = "cat test1.properties"
Session jsession = jSch.getSession(this.username, this.host, 22);
jsession.setPassword(this.password);
jsession.setConfig("StrictHostKeyChecking", "no");
jsession.connect();
Channel channel = jsession.openChannel("shell");
OutputStream ops = channel.getOutputStream();
PrintStream ps = new PrintStream(ops, true);
channel.connect();
boolean isPasswordEntered=false;
boolean isYesOrNoEntered=false;
StringBuilder sb = new StringBuilder();
byte[] tmp = new byte[1024];

int timeout = 60*1000;
long end = System.currentTimeMillis() + timeout; // 60 seconds * 1000 ms/sec , max 5 minutes 
InputStream in = channel.getInputStream();

while (true){
    if (System.currentTimeMillis()>end){
        break;
    }
    while (in.available() > 0) {
        end = System.currentTimeMillis()+timeout;
        int i = in.read(tmp, 0, 1024);
        if (i < 0) {
            break;
        }
        sb.append(new String(tmp, 0, i));
        if (!isYesOrNoEntered && sb.indexOf("yes")!=-1){ 
            isYesOrNoEntered = true;
            print.println("yes");
            Thread.sleep(500);
        }
        if (!isPasswordEntered && sb.toString().toLowerCase().indexOf("password")!=-1){     
            isPasswordEntered = true;
            print.println(nsmailPassword);
            LOG.debug("entering the nsmail password");
            Thread.sleep(500);
        }
    }
    if (channel.isClosed()) {
        if (in.available() > 0) {
            continue;
        }
        break;
    }           
}
JSch-JSch=new-JSch();
属性配置=新属性();
配置放置(“检查”、“否”);
command=“cat test1.properties”
Session jsession=jSch.getSession(this.username,this.host,22);
jsession.setPassword(this.password);
setConfig(“StrictHostKeyChecking”、“no”);
connect();
Channel=jsession.openChannel(“shell”);
OutputStream ops=channel.getOutputStream();
PrintStream ps=新的PrintStream(ops,true);
channel.connect();
布尔值isPasswordEntered=false;
布尔值isYesOrNoEntered=false;
StringBuilder sb=新的StringBuilder();
字节[]tmp=新字节[1024];
int超时=60*1000;
long end=System.currentTimeMillis()+超时;//60秒*1000毫秒/秒,最长5分钟
InputStream in=channel.getInputStream();
while(true){
if(System.currentTimeMillis()>结束){
打破
}
while(in.available()>0){
end=系统.currentTimeMillis()+超时;
inti=in.read(tmp,0,1024);
if(i<0){
打破
}
sb.append(新字符串(tmp,0,i));
如果(!isYesOrNoEntered&&sb.indexOf(“yes”)!=-1{
isYesOrNoEntered=true;
print.println(“是”);
睡眠(500);
}
如果(!isPasswordEntered&&sb.toString().toLowerCase().indexOf(“密码”)!=-1{
isPasswordEntered=true;
print.println(nsmailPassword);
LOG.debug(“输入nsmail密码”);
睡眠(500);
}
}
if(channel.isClosed()){
如果(in.available()>0){
继续;
}
打破
}           
}

要通过ssh读取远程文件,最好使用sftp而不是纯ssh。Jsch内置了对sftp的支持。打开会话后,执行以下操作以打开sftp频道:

ChannelSftp sftp = (ChannelSftp) session.openChannel("sftp");
打开sftp通道后,要读取远程文件,以便以InputStream的形式访问文件内容,请执行以下操作:

InputStream stream = sftp.get("/some/file");
如果需要逐行阅读,可以将其转换为读卡器:

InputStream stream = sftp.get("/some/file");
try {
    BufferedReader br = new BufferedReader(new InputStreamReader(stream));
    // read from br
} finally {
    stream.close();
}

你在这里更大的目标是什么?只是为了读取文件的内容吗?有更简单的方法可以做到这一点。是的,我的目标是读取远程文件的内容。这种方法是可行的,但需要很多时间。请告诉我是否有任何有效的方法可以做到这一点。或多或少的副本