Java HttpClient和上载进度-缺少ProgressListener
我看了HttpClient进度代码,但仍然有一些问题找不到答案 从何处获取此ProgressListener以放置构造函数参数?如何正确使用代码?请帮忙 这是密码Java HttpClient和上载进度-缺少ProgressListener,java,file-io,file-upload,multifile-uploader,Java,File Io,File Upload,Multifile Uploader,我看了HttpClient进度代码,但仍然有一些问题找不到答案 从何处获取此ProgressListener以放置构造函数参数?如何正确使用代码?请帮忙 这是密码 import java.io.FilterOutputStream; import java.io.IOException; import java.io.OutputStream; import java.nio.charset.Charset; import org.apache.http.entity.mime.HttpMult
import java.io.FilterOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.Charset;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntity;
public class CountingMultipartEntity extends MultipartEntity {
private final ProgressListener listener;
public CountingMultipartEntity(final ProgressListener listener) {
super();
this.listener = listener;
}
public CountingMultipartEntity(final HttpMultipartMode mode, final ProgressListener listener) {
super(mode);
this.listener = listener;
}
public CountingMultipartEntity(HttpMultipartMode mode, final String boundary,
final Charset charset, final ProgressListener listener) {
super(mode, boundary, charset);
this.listener = listener;
}
@Override
public void writeTo(final OutputStream outstream) throws IOException {
super.writeTo(new CountingOutputStream(outstream, this.listener));
}
public static interface ProgressListener {
void transferred(long num);
}
public static class CountingOutputStream extends FilterOutputStream {
private final ProgressListener listener;
private long transferred;
public CountingOutputStream(final OutputStream out,
final ProgressListener listener) {
super(out);
this.listener = listener;
this.transferred = 0;
}
public void write(byte[] b, int off, int len) throws IOException {
out.write(b, off, len);
this.transferred += len;
this.listener.transferred(this.transferred);
}
public void write(int b) throws IOException {
out.write(b);
this.transferred++;
this.listener.transferred(this.transferred);
}
}
}
我可以这样实现接口吗
...
public static interface ProgressListener {
void transferred(long num);
}
public static class Progress implements ProgressListener
{
public void transferred(long num) {
// // update the progress bar or whatever else you might want to do
}
}
...
但是,对于这个包含HttpClient的外部类,我如何初始化ProgressListener呢
CountingMultiPartEntity entity = new CountingMultiPartEntity(new ProgressListener() {
public void transferred(long num) {
// update the progress bar or whatever else you might want to do
}
});
如果您还没有任何类来实现
ProgressListener
接口,那么您需要自己构造该接口的实现。对于侦听器之类的对象,这通常是通过匿名内部类完成的
CountingMultipartEntity entity = new CountingMultipartEntity(new ProgressListener() {
@Override
public void transferred(long num) {
// update the progress bar or whatever else you might want to do
}
});
您应该将ProgressListener导入到要调用的类中
import com.blahblah.YourProjectName.CustomMultipartEntity.ProgressListener;
我正在使用一个名为“CustomMultipartEntity”的类似类,不要忘记更改它的名称
CustomMultipartEntity类实现为:
package com.blahblah.YourProjectName;
import java.io.FilterOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.Charset;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntity;
public class CustomMultipartEntity extends MultipartEntity
{
private final ProgressListener listener;
public CustomMultipartEntity(final ProgressListener listener)
{
super();
this.listener = listener;
}
public CustomMultipartEntity(final HttpMultipartMode mode, final ProgressListener listener)
{
super(mode);
this.listener = listener;
}
public CustomMultipartEntity(HttpMultipartMode mode, final String boundary, final Charset charset, final ProgressListener listener)
{
super(mode, boundary, charset);
this.listener = listener;
}
@Override
public void writeTo(final OutputStream outstream) throws IOException
{
super.writeTo(new CountingOutputStream(outstream, this.listener));
}
public static interface ProgressListener
{
void transferred(long num);
}
public static class CountingOutputStream extends FilterOutputStream
{
private final ProgressListener listener;
private long transferred;
public CountingOutputStream(final OutputStream out, final ProgressListener listener)
{
super(out);
this.listener = listener;
this.transferred = 0;
}
public void write(byte[] b, int off, int len) throws IOException
{
out.write(b, off, len);
this.transferred += len;
this.listener.transferred(this.transferred);
}
public void write(int b) throws IOException
{
out.write(b);
this.transferred++;
this.listener.transferred(this.transferred);
}
}
}
这是一个示例调用:
CustomMultipartEntity reqEntity = new CustomMultipartEntity(new ProgressListener() {
public void transferred(long num) {
if((int) ((num / (float) totalSize) * 100) > 0)
progressHandler(num);
}
});
我想知道这个监听器是什么?因为我得到了fileNotFound:(我有HttpClient 4,HttpMultipartMode mode参数对于HttpClient意味着什么?“如果您还没有实现ProgressListener接口的任何类,您需要自己构造它的实现。对于监听器之类的东西,这通常是通过匿名内部类来完成的。”我没有接口实现:(我从来没有在这个领域看到过任何示例。你能告诉我吗?请告诉我如何构造ProgressListener实现,因为我对代码样式感到困惑:(ProgressListener是一个内部接口,所以我可以把它变成一个外部接口吗?我不明白……你在你发布的代码中已经有了
ProgressListener
接口的定义。你可以使用普通的独立类、命名的内部类或匿名的内部类来实现它。关于usi的文章很多要了解这些,请参阅任何关于向Swing组件添加事件侦听器的文章