2017-08-02 81 views
0

我已经把一个程序,接受一个特定的URL,然后扫描一个特定的目录命名的时间和日期,例如,说的url是'www.url.com' ,它将扫描该目录'www.url.com/date &时间'。Java FileOutputStream返回0大小的文件

该链接不断更新,随机时间链接将被删除,并被一个新的覆盖,我的目标是扫描url下载目录,然后再次扫描一个新的目录来取代旧的一个并再次下载新文件。

while(numberofDownloads > 0){ 

     linkname = urlprint(url);//finds name of link (essentically the top half of the code in urldownload) 

     if(!linknameTemp.equals(linkname)){ 
      numberofDownloads--; 
      print("downloads left: " + numberofDownloads); 
      linkname = urlprint(url); 
      linknameTemp = linkname; 
      urldownload(url); 
     } 

    } 

这是当它检测到URL目录的变化,我在while循环中调用该函数,作品第一次那么文件下载使用后的第一个0字节。

private static String urldownload(String url) throws FileNotFoundException, IOException { 

    Document doc = Jsoup.connect(url).get(); 
    Elements links = doc.select("a[href]"); 
    String linkname = ""; 

    for (Element link : links) { 

     String templinkname = trim(link.text(), 35); 

     if(Character.isDigit(templinkname.charAt(0))){ 
      linkname = trim(link.text(), 35); 
     }  

     //String linkname = trim(link.text(), 35); 
    } 

    String urlZip = (url + linkname + "urilist.zip");//file is always named urilist.zip 

    URL urldownload = new URL(urlZip); 

    print(linkname); 

    linkname = linkname.substring(0,linkname.length()-1); //remove last character '/' character to not confuse fileoutputstream 
    ReadableByteChannel rbc = Channels.newChannel(urldownload.openStream()); 
    FileOutputStream fos = new FileOutputStream(linkname+".zip");//rename file after directory 
    fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); 

    return null; 
} 

所以,当我运行的代码在下载的第一个文件是完全正常的,但是接下来的文件(但是很多我的价值“numberofDownloads”)全部下载到我的项目目录,但在0字节。

我该如何修改代码以允许我检查目录的更新,然后在需要而无错的情况下多次下载文件?

+1

您需要在FileOutputStream或通道上调用close()。 – wumpz

+0

我已添加'fos.close();'在urldownload结束之前null,但现在我得到的文件一半大小和损坏,我应该在哪里调用它,或者我用它错了? –

+0

然后你应该在频道上使用close。 – wumpz

回答

0

能否请您检查ZipOutputStream类,而不是FileOutputStream中可以帮助您解决一半,损坏的文件?

+0

什么是ZipOutputStream?从我看到用户使用它创建zip文件不下载它们 –