0

我在 unix 目录中有一个文件,我需要读取它并将其内容显示到页面上。我在我的 java 代码中使用 jcraft 库。我能够连接到 Unix 服务器并找到该文件但无法读取它。我找到了读取文件的示例代码,但它不起作用,它死在 int c = in.read() 行,可能卡在循环中......我发布我的代码可能是你可以发现一个问题。如果有其他(更好的)方法可以做到这一点,我会很感激一个例子。希望我的问题和示例代码足够清楚。谢谢大家。

public String readFile(String path) throws Exception {

    ChannelExec c = (ChannelExec)session.openChannel("exec");
    OutputStream os = c.getOutputStream();
    InputStream is = c.getInputStream();
    c.setCommand("scp -f " + path); //path is something like /home/username/sample.txt
    c.connect();
    String header = readLine(is);

    int length = Integer.parseInt(header.substring(6, header.indexOf(' ', 6)));
    os.write(0);
    os.flush();

    byte[] buffer = new byte[length];
    length = is.read(buffer, 0, buffer.length);
    os.write(0);
    os.flush();

    c.disconnect();

    return new String(buffer);  
}

private String readLine(InputStream in) throws IOException {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    for (;;) {
        int c = in.read(); // code stops working here
        if (c == '\n') {
            return baos.toString();
        } else if (c == -1) {
            throw new IOException("End of stream");
        } else {
            baos.write(c);
        }
    }
}
4

2 回答 2

1

您想研究使用ChannelSftp而不是ChannelExec

ChannelSftp channelSftp = null;
try {
    channelSftp = (ChannelSftp) session.openChannel("sftp");
    channelSftp.connect();
    is = channelSftp.get(path);
    // read the contents, etc...
} finally {
    if (channelSftp != null) {
        channelSftp.exit();
    }
}
于 2013-05-28T17:47:22.220 回答
0

这看起来没问题。我假设它只是在阅读时挂起(如你所说)。

[...] 这种方法会阻塞,直到输入数据可用 [...]

我认为您在建立频道时遇到了麻烦。是scp可能在等待您的密码或什么?


再三考虑你的线路检测可能不起作用。这将导致 for 超出您希望它退出的位置。也许你也应该检查一下'\r'


也有人在这里做了类似的事情: How to read JSch command output?

于 2013-05-28T17:39:43.590 回答