我编写了一个小的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支持它,但是通常不会显式调用此函数。通常,您将依赖于远程文件的上次修改时间戳来反映您写入文件的过程。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句