如何跟踪 FileOutputStream 下载了多少?
How does one track how much a FileOutputStream has downloaded?
假设我有以下代码可以从我的网站下载内容。
URL website = new URL(url);
ReadableByteChannel rbc = Channels.newChannel(website.openStream());
FileOutputStream fos = new FileOutputStream("something.zip");
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
fos.close();
我想制作一个 JProgressBar 来显示正在下载的文件的进度。要实现这一点,我知道一种方法是获取文件的总大小和文件当前下载的字节数,然后获取百分比。下面是获取文件大小的代码:
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("HEAD");
long fileSize = conn.getContentLengthLong();
但是,获取 FileOutputStream 的下载字节很困难,因为您必须创建一个循环来跟踪当前正在下载的字节。那么你将如何实现这一目标?
注意:该算法应该适用于非常大的文件,因为我从互联网上下载的文件大小为 1 GB。
我在下面提供了您可以查看的代码片段。基本上,你必须计算字节数,然后通过深入到 100 来计算一些百分比。
InputStream inputStream = util.getInputStream();
// opens an output stream to save into file
FileOutputStream outputStream = new FileOutputStream(saveFilePath);
byte[] buffer = new byte[BUFFER_SIZE];
int bytesRead = -1;
long totalBytesRead = 0;
int percentCompleted = 0;
long fileSize = util.getContentLength();
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
totalBytesRead += bytesRead;
percentCompleted = (int) (totalBytesRead * 100 / fileSize);
setProgress(percentCompleted);
有关详细信息,请参阅此link
假设我有以下代码可以从我的网站下载内容。
URL website = new URL(url);
ReadableByteChannel rbc = Channels.newChannel(website.openStream());
FileOutputStream fos = new FileOutputStream("something.zip");
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
fos.close();
我想制作一个 JProgressBar 来显示正在下载的文件的进度。要实现这一点,我知道一种方法是获取文件的总大小和文件当前下载的字节数,然后获取百分比。下面是获取文件大小的代码:
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("HEAD");
long fileSize = conn.getContentLengthLong();
但是,获取 FileOutputStream 的下载字节很困难,因为您必须创建一个循环来跟踪当前正在下载的字节。那么你将如何实现这一目标?
注意:该算法应该适用于非常大的文件,因为我从互联网上下载的文件大小为 1 GB。
我在下面提供了您可以查看的代码片段。基本上,你必须计算字节数,然后通过深入到 100 来计算一些百分比。
InputStream inputStream = util.getInputStream();
// opens an output stream to save into file
FileOutputStream outputStream = new FileOutputStream(saveFilePath);
byte[] buffer = new byte[BUFFER_SIZE];
int bytesRead = -1;
long totalBytesRead = 0;
int percentCompleted = 0;
long fileSize = util.getContentLength();
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
totalBytesRead += bytesRead;
percentCompleted = (int) (totalBytesRead * 100 / fileSize);
setProgress(percentCompleted);
有关详细信息,请参阅此link