【发布时间】: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