Java 멀티스레드 파일 다운로드를 위한 코드 예

Java는 다중 스레드 파일 다운로드 방향을 구현합니다.
1. 기본적인 사고방식은 파일을 세그먼트 절단, 세그먼트 전송, 세그먼트 저장하는 것이다.
2. 세그먼트 절단은 HttpUrlConnection 대상에 사용되는 setRequestProperty("Range", "bytes="+ start + "-"+ end) 방법입니다.
3. 세그먼트 전송은 HttpUrlConnection 객체에 대한 getInputStream() 메서드를 사용합니다.
4. RandomAccessFile에 사용되는 seek(int start) 방법을 세그먼트로 저장합니다.
5. 지정된 길이의 스레드 탱크를 만들고 순환적으로 스레드를 만들고 다운로드 작업을 수행합니다. 
우선, 우리는 먼저 방법을 써야 한다. 방법의 매개 변수는 URL 주소, 저장된 파일 주소, 절단된 파일의 시작 위치와 끝 위치를 포함한다. 그러면 우리는 세그먼트 파일을 로컬로 다운로드할 수 있다.그리고 이 방법은run방법이라면, 우리가 라인을 시작할 때 직접 이 방법을 실행할 것이다.

public class DownloadWithRange implements Runnable
  {
    private String urlLocation;

    private String filePath;

    private long start;

    private long end;

    DownloadWithRange(String urlLocation, String filePath, long start, long end)
    {
      this.urlLocation = urlLocation;
      this.filePath = filePath;
      this.start = start;
      this.end = end;
    }

    @Override
    public void run()
    {
      try
      {
        HttpURLConnection conn = getHttp();
        conn.setRequestProperty("Range", "bytes=" + start + "-" + end);

        File file = new File(filePath);
        RandomAccessFile out = null;
        if (file != null)
        {
          out = new RandomAccessFile(file, "rwd");
        }
        out.seek(start);
        InputStream in = conn.getInputStream();
        byte[] b = new byte[1024];
        int len = 0;
        while ((len = in.read(b)) != -1)
        {
          out.write(b, 0, len);
        }
        in.close();
        out.close();
      }
      catch (Exception e)
      {
        e.getMessage();
      }

    }

    public HttpURLConnection getHttp() throws IOException
    {
      URL url = null;
      if (urlLocation != null)
      {
        url = new URL(urlLocation);
      }
      HttpURLConnection conn = (HttpURLConnection) url.openConnection();
      conn.setReadTimeout(5000);
      conn.setRequestMethod("GET");

      return conn;
    }

  }

그리고 우리는 스레드 탱크를 만듭니다. 스레드 탱크의 길이는 사용자 정의할 수 있습니다. 그리고 반복적으로 스레드를 만들어서 요청을 실행합니다. 모든 스레드의 요청 시작 위치와 끝 위치가 다르고 로컬에 저장된 파일의 시작 위치와 요청 시작 위치가 같기 때문에 다중 스레드 다운로드를 실현할 수 있습니다.

public class DownloadFileWithThreadPool
{
  public void getFileWithThreadPool(String urlLocation,String filePath, int poolLength) throws IOException
  {
    Executor threadPool = Executors.newFixedThreadPool(poolLength);
    
    long len = getContentLength(urlLocation);
    for(int i=0;i<poolLength;i++)
    {
      long start=i*len/poolLength;
      long end = (i+1)*len/poolLength-1;
      if(i==poolLength-1)
      {
        end =len;
      }
      DownloadWithRange download=new DownloadWithRange(urlLocation, filePath, start, end);
      threadPool.execute(download);
    }
  }

  public static long getContentLength(String urlLocation) throws IOException
  {
    URL url = null;
    if (urlLocation != null)
    {
      url = new URL(urlLocation);
    }
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    conn.setReadTimeout(5000);
    conn.setRequestMethod("GET");
    long len = conn.getContentLength();

    return len;
  }

이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.

좋은 웹페이지 즐겨찾기