[英]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.