Java 如果我以较大的块(即大于1024字节)上载一个大文件,会发生什么情况?

Java 如果我以较大的块(即大于1024字节)上载一个大文件,会发生什么情况?,java,android,http,design-patterns,Java,Android,Http,Design Patterns,因此,我有一个大文件~20MB,必须上传到web服务器,我遵循以下方法: 从存储器输入流读取文件 创建大小1024的字节缓冲区 创建一个输出流并将字节缓冲区写入其中 重复步骤2和3,直到文件完全读写 现在,我有几个问题 要上传这样一个大文件,我必须重复步骤2和步骤3,重复20*1024次。如果我想减少迭代次数,即将字节缓冲区的大小增加到4096,从而减少迭代次数20*256,该怎么办。除了android上的outofmemory之外,这会带来什么后果 如果我根据运行时在android上创建的

因此,我有一个大文件~20MB,必须上传到web服务器,我遵循以下方法:

  • 从存储器
    输入流读取文件
  • 创建大小1024的
    字节缓冲区
  • 创建一个
    输出流
    并将
    字节缓冲区写入其中
  • 重复步骤2和3,直到文件完全读写
现在,我有几个问题

  • 要上传这样一个大文件,我必须重复步骤2和步骤3,重复20*1024次。如果我想减少迭代次数,即将
    字节缓冲区的大小增加到4096,从而减少迭代次数
    20*256
    ,该怎么办。除了android上的outofmemory之外,这会带来什么后果

  • 如果我根据运行时在android上创建的缓存大小修改此大小,那么web服务器上是否需要进行任何更改(可能因设备而异)

  • 如果由于网络或服务器问题导致上传中断,我还需要恢复上传,为此,我考虑保留成功发送的最后一个区块编号,从而在互联网可用或服务器响应时发送下一个区块。这是正确的方法吗?是否已经有可用的工具,或者我正在尝试重新发明轮子

  • 这些发送到服务器的块或字节数组的接收顺序如何


  • 回答你的问题:

  • 使用1024的缓冲区大小非常小。TCP层将尝试在网络上推送完整的数据包。除非涉及巨型帧,否则完整数据包通常为1.5K字节。因此,如果您向网络套接字写入1K,则在写入下一个1K之前,TCP数据包不一定会被推出。这是为了最大限度地减少发送的每个数据字节的开销

  • 大多数企业级web服务器可以轻松处理大小为10兆字节(如果不是更大的话)的POST请求。我在工作中经常遇到这种情况

  • 这已经完成了-对不起,我的头上没有任何指针

  • HTTP通过像TCP这样的面向流的协议,因此字节的接收顺序与接收顺序相同。TCP中没有“块”的概念-您发送一个字节流,而接收方获得一个(按顺序)字节流


  • 将缓冲区增加到100K,看看会发生什么。您可以自己轻松地调查上传速度上的缓冲区大小。为什么问我们?100k不会导致
    outofmemory
    ?再次:尝试并找出答案。这些都是你自己可以做的简单测试。这不是我唯一的怀疑,而是其他的怀疑之一加2。不,您不必更改Web服务器。加3。这是不可能的。您将无法在http服务器发送的有关接收到的块的消息之间进行切换。您可以发送任意数量的数据块,这些数据块将被操作系统接受,但可能无法到达服务器。只有当您完成并开始阅读响应时,您才知道所有内容都已收到。加4。是的TCP/IP保证了这一点。顶部答案-没什么好说的!