在Java中,在网络上的文件之间传输字节的最佳方式是什么

在Java中,在网络上的文件之间传输字节的最佳方式是什么,java,networking,nio,Java,Networking,Nio,代码是用Java1.7编写的 我想在慢速网络上对二进制文件进行一些重大修改。为了防止网络连接丢失,而不是直接写入文件,我将写入一个新文件。当我完成对新文件的写入后,我会删除旧文件并将新文件重命名为旧文件 我的问题是,新文件是否更好 1.与原始文件位于同一位置 2.在计算机上本地 和1。写入文件的速度可能会慢一些,但重命名应该会快一些,事实上,大多数操作系统都会立即进行重命名。使用2写入文件应该会更快,但是重命名文件会更慢 我觉得答案是1 实际上,如果我同时打开一个文件通道,并将文件从一个通道直接

代码是用Java1.7编写的

我想在慢速网络上对二进制文件进行一些重大修改。为了防止网络连接丢失,而不是直接写入文件,我将写入一个新文件。当我完成对新文件的写入后,我会删除旧文件并将新文件重命名为旧文件

我的问题是,新文件是否更好 1.与原始文件位于同一位置 2.在计算机上本地

和1。写入文件的速度可能会慢一些,但重命名应该会快一些,事实上,大多数操作系统都会立即进行重命名。使用2写入文件应该会更快,但是重命名文件会更慢

我觉得答案是1


实际上,如果我同时打开一个文件通道,并将文件从一个通道直接传输到另一个通道,那么字节是否必须从网络传输到我的计算机并返回到网络,或者可以直接从网络上的一个地方复制到另一个地方。

我猜在这里,但文件可能是通过某个网络文件系统装载的(NFS,SMB)。因此,您可以像访问本地文件一样访问它们;它们只是速度较慢

至于第一个问题:首先在本地写入文件不会带来任何好处。最后,您必须始终将文件移动到网络中的正确位置,这始终涉及“复制所有字节”操作。例如,Java的
file.rename()
当两个文件不在同一硬盘/挂载上时,将失败。因此,无论如何,您必须手动将字节复制到目标文件夹。某些IO框架会在必要时为您执行此操作,但这种情况经常发生


至于在两个远程主机之间直接复制数据:有一些网络文件系统支持这种操作,但这是一项特殊功能不要这样做。他们总是从源文件下载整个文件,然后将其上载到目标文件。

因此,问题1的答案应该是1,这是有意义的。这适用于可以在任何情况下使用的应用程序,但最有可能的情况是Windows计算机从NAS服务器(可能使用NTFS)安装网络驱动器,以及第二种可能是连接到NAS的Mac。它不是在teo远程主机之间进行复制,尽管只是将远程主机上的文件复制到同一远程主机上复制远程主机上的文件并不是一种常见的操作,因此网络文件系统提供了一个特殊命令来执行此操作(您的文件API也必须支持此操作)。当您可以打开远程shell时,可以从远程命令行运行复制命令。某些网络文件系统支持分发数据以实现容错。但这只是镜像/克隆操作。它不是复制所需的完整文件,而是将大量字节从一个文件传输到另一个文件或远程驱动器控制由本地机器进行跟踪。