Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:在URLConnection中恢复下载_Java_Resume_Urlconnection - Fatal编程技术网

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和代码时的标题。看起来不错。