1. URL클래스

우리는 I/O 스트림 작업을 연구했습니다. 우리는 파일 작업을 공부했습니다. 다음에는 무엇을 공부해야 할까요? 인터넷을 포함한 네트워크 작업은 어떻습니까? 유망한 것 같죠?

Java에서 인터넷 작업은 파일 작업보다 어렵지 않습니다. 글쎄, 아마도 조금.

인터넷 리소스로 작업하기 위해 Java에는 특수 클래스인 URL. 지금 보시다시피 의자처럼 간단합니다.

웹 페이지 가져오기

인터넷에서 텍스트 파일을 다운로드하고 그 내용을 화면에 표시하려면 몇 줄의 코드를 작성해야 한다고 생각하십니까? 10? 100? 1000? 아니면 5?

암호 메모
URL url = new URL("https://codegym.cc");
InputStream input = url.openStream();
byte[] buffer = input.readAllBytes();
String str = new String(buffer);
System.out.println(str);
페이지에 대한 경로로 URL 객체 생성 URL 객체에서
가져오기 모든 바이트를 읽고 바이트 배열 반환 배열을 문자열로 변환 문자열 표시 InputStream


HTML 파일의 내용이 화면에 표시됩니다.

콘솔 출력
<!DOCTYPE html><html lang="ru" class="light"><head>
    <meta charset="utf-8″>
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1″>
    ...

File및 작업 비교URL

URLFileor 와 유사 Path하지만 Path리소스 경로를 파일 시스템에 저장하고 URL리소스 경로를 인터넷에 저장합니다.

InputStream메소드 에 대한 단일 호출 덕분에 객체를 얻을 때 모든 마법이 일어납니다 openStream(). 이것은 평범한 물체이며 우리는 이미 내부와 외부를 연구했습니다. 객체 를 얻은 후에 모든 것이 명확해집니다 InputStream. 결국 우리는 이미 데이터를 얻는 방법을 알고 있습니다.

살펴보십시오. 처음 두 줄만 다르고 약간만 다릅니다. 이제 표준화와 데이터 스트림 체인 작업의 이점을 확인할 수 있습니다.

인터넷 작업 파일 작업
URL url = new URL("https://codegym.cc");
InputStream input = url.openStream();

byte[] buffer = input.readAllBytes();
String str = new String(buffer);
System.out.println(str);
File file = new File("c:\\readme.txt");
InputStream input = new FileInputStream(file);

byte[] buffer = input.readAllBytes();
String str = new String(buffer);
System.out.println(str);


2. URLConnection클래스

단순히 인터넷에서 데이터를 읽는 것 외에도 데이터를 업로드할 수도 있습니다. 데이터를 업로드하는 것은 데이터를 읽는 것보다 훨씬 더 복잡합니다. 몇 가지 방법이 더 필요합니다. 예를 들어:

암호 메모
URL url = new URL("https://codegym.cc");
URLConnection connection = url.openConnection();

// Get a stream for sending data
OutputStream output = connection.getOutputStream();
output.write(1); // Send data

// Get a stream for reading data
InputStream input = connection.getInputStream();
int data = input.read(); // Read data
페이지 경로가 포함된 URL 객체 생성 양방향
연결 생성


출력 스트림 가져오기
데이터 넣기


입력 스트림 가져오기
데이터 읽기

여기서는 더 이상 메서드를 호출하지 않습니다 url.openStream(). 대신 더 긴 경로를 택합니다.

  • URLConnection.openConnection()먼저 방법을 사용하여 안정적인 양방향 연결을 설정합니다.
  • connection.getOutputStream()그런 다음 메서드를 사용하여 데이터를 보내고 서버로 데이터를 보내는 스트림을 얻습니다.
  • 그런 다음 메소드를 사용하여 데이터를 읽기 위한 스트림을 얻고 connection.getInputStream()여기에서 데이터 읽기를 시작합니다.

자원 관리

엄밀히 말하면 안전한 처리를 위해 모든 스트림을 블록으로 묶어야 합니다 try-with-resources. InputStream그리고 맨손 으로 OutputStream더 편리한 것으로 포장해도 아프지 않을 것입니다 . 예를 들어, PrintStreamBufferedReader.

이 모든 작업을 수행하면 코드는 다음과 같이 표시됩니다.

URL url = new URL("https://codegym.cc");
URLConnection connection = url.openConnection();

// Send data
try (OutputStream output = connection.getOutputStream();
   PrintStream sender = new PrintStream(output))
{
   sender.println("Hello");
}

// Read data
try(InputStream input = connection.getInputStream();
   BufferedReader reader = new BufferedReader(new InputStreamReader(input)))
{
   while (reader.ready())
      System.out.println(reader.readLine());
}

3. 네트워크 작업의 예

인터넷에서 무언가를 다운로드합시다. 다운로드만 하는 것이 아니라 디스크에 저장합니다.

예를 들어 구글 홈페이지의 이미지를 디스크에 저장하는 프로그램을 작성해 보자.

원칙적으로 여기에는 복잡한 것이 없습니다. 가장 간단한 형태로 이 코드는 다음과 같습니다.

디스크에 파일 저장
String image = "https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png";
URL url = new URL(image);
InputStream input = url.openStream();

Path path = Path.of("c:\\GoogleLogo.png");
Files.copy(input, path);

처음 세 줄의 도움으로 우리는 사진에서 인터넷 리소스로부터 데이터 스트림을 받습니다.

네 번째 줄에서는 이미지를 저장할 파일의 이름을 만듭니다. 이름은 무엇이든 될 수 있지만 파일 확장자는 인터넷에 있는 사진의 확장자와 일치해야 합니다. 이렇게 하면 로컬 이미지 뷰어가 올바르게 열 수 있습니다.

마지막으로 마지막 줄은 Files클래스의 copy메서드 중 하나입니다. 수업 Files에는 몇 가지가 있습니다. 우리가 사용한 이 메서드는 첫 번째 매개변수로 바이트 스트림( InputStream)을 사용하고 두 번째 매개변수로 데이터를 작성해야 하는 파일 이름을 사용합니다.

이론적으로 URL이미지의 가 짧으면 이 코드는 한 줄로 작성할 수도 있습니다.

스트림에서 파일로 데이터 복사
Files.copy(
   new URL("https://www.google.com/logo.png").openStream(),
   Path.of("c:\\GoogleLogo.png")
);

물론 이렇게 작성할 필요는 없지만 이 예제는 Java에서 I/O 스트림이 얼마나 편리하고 강력한지 보여줍니다.