【问题标题】:Java FileOutputStream returning 0 size filesJava FileOutputStream 返回 0 大小的文件
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 什么是 ZipOutputStream?从我看到的用户正在使用它来创建 zip 文件而不是下载它们
猜你喜欢
  • 1970-01-01
  • 2021-08-14
  • 1970-01-01
  • 1970-01-01
  • 2015-07-08
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
相关资源
最近更新 更多