[java] Java를 사용하여 인터넷에서 파일을 다운로드하고 저장하는 방법은 무엇입니까?

http://www.example.com/information.asp디렉토리에 파일 을 가져 와서 저장해야하는 온라인 파일 (예 :)이 있습니다. 온라인 파일 (URL)을 한 줄씩 잡고 읽는 몇 가지 방법이 있지만 Java를 사용하여 파일을 다운로드하고 저장하는 방법이 있습니까?



답변

부여 자바 NIO을 시도 :

URL website = new URL("http://www.website.com/information.asp");
ReadableByteChannel rbc = Channels.newChannel(website.openStream());
FileOutputStream fos = new FileOutputStream("information.html");
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);

사용 transferFrom()하다 잠재적으로 훨씬 더 효율적인 소스 채널로부터 판독하고,이 채널을 쓰는 간단한 루프보다. 많은 운영 체제는 실제로 복사하지 않고 소스 채널에서 파일 시스템 캐시로 바이트를 직접 전송할 수 있습니다.

자세한 내용은 여기를 참조 하십시오 .

참고 : transferFrom의 세 번째 매개 변수는 전송할 최대 바이트 수입니다. Integer.MAX_VALUE최대 2 ^ 31 바이트를 전송하고 최대 2 ^ Long.MAX_VALUE63 바이트를 허용합니다 (존재하는 파일보다 큼).


답변

아파치 사용 한 줄의 코드만으로 commons-io를 .

FileUtils.copyURLToFile(URL, File)


답변

더 간단한 nio 사용법 :

URL website = new URL("http://www.website.com/information.asp");
try (InputStream in = website.openStream()) {
    Files.copy(in, target, StandardCopyOption.REPLACE_EXISTING);
}


답변

public void saveUrl(final String filename, final String urlString)
        throws MalformedURLException, IOException {
    BufferedInputStream in = null;
    FileOutputStream fout = null;
    try {
        in = new BufferedInputStream(new URL(urlString).openStream());
        fout = new FileOutputStream(filename);

        final byte data[] = new byte[1024];
        int count;
        while ((count = in.read(data, 0, 1024)) != -1) {
            fout.write(data, 0, count);
        }
    } finally {
        if (in != null) {
            in.close();
        }
        if (fout != null) {
            fout.close();
        }
    }
}

아마도이 방법의 외부에서 예외를 처리해야합니다.


답변

오래된 질문이지만 올바르게 닫힌 리소스가있는 간결하고 읽기 쉬운 JDK 전용 솔루션입니다.

public static void download(String url, String fileName) throws Exception {
    try (InputStream in = URI.create(url).toURL().openStream()) {
        Files.copy(in, Paths.get(fileName));
    }
}

두 줄의 코드로 종속성이 없습니다.


답변

파일을 다운로드하려면 어떤 방식 으로든 파일을 읽어야합니다. 라인 단위 대신 스트림에서 바이트 단위로 읽을 수 있습니다.

BufferedInputStream in = new BufferedInputStream(new URL("http://www.website.com/information.asp").openStream())
    byte data[] = new byte[1024];
    int count;
    while((count = in.read(data,0,1024)) != -1)
    {
        out.write(data, 0, count);
    }


답변

사용하는 경우 Java 7+인터넷에서 파일을 다운로드하는 특정 디렉토리에 저장 사용을 다음과 같은 방법 :

private static Path download(String sourceURL, String targetDirectory) throws IOException
{
    URL url = new URL(sourceURL);
    String fileName = sourceURL.substring(sourceURL.lastIndexOf('/') + 1, sourceURL.length());
    Path targetPath = new File(targetDirectory + File.separator + fileName).toPath();
    Files.copy(url.openStream(), targetPath, StandardCopyOption.REPLACE_EXISTING);

    return targetPath;
}

여기에 설명서가 있습니다 .