ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자바 - 입출력(I/O) (1) 바이트기반 스트림/ 문자기반 스트림
    언어/JAVA 2023. 5. 14. 23:15

     

    1. 입출력과 스트림

     

    입출력이란?

    컴퓨터 내부 또는 외부의 장치와 프로그램 간 데이터를 주고 받는 것을 말한다.

    키보드로 데이터를 입력받는 것 혹은 System.out.println()로 화면에 출력하는 것 등을 의미

     

    스트림이란?

    데이터를 운반하는데 사용되는 연결통로이다. 스트림은 단방향 통신만 가능하다 따라서

    하나의 스트림은 입력과 출력을 동시에 처리할 수 없다. 입출력을 위해선 입력/출력 스트림이 필요하다.

    스트림은 queue와 같은 FIFO구조이다.

     

    1.2 바이트 기반 스트림/ 문자 기반 스트림

     

    바이트 기반 스트림:  데이터를 바이트 단위로 처리하며, 있는 그대로 송수신 사진, 동영상,음악파일등의 송수신에 적합하다.(문자 데이터 송수신도 가능) InputStream/OutputStream 모든 바이트 스트림 클래스의 조상

     

    문자 기반 스트림: 2바이트 단위로 데이터를 처리하며, 세계 모든 나라의 언어로 구성된 파일의 입출력이 가능하다.

    문자 데이터 입출력만 가능하다. Writer/Reader  모든 문자 스트림 클래스의 조상 

     

    문자 스트림은 왜 존재하는가?

    문자 데이터는 운영체제별 고유의 문자표현방식을 따른다. 따라서 저장된 문자데이터는 해당 표현방식에 알맞은 형태로 저장되어 있어야한다. 즉, 데이터의 입출력시 있는 그대로 처리하는게 아니라 일종의 가공이 필요한 것이다.

    문자 스트림은 이러한 역할을 수행한다. 문자 데이터를 해당 운영체제에 맞는 문자 인코딩 기준에 따라 데이터 입출력을 실행해 준다.

     

    ex 문자 데이터를 바이트 스트림을 이용해서 입출력 (윈도우 문자데이터 저장시 \n\r이 같이 저장됨) 

    파일 > 안녕하세요\n\r -> 바이트 스트림 \n\r모두 인식 + 또한 문자 깨질 수 있음(인코딩x)

    파일> 안녕하세요\n\r -> 문자 스트림 \n\r을 \n으로 인식 + 모든 언어 문자 인식(인코딩 O)

    반대로 순수 바이트 데이터를 문자 스트림으로 입출력시에도 데이터가 이상하게 저장되고 출력될 것이다.  

     

    1.3 보조스트림 

     

    보조스트림은 데이터를 주고받는 스트림이 아니므로, 실제 입출력을 실행할 순 없지만, 스트림의 기능을 향상시키거나 새로운 기능을 추가할 수 있다. 따라서 스트림을 생성한 후 보조스트림을 연결해서 사용하자

     

    1.4 주요 클래스 미리 살펴보기

    출처:https://velog.io/@ljs0429777/Java-IO

     

    2. 바이트 기반 스트림의 종류 

     

    InputStream/OutputStream : 모든 바이트 기반 스트림의 조상 

     

    InputStream의 주요메서드

    출처:https://scshim.tistory.com/283

    위의 메서드에 추가하여 

     

    void mark(int readlimit) - 현재위치 표시하기, reset()에 의해 표시해 둔 위치로 다시 돌아갈 수 있다. readlimit은 되돌아 갈 수 있는 byte의 수 

    void reset() - 스트림에서의 위치를 마지막으로 mark()가 호출되었던 위치로 되돌린다. 

    boolean markSuported() - mark()와 reset()을 지원하는 지 확인하는 메서드 

    long skip() - 스트림에서 주어진 길이(n)을 건너뛴다.

     

    OutputStream의 주요 메서드

    출처:https://scshim.tistory.com/283

    -> flush()는 출력스트림에 버퍼가 있는 경우에만 의미가 있다. (보조 버퍼스트림) 

     

    *모든 스트림은 사용후 close()로 자원을 반납하고 닫아 줘야한다.

    단, ByteArrayInputStream과 같이 메모리를 사용하는 스트림과 System.out,in과 같은 표준 입출력 스트림은 닫지 않아도 된다.

     

    ByteArray Input/Output Stream : 바이트 배열에 데이터를 입출력하는데 사용되는 스트림, 주로 다른 곳에 입출력하기 전에 데이터를 입시로 바이트 배열에 담아서 변환 등의 작업을 수행하는데 사용됨  (복사 - 변환 용도) 

     

    File Input/Output Stream :  파일을 입출력하기 위한 스트림이다. 

     

    생성자의 파라미터

    InputStream - String name or File.class, FileDescriptor.class

    OuputStream은 동일한데 boolean으로 append를 지정할 수 있다. 

     

     

    2.1 바이트 보조스트림 

     

    Filter Input/Output Stream : Input/Output Stream의 자손이면서 모든 보조 스트림의 조상이다. 

    Filter Input/Output Stream은 단순히 기반 스트림의 메서드를 그대로 호출한다.

    이 클래스를 상속해서 원하는 작업을 수행하도록 읽고 쓰는 메서드(기반)를 오버라이딩 해야한다.

     

    Buffered Input/Output Stream: 한 바이트씩 입출력하는 것이아니라 버퍼를 이용해서 여러 바이트씩 입출력하도록 도움 

     

    BufferedInputStream(InputStream in, int size):  버퍼 사이즈를 정해서 기반 스트림을 연다. 사이즈를 정하지 않으면, 8192 크기의 버퍼를 갖게 된다. read() 호출시 버퍼 크기만큼 데이터를 읽어온다.

    OutputStream은 출력소스 및 출력기반 스트림과  작업함

     

    Data Input/Output Stream: Data Input / Outpur 인터페이스를 구현함, 데이터를 읽고 쓰는데 있어서 Byte단위가아니라 8가지 기본 자료형 단위로 읽고 쓸 수 있다는 장점이 있다. 

    DataOutputStream이 출력하는 형식은 각 기본 자료형 값을 16진수로 표현하여 저장함

    (read, write) + Boolean Int Double등등..메서드 있음

     

    SequenceInputStream: 여러 개의 입력스트림을 연속적으로 연결해서 하나의 스트림으로 데이터 읽는 것과 같이 처리해줌 큰 파일을 여러개의 작은 파일로 나누었다가 하나의 파일로 합치는 것과 같은 작업에 유리 

     

    PrintStream : PrintWriter 이전에 데이터를 적절한 문자로 출력하는 것을 담당했던 스트림이다. PrintWriter와 거의 같은 기능을 수행한다. (System 클래스의 static멤버인 out,err이 printStream이다)  

     

    *보조스트림으로 close()나 flush()하면, 기반스트림을 따로 close()나 flush()할 필요 없다. (오버라이딩됨) 

     

    3. 문자기반 스트림 

     

    Reader/Writer : 모든 문자스트림 클래스 조상 단위가 char인 것 빼고 Input/Output Stream과 동일함 

     

    FileReader / Writer : 파일로부터 텍스트 데이터를 읽고 쓰는데 사용된다.

     

    PipedReader/Wirter : 쓰레드 간 데이터를 주고받을 때 사용

    스트림을 생성한 다음 어느 한쪽 쓰레드에서 connect()를 호출해서 입력스트림과 출력스트림을 연결한다.

    PipedWriter로 보낸 데이터는 PipedReader 스트림으로 흘러들어감 

    입출력을 마친 후에 어느 한쪽 스트림만 닫아도 나머지 스트림 자동으로 닫힌다. 

    connect()로 입출력 스트림을 연결하는 것과 스트림 자동으로 닫히는 것 빼고 사용법은 비슷함 

     

    StringReader / StringWriter : CharArrayReader / Writer와 같이 입출력 대상이 메모리인 스트림이다. StringWriter에 출력되는 데이터는 내부의 StringBuffer에 저장도고 StringWriter의 getBuffer(), toString()등과 같은 메서드로 버퍼안에 저장된 문자들 얻을 수 이따.

     

    3.1 문자기반 보조스트림 

     

    BufferedReader / BufferedWriter : 버퍼를 사용하여 입출력 효율을 높일 수 있다. 

     

    InputStreamReader / OutputStreamWriter : 바이트 기반 스트림을 문자기반 스트림으로 연결해준다. 또한 바이트기반 스트림의 데이터를 지정된 인코딩의 문자데이터로 변환하는 작업을 수행한다. 

     

     

    참고자료: 자바의 정석

     

    https://codedragon.tistory.com/5428

     

    문자 스트림의 특징, 문자 스트림의 구조, 바이트 스트림과 문자 스트림 차이-바이트 스트림의

    문자 스트림의 특징· 유니코드로 된 문자를 입·출력 하는 스트림입니다.· 바이트 스트림에 추가하여 Reader와 Writer 클래스를 제공하는데, 이것은 2 바이트를 입출력 할 수 있는 문자 기반 스트림

    codedragon.tistory.com

     

    '언어 > JAVA' 카테고리의 다른 글

    람다식  (0) 2023.07.05
    객체지향 - 캡슐화  (0) 2023.06.12
    자바 - 열거형(enums)  (0) 2023.03.26
    자바 - Arrays 클래스와 Comparator  (0) 2023.03.23
    자바 - Thread(4) 동기화  (0) 2023.03.21
Designed by Tistory.