Java 如何知道从url下载的文件是否不完整?

Java 如何知道从url下载的文件是否不完整?,java,download,corrupt,Java,Download,Corrupt,我正在使用来自的这个伟大片段从url下载一个文件: URL website = new URL("http://www.website.com/information.asp"); ReadableByteChannel rbc = Channels.newChannel(website.openStream()); FileOutputStream fos = new FileOutputStream("information.html"); fos.getChannel().transfer

我正在使用来自的这个伟大片段从url下载一个文件:

URL website = new URL("http://www.website.com/information.asp");
ReadableByteChannel rbc = Channels.newChannel(website.openStream());
FileOutputStream fos = new FileOutputStream("information.html");
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
但出于安全原因,我宁愿将下载限制在2mb,而不是
Long.MAX_VALUE
,因此我将其替换为

fos.getChannel().transferFrom(rbc, 0, 2097152);
但是现在,我想知道如何处理文件大小大于2mb的情况


如何检查文件是否损坏?

您是否考虑过根据检查内容长度标题?然后,您可以检查这是否超过某个可接受的值(在您的案例中为2MB),并拒绝进一步的处理。您可以通过一个初始HTTP
HEAD
请求,然后是一个
GET
(如果您高兴的话),或者通过读取
GET
响应的头并继续进行进一步的流式处理(如果可以的话)来完成这一任务

或者(但必须承认是丑陋的),您可以使用
BufferedReader
传入2MB的缓冲区,并将其与头进行比较


至于腐败,最好使用其他评论中所述的校验和。当然,这需要您预先知道资源的校验和,而不是从HTTP响应本身获得的信息。

这个问题实际上有两个方面:

  • 如何知道您是否下载了整个文件,以及

  • 如何知道下载的内容是否已损坏

首先要注意的是,如果将文件传输“切碎”为2Mb,那么如果表面传输的文件大小为2Mb,则可以非常肯定它不会完成。(从外观上看,任何传输编码解码后,您当前的代码将为您提供字节数……这简化了事情。)

接下来要注意的是,HTTP响应通常会包含一个
内容长度
头,该头告诉客户端响应体中预期的(传输编码的)内容字节数。但是,这并不能告诉您实际收到的字节(解码后)是否正确。(此外,此标题是可选的……您不能依赖它的存在。)

正如@ato所指出的,在实际读取数据之前,最好先检查GET(或HEAD)响应中的内容长度


但是,要知道您是否拥有完整/未损坏的文件,唯一可靠的方法是根据从传输中单独获得的校验和或(理想情况下)加密散列对其进行检查。没有使用HTTP协议获取校验和或哈希的标准方法

校验和是检查文件完整性的最好方法之一。但这假设我有下载文件的原始校验和,或者我必须在下载之前完全下载,对吗?是的,你需要原始校验和来验证。