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;
}
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.