如何使用可能是内部类,刚学java 15C

package downutil;

import java.net.URL;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;

import java.lang.Thread;
import org.omg.CORBA_2_3.portable.InputStream;

public class DownUtil {
private String path;
private String targetFile;
private int threadNum;
private DownThread[] threads;
private int fileSize;

public DownUtil(String path, String targetFile, int threadNum) {
    this.path = path;
    this.threadNum = threadNum;

    //此处DownThread类不能用,以下如此,亦不能实例化
    threads = (DownThread[]) new DownThread(threadNum);


    this.targetFile = targetFile;
}

public void download() throws Exception {
    URL url = new URL(path);
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    conn.setConnectTimeout(5 * 1000);
    conn.setRequestMethod("GET");
    conn.setRequestProperty("Accept",
            "image/gif,image/jpeg,image/pjpeg,image/pjpeg," + "application/x-shockwave-falsh,application/xaml+xml,"
                    + "application/vnd.ms-xpsdocument,application/x-ms-xbap,"
                    + "application/x-ms-application,application/vnd.ms-excel,"
                    + "application/vnd.ms-powerpoint,application/msword,*/*");
    conn.setRequestProperty("Accept-Language", "zh-CN");
    ;
    conn.setRequestProperty("Charset", "UTF-8");
    conn.setRequestProperty("Connection", "Keep-Alive");

    fileSize = conn.getContentLength();
    conn.disconnect();
    int currentPartSize = fileSize / threadNum + 1;
    RandomAccessFile file = new RandomAccessFile(targetFile, "rw");
    file.setLength(fileSize);
    ;
    file.close();
    for (int i = 0; i < threadNum; i++) {
        int startPos = i * currentPartSize;
        RandomAccessFile currentPart = new RandomAccessFile(targetFile, "rw");
        currentPart.seek(startPos);
        ;

        //此处如此DownTread
        threads[i] = new DownThread(startPos, currentPartSize, currentPart);
        ((Thread) threads[i]).start();
    }
}

public double getCompleteRate() {
    int sumSize = 0;
    for (int i = 0; i < threadNum; i++) {

    //此处length报错,不知啥问题
        sumSize += threads[i].length;
    }

    return sumSize * 1.0 / fileSize;

//此处DownThread不知啥问题
private class DownThread extends Thread {
private int startPos;
private int currentPartSize;
private RandomAccessFile currentPart;

        public int length;

        public DownThread(int startPos, int currentPartSize, RandomAccessFile currentPart) {
            this.startPos = startPos;
            this.currentPartSize = currentPartSize;
            this.currentPart = currentPart;
        }

        public void run() {
            try {
                URL url = new URL(path);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setConnectTimeout(5 * 1000);
                conn.setRequestMethod("GET");
                conn.setRequestProperty("Accept",
                        "image/gif,image/jpeg,image/pjpeg,image/pjpeg,"
                                + "applicaton/x-shockwave-flash,application/xaml+xml,"
                                + "spplication/vnd.ms-xpsdocument,application/x-ms-xbap,"
                                + "application/x-ms-application,application/vnd.ms-excel,"
                                + "appplication/vnd.ms-powerpoint,application/mswerd,*/*");
                conn.setRequestProperty("Accept-Language", "zh-CN");
                conn.setRequestProperty("Charset", "UTF-8");
                java.io.InputStream inStream = conn.getInputStream();
                inStream.skip(this.startPos);
                byte[] buffer = new byte[1024];
                int hasRead = 0;
                while (length < currentPartSize && (hasRead = inStream.read(buffer)) != -1)
                    ;
                {
                    currentPart.write(buffer, 0, hasRead);
                    length += hasRead;
                    currentPart.close();
                    inStream.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }

        };
    }
}

public static class MultiThreadDown {
    public static void main(String[] args) throws Exception {
        final DownUtil downUtil = new DownUtil(
                "http://www.crazyit.org/" + "attachments/month_1403/1403202355ff6cc9a4fbf6f14a.png", "ios.png", 4);
        downUtil.download();
        new Thread(() -> {
            while (downUtil.getCompleteRate() < 1) {
                System.out.println("已完成:" + downUtil.getCompleteRate());
                try {
                    Thread.sleep(1000);
                } catch (Exception ex) {
                }
            }
        }).start();
    }
}

}

2个回答

1) new DownThread(threadNum)返回的是一个类的实例,不是实例数组,想要实现一次创建多个对象的数组,你应该再写个工厂函数;
2)DownThread类的构造函数参数是DownThread(int startPos, int currentPartSize, RandomAccessFile currentPart) ,应该是说从startPos这个位置开始下载,不是线程数量threadNum;
3)我理解的是DownThread类从指定的位置进行下载,用户应该把下载文件分成多份,创建多个DownThread类的实例,每个实例下载一份;

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐