【发布时间】:2014-09-19 19:23:29
【问题描述】:
我最近一直在试验多线程,我编写了一个应用程序,该应用程序可以下载具有 HTTPUrlConnection 的 Range 请求属性的文件。我首先从标题中获取文件的长度,然后将其分成 X 个相等的部分,如果有剩余部分,我会再分配一个线程来填补空缺。然后每个部分进入队列内的一个对象。然后多个线程访问队列中的每个任务并执行它,同时将每个部分下载到单独的文件中。
我加入文件的方式是问题所在。无论我使用 Linux cat 还是 Windows 的 copy /B 或 type,总是会发现生成的文件以某种方式无效。
对于 AVI 文件,索引已损坏,但在重建时,AVI 可以正常播放。使用 .rar 文件时,winrar 会显示“存档意外结束”,尽管文件提取正常。这可能是什么原因造成的。当我在线程中拆分它时,我确保没有字节重叠。
【问题讨论】:
-
您能否就您的问题添加更多信息?我认为它非常不清楚
-
我会下载(原始)完整文件并在两个并行窗口中对原始文件和重新组装的文件进行十六进制转储。这样您就可以看到哪些内容相同,哪些内容不同。您提到的所有实用程序都适用于文本内容而不是二进制文件,因此当您将它们与这些二进制文件一起使用时,如果它们的行为不正确,我不会感到惊讶。我会改为使用
FileInputStreams 在全部下载后一次重新读取您的片段,并以正确的顺序将它们写入单个FileOutputStream。 -
我在十六进制编辑器中发现的是,我制作的每个部分至少有一个字符偏移量。变化是涟漪,我必须找出变化发生的地方。
-
你能发布你的代码吗?
-
是的,我会把它贴在 Gist gist.github.com/anonymous/350b1a911cae5c3725ca "queue" 包中的库是我自己制作的,但这只是为了处理线程。