ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] 13주차 과제 : I/O
    Java/온라인 자바 스터디 2021. 7. 4. 16:35
    반응형


    목표

    자바의 Input과 Ontput에 대해 학습하세요.


    학습할 것 (필수)

    • 스트림 (Stream) / 버퍼 (Buffer) / 채널 (Channel) 기반의 I/O
    • InputStream과 OutputStream
    • Byte와 Character 스트림
    • 표준 스트림 (System.in, System.out, System.err)
    • 파일 읽고 쓰기

     

    스트림 (Stream) / 버퍼 (Buffer) / 채널 (Channel) 기반의 I/O 

    스트림(Stream) 기반의 I/O 
    스트림은 단일 방향의 연속적인 데이터 흐름을 표현하는 개념입니다. 자바에서는 데이터를 바이트 단위로 흘려보내는 InputStream과 OutputStream이 있습니다. 문자 데이터를 흘려보내는 Reader와 Writer도 있습니다. 이는 저수준 I/O 작업을 수행합니다.

    버퍼(Buffer) 기반의 I/O 
    자바의 java.nio 패키지는 채널(Channel)과 버퍼(Buffer)를 통해 블로킹되지 않는 입출력을 지원하는 클래스를 제공합니다. 버퍼는 기본적으로 블록 단위의 데이터를 저장하는 메모리 영역입니다. 데이터를 버퍼에 넣어 놓고(high cost가 발생하는 I/O를 몰아서 처리함으로써) 한 번에 입출력의 성능을 향상시킬 수 있습니다.

    채널(Channel) 기반의 I/O 
    채널은 스트림과 달리 양방향 통신을 표현합니다. 따라서 파일, 소켓 등에서 입출력을 동시에 진행할 수 있습니다. 또한, 채널은 직접적으로 버퍼와 상호작용하여 높은 성능을 얻을 수 있습니다.

     

    InputStream과 OutputStream 

    InputStream

    InputStream은 프로그램에 데이터를 입력하기 위한 스트림입니다. 이는 바이트 기반의 스트림으로, 바이트의 흐름을 처리합니다. 주로 파일에서 데이터를 읽거나 네트워크 연결을 통해 데이터를 받을 때 사용됩니다.

    try (InputStream input = new FileInputStream("input.txt")) {
       int data = input.read();
       while (data != -1) {
          Systehttp://m.out.print((char) data);
          data = input.read();
       }
    }
    catch (IOException e) {
       e.printStackTrace();
    }

    위의 코드는 "input.txt" 파일 내용을 한 바이트씩 읽어서 출력하는 예제입니다. read() 메소드는 파일의 끝에 도달하면 -1을 반환합니다.

    OutputStream
    반면, OutputStream은 프로그램에서 데이터를 출력하기 위한 스트림입니다. OutputStream 역시 바이트 기반의 스트림으로, 바이트 단위로 데이터를 보냅니다.

    try (OutputStream output = new FileOutputStream("output.txt")) {
       String data = "Hello, World!";
       output.write(data.getBytes());
    }
    catch (IOException e) {
       e.printStackTrace();
    }

    위의 코드는 "Hello, World!" 라는 문자열을 바이트 배열로 변환한 후 "output.txt" 파일에 쓰는 예제입니다.


    Byte와 Character 스트림

    Byte 스트림
    바이트 스트림은 8비트 바이트 단위로 데이터를 전송하는 스트림입니다. 바이트 단위로 데이터를 입력하고 출력하기 때문에 텍스트 뿐만 아니라 이미지, 동영상, 오디오 파일 등 모든 종류의 데이터를 전송할 수 있습니다.
    바이트 스트림에서 가장 중요한 클래스들은 InputStream과 OutputStream이며 그것들은 모든 바이트 입력 및 출력 클래스의 슈퍼 클래스입니다. 이들은 바이트를 읽고 쓰는데 사용되며, 대표적으로 FileInputStream과 FileOutputStream이 있습니다.

    try (InputStream input = new FileInputStream("image.jpg")) {
       int byteData = input.read();
       while (byteData != -1) {
          // byteData를 처리하는 코드
          byteData = input.read();
       }
    } catch (IOException e) {
       e.printStackTrace();
    }

    위 코드는 'image.jpg'라는 이미지 파일을 바이트 단위로 읽고 이를 처리하는 예시입니다.

    Character 스트림
    캐릭터 스트림은 16비트 유니코드 문자 단위로 데이터를 전송하는 스트림입니다. 따라서 텍스트 데이터를 처리할 때 주로 사용됩니다. 텍스트 파일이나 문자열 데이터를 처리할 때 캐릭터 스트림으로 처리하면 유니코드 기반의 문자 체계를 쉽게 다룰 수 있습니다.
    캐릭터 스트림에서 가장 중요한 클래스들은 Reader와 Writer입니다. 이들은 모든 캐릭터 입력 및 출력 클래스의 슈퍼 클래스입니다. 대표적으로 FileReader와 FileWriter가 있습니다.

    try (Reader reader = new FileReader("file.txt")) {
       int charData = reader.read();
       while (charData != -1) {
          // charData를 처리하는 코드
          charData = reader.read();
       }
    } catch (IOException e) {
       e.printStackTrace();
    }

    위 코드는 'file.txt'라는 텍스트 파일을 문자 단위로 읽고 이를 처리하는 예시입니다.


    표준 스트림 (System.in, System.out, System.err) 

    System.in
    System.in은 표준 입력 스트림으로, 기본적으로 키보드 입력을 위해 사용됩니다. System.in은 InputStream의 인스턴스로, 바이트 스트림입니다. 다음 코드는 System.in을 사용한 예제입니다.

    try (InputStreamReader isr = new InputStreamReader(System.in)) {
        int data = isr.read();
        while (data != -1) {
            Systehttp://m.out.print((char) data);
            data = isr.read();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

    입력 스트림 리더(InputStreamReader)를 사용하여 System.in으로부터 문자를 읽어들입니다.

    System.out
    System.out은 표준 출력 스트림으로, 기본적으로 콘솔에 출력할 때 사용됩니다. System.out은 PrintStream의 인스턴스로, 바이트 스트림에 속합니다. System.out.println("Hello, World!") 같은 코드로 가장 많이 볼 수 있습니다.

    System.err
    System.err은 표준 에러 스트림으로, 기본적으로 에러 메시지를 출력할 때 사용됩니다. System.err 역시 PrintStream의 인스턴스입니다. System.err.println("An error occurred!") 같은 코드로 에러 메시지를 출력할 수 있습니다.


    파일 읽고 쓰기

    자바에서 파일을 읽고 쓰는 방법은 여러 가지가 있는데, 가장 기본적인 방법으로 FileInputStream과 FileOutputStream, 그리고 FileReader와 FileWriter가 있습니다.

    FileInputStream과 FileOutputStream
    FileInputStream과 FileOutputStream은 바이트 기반의 입출력 스트림입니다. 따라서 텍스트뿐만 아니라 이미지나 동영상 등의 바이너리 데이터를 처리할 때 사용합니다.


    파일 읽기 예시

    try (FileInputStream fis = new FileInputStream("input.txt")) {
       int data;
       while ((data = fis.read()) != -1) {
          Systehttp://m.out.print((char) data);
       }
    } catch (IOException e) {
       e.printStackTrace();
    }

    'input.txt'라는 파일을 바이트 단위로 읽어 화면에 출력하는 예시입니다.

    파일 쓰기 예시

    try (FileOutputStream fos = new FileOutputStream("output.txt")) {
       String str = "Hello, World!";
       fos.write(str.getBytes());
    } catch (IOException e) {
       e.printStackTrace();
    }

    'Hello, World!'라는 문자열을 'output.txt'라는 파일에 쓰는 예시입니다.

    FileReader와 FileWriter
    FileReader와 FileWriter는 문자 기반의 입출력 스트림입니다. 따라서 텍스트 파일을 처리할 때 사용합니다.

     

    파일 읽기 예시

    try (FileReader fr = new FileReader("input.txt")) {
       int data;
       while ((data = fr.read()) != -1) {
          Systehttp://m.out.print((char) data);
       }
    } catch (IOException e) {
       e.printStackTrace();
    }

    'input.txt'라는 파일을 문자 단위로 읽어 화면에 출력하는 예시입니다.

    파일 쓰기 예시

    try (FileWriter fw = new FileWriter("output.txt")) {
       String str = "Hello, World!";
       fw.write(str);
    } catch (IOException e) {
       e.printStackTrace();
    }

    'Hello, World!'라는 문자열을 'output.txt'라는 파일에 쓰는 예시입니다.

     

    참조 : https://github.com/whiteship/live-study/issues/13

    반응형

    댓글

Designed by Tistory.