본문 바로가기

Program/Java

Java의 URL에서 파일 다운로드

Java의 URL에서 파일을 다운로드하는 방법에는 여러 가지가 있습니다. 이 게시물은 이를 달성하기 위해 사용 가능한 몇 가지 대안에 대한 개요를 제공합니다.

1. 사용 FileChannel.transferFrom() 방법

java.nio.channels.FileChannel Java의 클래스는 파일을 읽고, 쓰고, 매핑하고, 조작하기 위한 여러 메서드를 제공합니다. 그것은이다 transferFrom() 메소드는 주어진 읽을 수 있는 바이트 채널에서 이 채널의 파일로 바이트를 전송합니다. 소스 채널, 전송이 시작될 파일 내 위치, 전송될 최대 바이트 수의 세 가지 매개변수를 허용합니다.

열린 스트림과 채널을 닫는 것을 처리하는 Java 7 try-with-resource를 사용하여 아래에서 완전한 사용법을 보여줍니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
 
class Main
{
    public static void downloadFile(URL url, String outputFileName) throws IOException
    {
        try (InputStream in = url.openStream();
            ReadableByteChannel rbc = Channels.newChannel(in);
            FileOutputStream fos = new FileOutputStream(outputFileName)) {
            fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
        }
    }
 
    public static void main(String[] args) throws Exception {
        // `downloadFile()` 메소드 호출
    }
}

2. 사용 Files.copy() 방법

Java 7부터 다음을 사용할 수 있습니다. java.nio.file.Files.copy() 입력 스트림의 모든 바이트를 파일로 복사하는 메서드입니다. 읽을 입력 스트림과 파일 경로를 허용합니다. 또한 복사를 수행하는 방법을 지정할 수 있습니다. 이것은 try-with-resource 블록을 사용하여 아래에 설명되어 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import java.io.InputStream;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Paths;
 
class Main
{
    public static void downloadFile(URL url, String fileName) throws Exception {
        try (InputStream in = url.openStream()) {
            Files.copy(in, Paths.get(fileName));
        }
    }
    public static void main(String[] args) throws Exception {
        // `downloadFile()` 메소드 호출
    }
}

3. 일반 Java

일반 Java에서는 입력 스트림에서 파일을 바이트 단위로 읽고 바이트를 파일 출력 스트림에 쓸 수 있습니다. 이것은 아래의 간단한 코드로 변환됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import java.io.BufferedInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.IOException;
import java.net.URL;
 
class Main
{
    public static void downloadFile(URL url, String fileName) throws IOException {
        try (InputStream in = url.openStream();
                BufferedInputStream bis = new BufferedInputStream(in);
                FileOutputStream fos = new FileOutputStream(fileName)) {
 
            byte[] data = new byte[1024];
            int count;
            while ((count = bis.read(data, 0, 1024)) != -1) {
                fos.write(data, 0, count);
            }
        }
    }
 
    public static void main(String[] args) throws Exception {
        // `downloadFile()` 메소드 호출
    }
}

4. 아파치 커먼즈 IO 사용하기

Apache Commons IO 라이브러리를 사용할 수도 있습니다. FileUtils 클래스는 편리한 파일 조작 유틸리티를 제공합니다. FileUtils의 copyURLToFile() 메서드를 사용하여 URL 소스에서 지정된 파일 대상으로 바이트를 복사할 수 있습니다. 연결 및 읽기 제한 시간 매개변수와 함께 오버로드된 버전을 사용하는 것이 좋습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import org.apache.commons.io.FileUtils;
 
import java.io.File;
import java.io.IOException;
import java.net.URL;
 
class Main
{
    public static void downloadFile(URL url, String fileName) throws IOException {
        FileUtils.copyURLToFile(url, new File(fileName));
    }
 
    public static void main(String[] args) throws Exception {
        // `downloadFile()` 메소드 호출
    }
}

'Program > Java' 카테고리의 다른 글

If ObjectInputStream Package Name has been changed  (2) 2013.02.07
[JAVA] Comparator  (0) 2012.03.16
Eclipse Properites Editor  (0) 2012.01.05
Eclipse - .svn delete  (1) 2012.01.03
Compile recursively with javac  (1) 2011.12.30