Java:Can';t在jsch.put之后删除本地文件

Java:Can';t在jsch.put之后删除本地文件,java,file-io,ftp,jsch,Java,File Io,Ftp,Jsch,我在将文件移动到ftp站点后删除文件时遇到一些问题。在上一个过程中,我生成文件并将它们放在文件夹中。此过程应将每个文件上载到ftp站点,然后删除本地副本。由于某些原因,我无法确定删除是否失败,但我没有收到任何类型的错误消息或异常。最初,我在ftp.put()之后调用了file.delete(),但我将其移动到了当前位置,认为该文件可能已被jsch锁定,将调用放在那里可以修复它。事实似乎并非如此。理想情况下,调用将返回到那里,因此我不需要有两个“for”循环 如果您也碰巧知道为什么覆盖不起作用,那

我在将文件移动到ftp站点后删除文件时遇到一些问题。在上一个过程中,我生成文件并将它们放在文件夹中。此过程应将每个文件上载到ftp站点,然后删除本地副本。由于某些原因,我无法确定删除是否失败,但我没有收到任何类型的错误消息或异常。最初,我在ftp.put()之后调用了file.delete(),但我将其移动到了当前位置,认为该文件可能已被jsch锁定,将调用放在那里可以修复它。事实似乎并非如此。理想情况下,调用将返回到那里,因此我不需要有两个“for”循环

如果您也碰巧知道为什么覆盖不起作用,那将是一个额外的好处。当我查看通过实际FTP程序上传的文件时,权限是rw rw。服务器上的现有文件已通过此过程上载

代码如下:

    JSch jsch = new JSch();
    Session session = null;
    try {
        File sourceDir = new File(certSourceFolder);
        if (!sourceDir.exists()) {
            sourceDir.mkdirs();
        }

        session = jsch.getSession(ftpUser, ftpServer, 22);
        session.setConfig("StrictHostKeyChecking", "no");
        session.setPassword(ftpPassword);
        session.connect();

        Channel channel = session.openChannel("sftp");
        channel.connect();
        ChannelSftp ftp = (ChannelSftp) channel;

        ftp.cd(certDestFolder);

        for (File file : sourceDir.listFiles()) {
            if (file.isFile()) {
                try {
                    ftp.put(new FileInputStream(file), file.getName(), ChannelSftp.OVERWRITE);
                } catch (SftpException ex) {
                    //The overwrite is not working. For now I'm just going to trap the error and move on. This really shouldn't happen ever since I delete the file once uploaded.
                    if (!ex.getMessage().equalsIgnoreCase("Permission denied"))
                        throw ex;
                }
            }
        }

        ftp.exit();
        session.disconnect();

        //TODO: this is not working. figure out why. If possible get rid of this and move the file.delete up to after ftp.put
        for (File file : sourceDir.listFiles()) {
            if (file.isFile()) {
                file.delete();
            }
        }
    } catch (Exception e) {
        DefaultLogger.logException("CertificateFileTransfer", e);
    }
}
使用后必须关闭文件,否则将被当前正在使用的组件锁定

更改此行:

 ftp.put(new FileInputStream(file)...
对于
finally
子句,调用流上的
close
,以确保在任何情况下(良好或异常)文件的发布:

重述:

FileInputStream fileInput = null;
try {
    fileInput = new FileInputStream(file);
    ftp.put(fileInput, file.getName(), ChannelSftp.OVERWRITE);
} catch (SftpException ex) {
    if (!ex.getMessage().equalsIgnoreCase("Permission denied"))
        throw ex;
}
finally{
 if(fileInput != null){
   fileInput.close();
 }
}
从文档:

close()关闭此文件输入流并释放任何系统 与流关联的资源

使用后必须关闭文件,否则将被当前正在使用的组件锁定

更改此行:

 ftp.put(new FileInputStream(file)...
对于
finally
子句,调用流上的
close
,以确保在任何情况下(良好或异常)文件的发布:

重述:

FileInputStream fileInput = null;
try {
    fileInput = new FileInputStream(file);
    ftp.put(fileInput, file.getName(), ChannelSftp.OVERWRITE);
} catch (SftpException ex) {
    if (!ex.getMessage().equalsIgnoreCase("Permission denied"))
        throw ex;
}
finally{
 if(fileInput != null){
   fileInput.close();
 }
}
从文档:

close()关闭此文件输入流并释放任何系统 与流关联的资源