![](/img/trans.png)
[英]Java apache commons FTP, how to download image file to BufferedImage
[英]Download file using java apache commons?
如何使用庫下載文件並打印保存的字節? 我試過用
import static org.apache.commons.io.FileUtils.copyURLToFile;
public static void Download() {
URL dl = null;
File fl = null;
try {
fl = new File(System.getProperty("user.home").replace("\\", "/") + "/Desktop/Screenshots.zip");
dl = new URL("http://ds-forums.com/kyle-tests/uploads/Screenshots.zip");
copyURLToFile(dl, fl);
} catch (Exception e) {
System.out.println(e);
}
}
但我無法顯示字節或進度條。 我應該使用哪種方法?
public class download {
public static void Download() {
URL dl = null;
File fl = null;
String x = null;
try {
fl = new File(System.getProperty("user.home").replace("\\", "/") + "/Desktop/Screenshots.zip");
dl = new URL("http://ds-forums.com/kyle-tests/uploads/Screenshots.zip");
OutputStream os = new FileOutputStream(fl);
InputStream is = dl.openStream();
CountingOutputStream count = new CountingOutputStream(os);
dl.openConnection().getHeaderField("Content-Length");
IOUtils.copy(is, os);//begin transfer
os.close();//close streams
is.close();//^
} catch (Exception e) {
System.out.println(e);
}
}
如果您正在尋找在下載之前獲取總字節數的方法,則可以從http響應中的Content-Length
標頭獲取此值。
如果您只想在下載后獲得最終字節數,則最簡單的方法是檢查您剛寫入的文件大小。
但是,如果要顯示已下載的字節數的當前進度,可能需要擴展apache CountingOutputStream
以包裝FileOutputStream
以便每次調用write
方法時,它會計算通過的字節數並更新進度條。
更新
這是DownloadCountingOutputStream
一個簡單實現。 我不確定您是否熟悉使用ActionListener
,但它是一個用於實現GUI的有用類。
public class DownloadCountingOutputStream extends CountingOutputStream {
private ActionListener listener = null;
public DownloadCountingOutputStream(OutputStream out) {
super(out);
}
public void setListener(ActionListener listener) {
this.listener = listener;
}
@Override
protected void afterWrite(int n) throws IOException {
super.afterWrite(n);
if (listener != null) {
listener.actionPerformed(new ActionEvent(this, 0, null));
}
}
}
這是用法示例:
public class Downloader {
private static class ProgressListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
// e.getSource() gives you the object of DownloadCountingOutputStream
// because you set it in the overriden method, afterWrite().
System.out.println("Downloaded bytes : " + ((DownloadCountingOutputStream) e.getSource()).getByteCount());
}
}
public static void main(String[] args) {
URL dl = null;
File fl = null;
String x = null;
OutputStream os = null;
InputStream is = null;
ProgressListener progressListener = new ProgressListener();
try {
fl = new File(System.getProperty("user.home").replace("\\", "/") + "/Desktop/Screenshots.zip");
dl = new URL("http://ds-forums.com/kyle-tests/uploads/Screenshots.zip");
os = new FileOutputStream(fl);
is = dl.openStream();
DownloadCountingOutputStream dcount = new DownloadCountingOutputStream(os);
dcount.setListener(progressListener);
// this line give you the total length of source stream as a String.
// you may want to convert to integer and store this value to
// calculate percentage of the progression.
dl.openConnection().getHeaderField("Content-Length");
// begin transfer by writing to dcount, not os.
IOUtils.copy(is, dcount);
} catch (Exception e) {
System.out.println(e);
} finally {
IOUtils.closeQuietly(os);
IOUtils.closeQuietly(is);
}
}
}
commons-io有IOUtils.copy(inputStream, outputStream)
。 所以:
OutputStream os = new FileOutputStream(fl);
InputStream is = dl.openStream();
IOUtils.copy(is, os);
並且IOUtils.toByteArray(is)
可用於獲取字節。
獲得總字節數是另一回事。 Streams不會給你任何總數 - 它們只能提供流中當前可用的內容。 但由於它是一個流,它可以有更多的來。
這就是為什么http有其特殊的方式來指定總字節數。 它位於響應標頭Content-Length
。 因此,您必須調用url.openConnection()
,然后在URLConnection
對象上調用getHeaderField("Content-Length")
。 它將以字符串形式返回字節數。 然后使用Integer.parseInt(bytesString)
,你將得到你的總數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.