Java:在URLConnection中恢复下载
我编写了一个程序,从一些服务器下载一些文件。Java:在URLConnection中恢复下载,java,resume,urlconnection,Java,Resume,Urlconnection,我编写了一个程序,从一些服务器下载一些文件。 当前程序运行正常。 但我想为其添加简历支持。 我是这样做的,但结果文件已损坏: .... File fcheck=new File(SaveDir+"/"+filename); if(resumebox.isSelected() && fcheck.exists()){ connection.setRequestProperty("Range", "Bytes="+(fcheck.length())+"-"); } con
当前程序运行正常。
但我想为其添加简历支持。
我是这样做的,但结果文件已损坏:
....
File fcheck=new File(SaveDir+"/"+filename);
if(resumebox.isSelected() && fcheck.exists()){
connection.setRequestProperty("Range", "Bytes="+(fcheck.length())+"-");
}
connection.setDoInput(true);
connection.setDoOutput(true);
BufferedInputStream in = new BufferedInputStream (connection.getInputStream());
pbar.setIndeterminate(false);
pbar.setStringPainted(true);
java.io.FileOutputStream fos ;
if(resumebox.isSelected()){
if(fcheck.exists()){
if(connection.getHeaderField("Accept-Ranges").equals("bytes")){
fos = new java.io.FileOutputStream(SaveDir+"/"+filename,true);
}else{
fos = new java.io.FileOutputStream(SaveDir+"/"+filename);
}
}else{
fos = new java.io.FileOutputStream(SaveDir+"/"+filename);
}
}else{
fos = new java.io.FileOutputStream(SaveDir+"/"+filename);
}
....
我正在一台我知道支持resume的服务器上测试它。我下载了一些字节。(72720)
然后尝试恢复它。
然后我用十六进制编辑器打开文件,偏移量为72720,第一个字节重复:
字节0-36:FLV………~……….在元数据上
字节72720-72756:FLV………~……….在元数据上
它从一开始就开始下载
而当我用wget做的时候,它是正确的,并且通过内容范围字段进行响应
服务器响应,wget日志中有“302找到”和“206部分内容”。
“302已找到”会导致问题吗 有什么问题吗?
谢谢。试试:
connection.setRequestProperty("Range", "bytes=" + fcheck.length() + "-");
根据规范将范围说明符小写。此外,如果部分文件为500字节,则意味着您的字节范围为0-499,并且希望为500+。问题在于
(fcheck.length()-1)
:这应该是fcheck.length()
另一个问题是您有一个不必要的深嵌套if/else块。使用&&
运算符。也就是说,如果(a&b&c){fos=new fos(name,true);}否则{fos=new fos(name);}。就这样。干。我总结代码!在那些if-else块中,我正在提升一些消息,所以应该是这样。但是谢谢您的回复。302应该不是问题,因为默认情况下HTTPUrlConnection遵循重定向。除非您明确关闭重定向,我对此表示怀疑,因为您实际上正在获取文件内容。你是对的。但它还有另一个问题,我编辑了原始帖子并添加了这个问题。请检查一下。感谢您应该考虑使用WiReSARK之类的东西来确保您的请求头被正确设置。您可以尝试使用addRequestProperty而不是setRequestProperty,不过我希望它们都能做同样的事情。设置为:“范围:字节=257177-”!但它又从字节0开始!有趣-尝试比较发布wget和代码时的标题。看起来不错。