【发布时间】:2017-08-02 22:38:18
【问题描述】:
我已经编写了一个程序,它接收特定的 URL,然后扫描以时间和日期命名的特定目录,例如,假设输入的 url 是“www.url.com”,它会扫描这个目录“www.url.com/date&time”。
链接会不断更新,并且会随机删除链接并用新链接覆盖,我的目标是扫描 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);
}
}
这是我在 while 循环中检测到 url 目录更改时调用的函数,第一次工作,然后文件在第一次下载后以 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 字节。
如何修改代码以允许我检查目录的更新,然后根据需要多次下载其中的文件并且没有错误?
【问题讨论】:
-
您需要在 FileOutputStream 或频道上调用 close()。
-
我添加了 'fos.close();'在 null 之前的 urldownload 末尾,但现在我得到的文件只有一半大小并且损坏了,我应该在哪里调用它或者我使用错了?
-
那么你应该在频道上使用close。
-
我已经尝试关闭两者,它的工作,但随机文件损坏,有没有更好的做法我可以使用带有一些 try 和 catch 子句的 fileoutputstream?
-
try{ ReadableByteChannel rbc = Channels.newChannel(urldownload.openStream()); FileOutputStream fos = new FileOutputStream(linkname+".zip"); BufferedOutputStream bos = new BufferedOutputStream(fos); ZipOutputStream zos = new ZipOutputStream(bos); fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); fos.close(); rbc.close();这就是我正在使用的,它大约 75% 的时间都有效,有什么原因吗?
标签: java url while-loop download fileoutputstream