Java 如何使用JSch进行原子SFTP文件传输,以便在写入过程完成之前无法访问该文件?

Java 如何使用JSch进行原子SFTP文件传输,以便在写入过程完成之前无法访问该文件?,java,sftp,jsch,Java,Sftp,Jsch,我编写了一个小型Java程序,它使用Jsch将多个文本文件传输到远程服务器。 由于单个文件可能会变得相当大,因此传输最多需要20秒 在远程服务器上,生成的文件将在我无法控制的不同时间点被访问(读取)。我已经测试过在服务器上的SFTP传输期间复制文件。复制的文件没有需要完成的完整数据,因为在执行“复制”命令之前,该文件不完全可用 如何确保只有在传输完全完成后才能访问该文件,以便完全读取该文件? 因为我无法控制远程服务器上的文件访问,所以我需要一种从Java程序中实现这一点的方法 以下是我编写的代码

我编写了一个小型Java程序,它使用Jsch将多个文本文件传输到远程服务器。 由于单个文件可能会变得相当大,因此传输最多需要20秒

在远程服务器上,生成的文件将在我无法控制的不同时间点被访问(读取)。我已经测试过在服务器上的SFTP传输期间复制文件。复制的文件没有需要完成的完整数据,因为在执行“复制”命令之前,该文件不完全可用

如何确保只有在传输完全完成后才能访问该文件,以便完全读取该文件? 因为我无法控制远程服务器上的文件访问,所以我需要一种从Java程序中实现这一点的方法

以下是我编写的代码的相关部分:

InputStream contentInputStream = null;
try {
    contentInputStream = new ByteArrayInputStream(Files.readAllBytes(Paths.get("test1.txt")));
} catch (IOException e) {
    e.printStackTrace();
}
sftpChannel.put(contentInputStream, "abc.txt");
你不能

远程服务器上的文件访问纯粹是“远程服务器的事情”。如果 任何SFTP服务器应用程序都不会将文件标记为 不可访问,则默认情况下可访问

您可以在几乎所有SFTP服务器应用程序中设置此类默认权限 据我所知,这就是你应该寻找的解决方案

我的回答完全错误。。。把它留给“日志记录”

答案是sftp.chmod()方法。在上传文件之前,您可以取消对该文件的所有访问权限

你不能

远程服务器上的文件访问纯粹是“远程服务器的事情”。如果 任何SFTP服务器应用程序都不会将文件标记为 不可访问,则默认情况下可访问

您可以在几乎所有SFTP服务器应用程序中设置此类默认权限 据我所知,这就是你应该寻找的解决方案

我的回答完全错误。。。把它留给“日志记录”


答案是sftp.chmod()方法。在上传文件之前,您可以取消对文件的所有访问。

SFTP协议仅从版本5开始支持显式锁定。而JSch只支持协议的版本3(大多数服务器也是如此)


所以你必须自己动手解决。例如,建议使用@Xabster。

SFTP协议仅从版本5开始支持显式锁定。而JSch只支持协议的版本3(大多数服务器也是如此)


所以你必须自己动手解决。例如,如@Xabster所建议的。

您正在将文件写入远程服务器上的一个目录,远程服务器上的某些进程正在监视文件是否出现在那里。在文件完全写入服务器之前,您不希望远程进程对该文件执行操作

无论是谁建立了这个系统,在设计它时都应该考虑到这个问题。在服务器之间传输文件需要时间,传输也可能在完成之前失败。需要设计一种方式将文件传输到服务器,然后使其可用于此远程进程

有三种常见的方法可以做到这一点:

将文件写入其他文件夹:将文件写入远程服务器上的“临时”或“工作”目录,远程进程不监视该目录。文件传输完成后,将文件从临时目录移动到实际的目标目录。将文件从一个目录移动到另一个目录应该是一个即时操作。SFTP允许在远程服务器上将文件从一个目录移动到另一个目录

将文件写入特殊文件名:将文件写入远程系统上的目标目录,但使用远程进程将忽略的特殊文件名。文件传输完成后,请重命名文件,使其具有正确的名称。例如,如果远程进程正在查找以“.xml”结尾的文件名,您应该在远程服务器上创建一个名为“foo.xml.tmp”的文件,将数据写入其中,然后将其从“foo.xml.tmp”重命名为“foo.xml”。SFTP允许重命名远程服务器上的文件


使用修改时间戳:远程进程可以检查它将要处理的文件上上次修改的时间戳,并忽略在最后一分钟左右修改过的文件。这种行为必须内置到远程进程中。SFTP有一个在远程文件上设置修改时间戳的操作,JSCH支持它,但通常不会显式调用此函数。通常,您将依赖远程文件的上次修改时间戳来反映您写入文件的进程。

您正在将文件写入远程服务器上的目录,远程服务器上的某些进程正在监视文件是否出现在那里。在文件完全写入服务器之前,您不希望远程进程对该文件执行操作

无论是谁建立了这个系统,在设计它时都应该考虑到这个问题。在服务器之间传输文件需要时间,传输也可能在完成之前失败。需要设计一种方式将文件传输到服务器,然后使其可用于此远程进程

有三种常见的方法可以做到这一点:

将文件写入其他文件夹:将文件写入远程服务器上的“临时”或“工作”目录,远程进程不监视该目录。文件传输完成后,将文件从临时目录移动到实际的目标目录。将文件从一个目录移动到另一个目录应该是一个即时操作。SFTP允许在远程服务器上将文件从一个目录移动到另一个目录

将文件写入特殊文件名:将文件写入远程系统上的目标目录,但使用远程进程将忽略的特殊文件名。文件传输完成后,请重命名文件,使其具有正确的名称。例如,如果远程进程正在查找f