在JAVA中按部件发送文件

在JAVA中按部件发送文件,java,jakarta-ee,client-server,java-server,Java,Jakarta Ee,Client Server,Java Server,我正在用JAVA编写一个客户机-服务器程序,其中我正在从服务器向客户机发送一个文件。由于文件大小可能相当大,因此我决定将文件分成5部分,然后用5个不同的线程将其发送到同一个客户机 我的算法是使用并创建要发送的文件的zip文件,然后我将zip文件分为5部分。 问题是[ZIP API][2]中没有可以分割文件的方法。 我指的是通过线程发送文件。 有谁能给我指点一下,我的算法有什么问题吗?或者我必须用不同的策略吗 分解文件不是压缩功能。您可以从生成的zip文件创建多字节数组(通过对数组进行分段),并

我正在用JAVA编写一个客户机-服务器程序,其中我正在从服务器向客户机发送一个文件。由于文件大小可能相当大,因此我决定将文件分成5部分,然后用5个不同的线程将其发送到同一个客户机

  • 我的算法是使用并创建要发送的文件的zip文件,然后我将zip文件分为5部分。 问题是[ZIP API][2]中没有可以分割文件的方法。 我指的是通过线程发送文件。 有谁能给我指点一下,我的算法有什么问题吗?或者我必须用不同的策略吗

    • 分解文件不是压缩功能。您可以从生成的zip文件创建多字节数组(通过对数组进行分段),并将每个段发送到不同的线程中。这将类似于去年的下载管理员所做的工作


      然后,客户机将拥有按正确顺序重新组装字节数组的代码。您可能需要为每个段添加一些附加信息,如正确的序列、要还原的文件名以及预期的段数。

      您应该将压缩部分与拆分部分分开。如果您必须将这些文件发送到客户端,您可能不希望在等待客户端请求下一个数据块时将完整的zip文件保存在内存中。。。因此,最简单的方法是先压缩到磁盘,然后将该文件分块提供。在这一点上,它是一个zip文件并不重要——事实上,对于某些文件类型(例如图像、声音、视频),您可能根本不想通过zip文件


      我建议您告诉客户文件名和大小,然后让客户请求文件的任何部分。然后,它可以决定使用什么块大小:您只需查找文件的正确位,并根据客户的要求提供尽可能多的数据。

      为什么是5部分?对我来说,这似乎很武断。为什么不确定一个最大合理的块大小,并将其拆分为需要多少块?@JonSkeet是对的,但让我们假设为5..显然如果我们可以为5做,我们可以使用任何数字..主要问题是ZIP API Stuf..在我看来,您应该在适当数量的块上拆分文件,然后在一个线程中以串行顺序分别压缩和发送每个块。使用线程的想法是尽可能快地将其发送。我可以将一个不是文本文件的普通文件分成块吗?@user1690523:当然可以。我的回答中没有任何关于文本的暗示。事实上,试图将其视为文本并在字符边界处进行拆分更为困难。把一个文件想象成一个字节桶。但是像length()这样的函数,它们对一个文本文件进行操作,并返回字符数,它们如何对一个非文本文件(例如MP3文件)进行操作。@user1690523:不,它们没有
      String.length()
      提供字符串中的字符数,但任何文件操作(例如
      file.length()
      )都会提供以字节为单位的长度。有很多代码示例(例如)将文件读入字节数组,但您可以将
      byte[]
      设置为任意大小,然后把那么多数据读入其中。我可能会创建一些标题,用上面提到的信息添加到数组的前面。