繁体   English   中英

使用Java读取文件时,SFTP:IOException

[英]SFTP: IOException while reading a file with java

我正在使用com.jcraft.jsch库从SFTP服务器读取.xls文件。 以下是连接到服务器的代码。

    session = jsch.getSession(username, host);
    session.setConfig("StrictHostKeyChecking", "no");
    session.setPassword(password);
    session.connect();
    sftpChannel = (ChannelSftp) session.openChannel("sftp");
    sftpChannel.connect();

我正在使用sftpChannel.get(file)检索inputStream到文件。 然后,此输入流用于实例化XSSFWorkbook ,如下所示:

XSSFWorkbook workbook = new XSSFWorkbook(in);

问题1

当我运行该应用程序时,它似乎在上面的行上停留了一段时间(例如5分钟),然后抛出java.io.IOException: Pipe closed错误。 我尝试读取的xls文件为800kb,从本地计算机运行时可以正常工作。

问题2

该应用程序旨在按顺序处理文件。 因此,如果第一个文件因IOE失败,则其他文件也会因连接超时而失败。 为了防止这种情况,我将以下代码检查并重新连接:

if(null == session || !session.isConnected()){
        log.debug("Session is not connected/timed out. Creating a new session");
        openSftpSession();
        log.debug("New session is created");
    }
//openSftpSession() is the code to create a new session as explained in the beginning of the question.

执行此代码时,将引发以下异常:

java.io.IOException: error: 4: RequestQueue: unknown request id 1028332337
    at com.jcraft.jsch.ChannelSftp$2.read(ChannelSftp.java:1407)
    at java.io.FilterInputStream.read(FilterInputStream.java:133)
    at java.io.PushbackInputStream.read(PushbackInputStream.java:186)
//More lines

编辑 :代码以检索输入流

public InputStream getInputStream(String folder, String file) throws Exception{
    sftpChannel.cd(root + folder);
    log.debug("current directory:" + sftpChannel.pwd());
    log.debug("File :" + folder + " " + file);
    return sftpChannel.get(file);
}

谁能帮我解决这个问题? 我认为,防止超时的另一种方法是将文件下载到一些临时目录和进程中。 但是,我真的不想这样做。

提前致谢。

您是否检查过您描述的方法(下载到临时文件中)是否有效? 只是为了验证您的输入流是否正常。通过该连接下载到本地文件需要多长时间?

如果您不想管理临时文件,则可以始终将其拉入内存中的byte [],只要您不必扩展到超过800kbs即可。使用Apache Commons的方法如下:

InputStream in = sftpChannel.get(file);
byte[] inBytes = org.apache.commons.io.IOUtils.toByteArray(in)
ByteArrayInputStream inByteStream = new ByteArrayInputStream(inBytes)
XSSFWorkbook workbook = new XSSFWorkbook(inByteStream);

至于请求ID,看来旧的会话/通道仍在尝试读取,但不再能够读取。 也许您没有正确关闭该会话/频道。 从openSftpSession()代码看来,您只会覆盖引用而没有正确关闭它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM