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 |