gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 07:07:09 24 4
gpt4 key购买 nike

我编写了一个小型 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 允许将文件从一个目录移动到远程服务器上的另一个目录。

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

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

关于java - 如何使用 JSch 进行原子 SFTP 文件传输,以便在写入过程完成之前无法访问文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25119076/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com