【问题标题】:Sending large file over network通过网络发送大文件
【发布时间】:2015-06-23 18:59:23
【问题描述】:

首先我为冗长的描述道歉。但我尽力做到这一点。

目标是组合大小为 50MB 的单个文件并发送每个 50MB 的倍数。因为我不想单独通过网络发送一个非常小的文件。除了一次性发送所有文件也无济于事,因为合并文件的大小可能太大。

对于(例如)如果我附加 4 个大小为 50MB 的文件,那么组合大小将为 200MB,太大而无法发送。因此,不要一次发送 200MB,而是一个接一个地发送 50MB 的倍数,因此循环遍历 file_list 并测量每个文件大小(如果它小于 50MB),然后将其添加到 send_list 中,因此继续添加单个文件,直到达到 50MB,所以一次它达到 50MB,然后发送该 file_list。继续遍历 file_list 并对其余文件执行相同操作。

我尝试过的:

假设 file_list 包含 4 个文件,即 50MB、40MB、30MB、20MB

Collections.sort(files, new Comparator<File>() {
    @Override
    public int compare(File  fileOne, File  fileTwo) {
        return  fileOne.getSize() - fileTwo.getSize();//Sorting Asc.
    }                   
});

Integer total = 0;
ArrayList<File> files = new ArrayList<File>();
for(File file:files) {
    total = total + file.getSize();  
    if(total <= 51200 ) { //51200KB = 50MB          
        files.add(file);    
            if(total == 51200) { 
            send(files);
            files = new ArrayList<File>();
            total = 0;
            }
    } else {
        send(files);
        files = new ArrayList<File>();
        total = 0;
    }       
}
if(files.size() > 0)
    send(files);

但上面缺少 30MB 文件 - 这个逻辑有什么问题?

【问题讨论】:

  • 我不会打扰。您对 200MB“太大而无法发送”的评估完全是武断的。我会为此使用具有恢复功能的良好 FTP 客户端,而根本不编写任何代码。
  • 正确 - 这完全是任意的。我正在使用 Spring MVC Portlet 并使用 AJAX 异步附加和发送文件,这些文件通过 Web 服务发送到中间层应用程序进行处理。
  • 你实现了这段代码还是伪代码,我发现这里有很多错误比较器实现不正确。您创建文件实例并循环遍历同一实例 ArrayList files = new ArrayList(); for(文件文件:文件)
  • 记住 - 检索时检查文件,而不是已经检索到的文件!

标签: java spring file collections chunked


【解决方案1】:

换行

if(total = 51200)

以下内容:

if(total == 51200)

total = 51200 不是比较语句,而是一个偏离您打算实现的逻辑的赋值。

希望对您有所帮助。

【讨论】:

  • 无需抱歉...可以捕获此类内容的代码编辑器工具会很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-03
  • 2011-03-31
  • 2011-04-05
  • 1970-01-01
  • 2013-08-21
相关资源
最近更新 更多