본문 바로가기
Java

[Java] 입출력(I/O) 정리

by 옹알이옹 2023. 8. 24.
목차

1. 입/출력이란

2. Stream이란

3. I/O Stream 예제

3-1. 사용자의 입력값을 받아 파일을 생성

3-2. 사용자의 입력값을 받아 응답 본문에 작성

 


 

 1. 입/출력이란

입출력은 컴퓨터 프로그램과 내부/외부 환경 간의 데이터 전송을 의미하는데 예를 들어 마우스와 키보드를 통해 어떤 명령을 입력하면 화면으로 출력이 되고 한 서버에서 요청을 하면 데이터를 전송(출력) 해주기도 한다.

 

Java에서는 입출력(I/O)이라는 것을 보통 처음 접하게 되는 것이 파일에 처리를 할 때이다.

그때 사용하는 것이 InputStream과 OutputStream인데 그것을 이해하고 사용하기 위해서는 Stream이 무엇인지 알아야 하는데 Stream과 파일 처리에 대한 것은 뒷부분에서 자세히 다룬다.


 

 2. Stream이란

스트림이란 데이터가 이동하는 통로라고 이해하면 쉽다. 우리가 통신을 할 때 모든 것은 스트림을 통해 이동을 하게 되는데

단방향으로만 이동하기 때문에 입력 통로와 출력 통로가 각각 존재한다. 그리고 사용한 뒤 꼭 스트림을 닫아주어야 한다.

 

예를 들어 HTTP 통신을 통해 HTML 페이지를 사용자에게 제공할 때도 웹 서버에서는 스트림을 사용한다.

해당 HTML이 리턴될 때 데이터가 바이트 형태로 변환이 되고 출력 스트림에 쭉 나열되게 된다.

그렇게 나열된 데이터가 세그먼트로 잘게 쪼개져서 패킷에 담긴 뒤 인터넷을 통해 Client에게 전달되게 되는 것이다.

Stream에 대해 다른 식으로 말하자면 데이터가 길게 이어진 형태라고도 말할 수 있는 것이다.

 

그런데 여기서 Html을 리턴해주는 웹 서버를 구성했던 사람은 의아함을 느낄 수 있다.
왜냐하면 스트림을 따로 열고 닫아주는 행위를 한적 없기 때문인데 그 이유는 스프링이 내부적으로 처리해 주기 때문이다.


 

 3.  I/O Stream 예제

 

3-1. 사용자의 입력값을 받아 파일을 생성

public void FileTest(HttpServletResponse res) throws IOException {
        String path = "C:\\Users\\user\\Desktop\\helloDevTeam\\src\\main\\resources\\static\\images\\test.txt";

        InputStream is = System.in;
        OutputStream os = new FileOutputStream(path);

        int readBytes;

        try {

            while ((readBytes = is.read()) != -1){
                os.write(readBytes);
            }

        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            is.close();
            os.close();
        }
    }

Java에서 파일에 대한 처리를 하기 위해서는 Input/Output Stream을 이용해야 한다.

  • 먼저 path에서 파일을 실제 생성 할 경로를 지정한다.
  • System.in을 통해 콘솔에서 사용자에게 입력값을 받게 한 뒤 InputStream에 데이터를 쌓는다.
  • Ctrl + D 나 Ctrl + Z를 눌러 입력을 종료한다.
  • OutputStream의 구현체 중 하나인 FileOutputStream을 통해 해당 경로에 파일을 생성한다. (현재는 빈 파일)
  • 반복문을 돌며 사용자의 입력값이 쌓여 있는 InputStream을 읽고 OutputStream의 write를 사용하여 생성한 파일에 읽은 데이터를 쓴다.
  • InputStrea은 1Byte씩 읽으며 모든 값을 읽으면 -1을 리턴한다. 동일하게 OutputStream도 1Byte씩 쓴다.
  • 작업이 끝나면 Input, Output Stream을 닫아준다.

콘솔로 입력 받기생성된 파일 확인

실제 입력값을 받는 부분과 생성된 파일의 모습

 

3-2. 사용자의 입력값을 받아 응답 본문에 작성

public void FileTest(HttpServletResponse res) throws IOException {
    String path = "C:\\Users\\user\\Desktop\\helloDevTeam\\src\\main\\resources\\static\\images\\test.txt";

    InputStream is = System.in;
    OutputStream os = res.getOutputStream();

    int readBytes;

    try {

        while ((readBytes = is.read()) != -1){
            os.write(readBytes);
        }

    } catch (IOException e) {
        throw new RuntimeException(e);
    } finally {
        is.close();
        os.close();
    }
}

 

OutputStream os = res.getOutputStream();

바로 위의 예제와 다른 것은 이 부분밖에 없다.
해당 객체도 동일하게 OutputStream의 구현체이지만 FileOutputStream과 달리 파일을 생성하고 작성하는 것이 아닌

Reponse객체 본문에 InputStream의 값을 작성하여 리턴하는 것이다.

콘솔에 입력 받기postman 결과 확인

이렇듯 InputStream과 OutputStream을 통해 간단한 테스트를 해보았고, 다양한 형태로 사용할 수 있다.

반응형

'Java' 카테고리의 다른 글

(Java) 패키지 양방향 의존 문제점과 해결 방안  (0) 2024.05.11
Session과 JSESSIONID  (2) 2023.11.20
객체지향 캡슐화 이해하기  (0) 2023.09.15
[Java] Generic 사용법  (0) 2023.08.06