웹브라우저를 통하지 않고 자바 자체에서 파일 다운로드를 하는 예제입니다. Channels는 유틸리티 메소드로 ChannelStream에 필요한 작업들을 제공합니다. new Channel(InputStream in)은 인풋스트림(InputStream)을 새로운 ReadableByteChannel(채널)로 만들어주는데, Channel이란 하드웨어 장치, 파일, 네트워크 소켓 또는 하나 이상의 고유 한 I/O 작업을 수행 할 수 있는 프로그램 구성 요소와 같은 엔터티에 대한 열린 연결을 나타내는 것이라고 합니다. 파일을 주고받기 위한 일종의 통로(nexus)로 해석하면 되겠습니다. 파일 작성을 위한 스트림인 FileOutputStream에서 채널을 받은 다음(getChannel(), FileChannel 타입 반환) 채널의 transferForm 메소드를 사용해 파일을 rbc 채널로부터 읽어 FOS로 전송합니다.

참고: Channel, ReadableByteChannel, Channels

import java.io.FileOutputStream;
import java.net.URL;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;

public class FileDownload {

  public static void main(String[] args) {
    String address = "https://www.7-zip.org/a/7z1806-x64.exe";	// 주소 입력
    
    try {
      String fileName = address.substring(
          address.lastIndexOf("/") + 1, address.length());

      URL website = new URL(address);
      ReadableByteChannel rbc = Channels.newChannel(website.openStream());
      FileOutputStream fos = new FileOutputStream(fileName);
      
      fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);	// 처음부터 끝까지 다운로드
      fos.close();
      
      System.out.println("파일 다운로드되었음");
      
    } catch (Exception e) {
      e.printStackTrace();
    } 		
    
  }

}
파일 다운로드되었음