CodeGym /Java Blog /무작위의 /자바 PrintStream 클래스
John Squirrels
레벨 41
San Francisco

자바 PrintStream 클래스

무작위의 그룹에 게시되었습니다
안녕! 오늘 우리는 Java PrintStream 클래스와 그것이 할 수 있는 모든 것에 대해 이야기할 것입니다. 실제로 PrintStream 클래스 의 두 가지 메서드에 이미 익숙합니다 . 그것들은 print()println() 인데, 여러분은 아마도 매일 사용할 것입니다 :) System.out 변수는 PrintStream 객체이기 때문에 System.out.println() 을 호출할 때 이 클래스의 메서드 중 하나를 호출하게 됩니다 .  PrintStream 클래스 의 일반적인 목적은 일부 스트림에 정보를 보내는 것입니다. PrintStream 클래스가 필요한 이유 - 1이 클래스에는 여러 생성자가 있습니다. 다음은 가장 일반적으로 사용되는 몇 가지입니다.
  • PrintStream(출력스트림 출력스트림)
  • PrintStream(파일 출력 파일)이 FileNotFoundException을 발생시킵니다.
  • PrintStream(String outputFileName)이 FileNotFoundException을 발생시킵니다.
예를 들어 출력 파일의 이름을 PrintStream 생성자에 전달할 수 있습니다. 또는 File 객체를 전달할 수 있습니다. 이것이 어떻게 작동하는지 알아보기 위해 몇 가지 예를 살펴보겠습니다.

import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.PrintStream; 

public class Main { 

   public static void main(String arr[]) throws FileNotFoundException 
   { 
       PrintStream filePrintStream = new PrintStream(new File("C:\\Users\\Username\\Desktop\\test.txt")); 

       filePrintStream.println(222); 
       filePrintStream.println("Hello world"); 
       filePrintStream.println(false); 

   } 
}
이 코드는 바탕 화면에 test.txt 파일을 만들고(아직 존재하지 않는 경우) 숫자, 문자열 및 부울을 순차적으로 씁니다. 프로그램을 실행한 후의 파일 내용은 다음과 같습니다.

222 
Hello world!
false
위에서 말했듯이 File 개체를 전달할 필요가 없습니다. 단순히 파일 경로를 생성자에 전달하는 것으로 충분합니다.

import java.io.FileNotFoundException; 
import java.io.PrintStream; 

public class Main { 

   public static void main(String arr[]) throws FileNotFoundException 
   { 
       PrintStream filePrintStream = new PrintStream("C:\\Users\\Username\\Desktop\\test.txt"); 

       filePrintStream.println(222); 
       filePrintStream.println("Hello world"); 
       filePrintStream.println(false); 
   } 
}
이 코드는 이전 코드와 동일합니다. 주목할 가치가 있는 또 다른 흥미로운 방법은 형식 문자열을 기반으로 출력을 생성하는 printf() 입니다. "형식 문자열"이란 무엇입니까? 예를 들어 보겠습니다.

import java.io.IOException; 
import java.io.PrintStream; 

public class Main { 

   public static void main(String[] args) throws IOException { 

       PrintStream printStream = new PrintStream("C:\\Users\\Steve\\Desktop\\test.txt");

       printStream.println("Hello!"); 
       printStream.println("I'm a robot!"); 

       printStream.printf("My name is %s. I am %d!", "Amigo", 18); 

       printStream.close(); 
   } 
}
여기에서 문자열에 로봇의 이름과 나이를 명시적으로 지정하는 대신 이 정보에 대한 자리 표시자를 %s%d 로 표시합니다 . 그리고 이를 대체할 데이터를 인수로 전달합니다. 우리의 경우 이것은 문자열 " Amigo "와 숫자 18입니다. 다른 자리 표시자 %b 를 만들고 다른 인수를 전달할 수 있습니다. 이것이 왜 필요한가요? 무엇보다도 더 큰 유연성을 위해. 프로그램에서 환영 메시지를 자주 표시하도록 요구하는 경우 각 새 로봇에 필요한 텍스트를 수동으로 입력해야 합니다. 모든 사람이 이름과 나이가 다르기 때문에 이 텍스트를 상수로 만들 수도 없습니다! 그러나이 새로운 방법을 사용하면 인사말을 상수로 분리하고 필요한 경우 printf() 메서드에 전달된 인수를 간단히 변경할 수 있습니다.

import java.io.IOException; 
import java.io.PrintStream; 

public class Main { 

   private static final String GREETINGS_MESSAGE = "My name is %s. I am %d!"; 

   public static void main(String[] args) throws IOException { 

       PrintStream printStream = new PrintStream("C:\\Users\\Steve\\Desktop\\test.txt"); 

       printStream.println("Hello!"); 
       printStream.println("We are robots!"); 


       printStream.printf(GREETINGS_MESSAGE, "Amigo", 18); 
       printStream.printf(GREETINGS_MESSAGE, "R2-D2", 35); 
       printStream.printf(GREETINGS_MESSAGE, "C-3PO", 35); 

       printStream.close(); 
   } 
} 

System.in 교체

이 단원에서는 "시스템과 싸우고" 시스템 출력을 원하는 위치로 리디렉션하기 위해 System.in 변수를 대체하는 방법을 배웁니다. System.in이 무엇인지 잊어버릴 수 있지만 CodeGym 학생은 이 구조를 절대 잊지 못할 것입니다.

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.in ( System.out  과 마찬가지로 )은 System 클래스 의 정적 변수입니다 . 그러나 System.out 과 달리 다른 클래스, 즉 InputStream 을 참조합니다 . 기본적으로 System.in은 시스템 장치(키보드)에서 데이터를 읽는 스트림입니다. 그러나 System.out 과 마찬가지로 키보드를 데이터 소스로 대체할 수 있습니다. 원하는 곳 어디에서나 데이터를 읽을 수 있습니다! 예를 살펴보겠습니다.

import java.io.*; 

public class Main { 

   public static void main(String[] args) throws IOException { 

       String greetings = "Hi! My name is Amigo!\nI'm learning Java on the CodeGym website.\nOne day I will become a cool programmer!\n"; 
       byte[] bytes = greetings.getBytes(); 

       InputStream inputStream = new ByteArrayInputStream(bytes); 

       System.setIn(inputStream); 

       BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); 

       String str; 

       while ((str = reader.readLine())!= null) { 

           System.out.println(str); 
       } 

   } 
}
그래서 우리는 무엇을 했습니까? System.in은 일반적으로 키보드에 바인딩됩니다. 그러나 우리는 키보드에서 데이터를 읽고 싶지 않습니다. 일반 문자열에서 데이터를 읽도록 합시다! 문자열을 만들고 바이트 배열로 가져왔습니다. 바이트가 필요한 이유는 무엇입니까? 문제는 InputStream 이 추상 클래스이므로 인스턴스를 직접 만들 수 없다는 것입니다. 우리는 그 자손 중 하나를 선택해야 합니다. 예를 들어 ByteArrayInputStream 을 선택할 수 있습니다 . 간단하고 이름만으로도 작동 방식을 알 수 있습니다. 데이터 소스는 바이트 배열입니다. 그래서 우리는 바이트 배열을 만들고 데이터를 읽을 스트림 의 생성자에게 전달합니다 . 이제 모든 것이 준비되었습니다! 이제 System.setIn()을 사용하기만 하면 됩니다.in 변수 의 값을 명시적으로 설정하는 메서드입니다 . out 이 없으면 변수의 값을 직접 설정하는 것도 불가능하다는 점을 기억할 것입니다. setOut() 메서드를 사용해야 했습니다. InputStream을 System.in 변수 에 할당한 후 목적을 달성했는지 확인하려고 합니다. 우리의 오랜 친구인 BufferedReader가 여기서 우리를 도와줍니다. 일반적으로 이 코드는 IntelliJ IDEA에서 콘솔을 연 다음 키보드에서 입력한 데이터를 읽습니다.

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); 

       String str; 

       while ((str = reader.readLine())!= null) { 

           System.out.println(str); 
       }
그러나 이제 실행하면 문자열이 콘솔에 표시되는 것을 볼 수 있습니다. 키보드에서 읽을 수 없습니다. 데이터 소스를 교체했습니다. 더 이상 키보드가 아니라 우리의 현입니다! 간단합니다 :) 오늘 수업에서 우리는 새로운 클래스를 알게 되었고 I/O 작업을 위한 작고 새로운 핵을 탐구했습니다. 이제 코스로 돌아가서 몇 가지 작업을 완료할 시간입니다 :) 다음 레슨에서 뵙겠습니다!
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION