표준 입출력 리다이렉팅

랏 뜨·2024년 12월 6일

🔎 Overview


 리다이렉팅 이라는 단어는 필자에게 있어서 익숙하면서도 생소한 단어이다.
굉장히 많이 보게 되는 단어임과 동시에, 리다이렉팅이라는 게 정확히 무엇을 의미하는지는 잘 모르기 때문이다.

 더 미룰 수 없어 표준 입출력 리다이렉팅 에 관해서 좀 더 공부해보기로 했다.


✒️ 표준 입출력 리다이렉팅

  • 프로그램의 표준 입력 과 표준 출력 , 그리고 표준 오류 스트림의 데이터를 다른 소스로 리다이렉트 하거나 다른 대상으로 보내는 것
  • 표준 입출력 스트림
    1. 표준 입력 (stdin) -> 일반적으로 키보드 입력을 통해 데이터를 받음
    2. 표준 출력 (stdout) -> 일반적인 출력 데이터를 화면(콘솔)에 출력
    3. 표준 오류 (stderr) -> 오류 메시지를 화면(콘솔)에 출력
  • By Redirect
    1. 입력 데이터 -> 다른 프로그램의 출력에서 받거나 파일에서 읽을 수 있음
    2. 출력 데이터 -> 다른 프로그램으로 전달하거나 파일로 저장할 수 있음
    3. 오류 메시지 -> 별도의 파일에 기록할 수도 있음

⛏️ 자바에서 표준 입출력 리다이렉팅 구현

  • 자바에서는 System 클래스의 setIn , setOut , setErr 메서드를 사용해서 표준 입출력 및 에러 스트림을 리다이렉팅 할 수 있음
try {
	// 표준 입력 리다이렉트
    // System.in
    // 키보드 입력이 아닌 inputFile의 값을 입력 데이터로 받음
	FileInputStream inputFile = new FileInputStream("input.txt");
    System.setIn(inputFile);
    
    // 표준 출력 리다이렉트
    // System.out
    // 출력을 화면(콘솔)로 받지 않고 outputFile에 저장
    String output = "output.txt";
    FileOutputStream outputFile = new FileOutputStream(output);
    PrintStream printOut = new PrintStream(outputFile);
    System.setOut(printOut)
    
    
    // 표준 오류 리다이렉트
    // System.err
    // 에러 메시지 출력을 errorFile로 리다이렉트해서 저장
    FileOutputStream errorFile = new FileOutputStream("error.log");
    PrintStream printErr = new PrintStream(errorFile);
    System.setErr(printErr);
    
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    String input = reader.readLine();	// input.txt 파일에 저장된 값을 읽어옴
    System.out.printf("입력 데이터 %s를 %s에 리다이렉팅 후 저장 : \n", input, output);	// input.txt 파일의 값을 읽어서 output.txt 파일에 저장
    
    // 강제로 오류 발생
    System.err.println("에러 메시지");	// error.log 에 메시지 기록
    
    // 출력을 다시 화면(콘솔)로 되돌림
    System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out)));
    } catch (IOException e) {
    	throw new RuntimeException(e.getMessage(), e);
    }
}
  • System.setInt(InputStream) 을 사용하여 표준 입력 스트림을 파일로 변경
    • 코드에서는 input.txt 파일을 읽는 FileInputStream 객체를 통해 입력을 처리
  • System.setOut(PrintStream) 을 사용하여 표준 출력 스트림을 파일로 변경
    • 코드에서는 FileOutputStream 객체를 PrintStream 의 매개변수로 주고, 이를 통해 output.txt 파일에 출력 데이터를 저장 (콘솔에 출력되지 않음)
  • System.setErr(PrintStream) 을 사용하여 표준 오류 스트림을 파일로 변경
    • 표준 출력 리다이렉트와 비슷
    • System.setOut 대신 System.setErr 를 사용
  • BufferedReader 를 통해 현재의 표준 입력 스트림인 input.txt 파일에서 데이터를 가져옴
  • FileOutputStream 에 파일 대신 FileDescriptor.out 을 매개변수로 주고, 이전과 동일한 방식으로 표준 출력을 다시 화면(콘솔)으로 변경

🤔 표준 입출력 리다이렉팅은 언제 사용하는 것이 좋을까

  • 데이터를 파일을 통해 처리해야 하는 프로그램
  • 오류 등의 로그를 파일에 저장하고 관리해야 할 때
  • 입출력 스트림을 네트워크 소켓이나 파이프와 연결하여 동적인 데이터의 흐름을 관리해야 할 때

참고) OpenAI. (2024).ChatGPT(4o)[Large language model].https://chatgpt.com/

profile
기록

0개의 댓글