Jun's Development Journey

[Java/문법] 입출력(I/O) 본문

JAVA/문법

[Java/문법] 입출력(I/O)

J_Jayce 2022. 1. 4. 13:07

1. 스트림

- 데이터를 운반하는데 사용되는 연결통로

- 입력 스트림, 출력 스트림 총 2개의 스트림이 필요하다.

 

1-1) 바이트 기반 스트림(InputStream, OutputStream)

- 모든 바이트 기반 스트림의 조상

- 대표적 메소드

1) InputStream

 - read() : 1 바이트를 읽어온다. 더 이상 읽어올 데이터가 없다면 -1을 반환한다.

 - close() : 스트림을 닫음으로써 사용하고 있던 자원을 반환한다.

 

2) OutputStream

- write(int b) : 주어진 값을 출력소스에 쓴다.

- flush() : 스트림의 버퍼에 있는 모든 내용을 출력소스에 쓴다.

- close() : 입력소스를 닫음으로써 사용하던 자원을 반환한다.

 

1-1-1) ByteArrayInputStream, ByteArrayOutputStream

- 바이트 배열에 데이터를 입출력하는 데 사용되는 스트림이다.

- 주로 다른 곳에 입출력하기 전에 데이터를 임시로 바이트배열에 담아서 변환 등의 작업을 한다.

 

ex1)

read()와 write(int b)를 사용하기 때문에 한 번에 1바이트만 읽고 쓰기에 비효율적이다. 

ex2, 3)

- read(byte[] b, int off, int len), write(byte[] b, int off, int len)를 사용해서 입출력하는 예제이다. 한번에 배열 크기 만큼 읽고 쓸 수 있기때문에 효율적이다.

- 배열을 이용한 입출력은 착업의 효율을 증가시키므로, 가능하면 입출력 대상에 따라 알맞은 크기의 배열을 사용하는 것이 좋다.

1-1-2) FileInputStream, FileOutputStream

ex1) txt 파일 읽어서 출력하기

ex2) txt 파일 복사 및 저장

 

 

1-2) 바이트기반의 보조 스트림

1-2-1) BufferedInputStream, BufferedOutputStream

- 스트림의 입출력 효율을 높이기 위해 버퍼를 사용하는 보조 스트림이다.

- 한 바이트씩 입출력하는 것 보다 버퍼(바이트 배열)를 이용해서 한 번에 여러 바이트를 입출력하는 것이 빠르다.

 

1-2-1-1) BufferedOutputStream 예시

 

1-2-2) DataInputStream, DataOutputStream

- 데이터를 읽고 쓰는데 있어서 byte 단위가 아닌 8가지 기본 자료형의 단위로 읽고 쓸 수 있다는 장점이 있다.

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

- 예를 들어, int값을 출력한다면 4바이트의 16진수를 출력한다.

 

- 데이터를 읽어 올 때, 아무런 변환이나 자릿수를 셀 필요없이 단순히 readInt()와 같이 읽어 올 데이터의 타입에 맞는 메서드를 사용하기만 하면 된다.

- 문자로 데이터를 저장하면 다시 데이터를 읽어올 때 문자들을 실제 값으로 변환하는, 예를 들어 문자열 "100"을 숫자 100으로 변환해야 하는 과정, 데이터의 개수를 결정해야하는 등 번거로움을 없앨 수 있다.

 

 

1-3) 문자 기반 스트림

ex) FileReader

- 한글은 2~3byte인데 FileInputStream으로 읽으면 데이터가 byte 단위로 전달되면서 쪼개지기 때문에 꺠진다.

- 글자(문자) 단위로 읽어오는게 Reader, 저장하는게 Writer이다.

- 대용량 파일을 읽고 쓸 때는 한꺼번에 담았다가 한꺼번에 처리 -> BufferedReader, BufferedWriter 

 

ex) PipedReader, PipedWriter

- 쓰레드 간에 데이터를 주고받을 때 사용된다. 

- 다른 스트림과 달리 입력과 출력 스트림을 하나의 스트림으로 연결해서 데이터를 주고 받는 특징이 있다.

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

 

- inThread.connect(outThread.getOutput()); => 각 쓰레드 시작전에 PipedReader, writer 연결해야한다.

 

 

1-4) 문자 기반 보조 스트림

1-4-1) BufferedReader, BufferedWriter

- 버퍼를 이용해서 입출력의 효율을 높일 수 있도록 해주는 역할을 한다.

- 데이터를 라인 단위로 읽어올 수 있다는 장점이 있다. 

- BufferedWriter는 newLine()이라는 줄바꿈 해주는 메소드를 가지고 있다.

 

ex)

1-4-2) InputStreamReader, OutputStreamWriter

- 바이트 기반 스트림을 문자 기반 스트림으로 연결시켜주는 역할을 한다.

- 바이트 기반 스트림의 데이터를 지정된 인코딩의 문자 데이터로 변환하는 작업을 수행한다.

 

'JAVA > 문법' 카테고리의 다른 글

[Java/문법] 스레드 -2  (0) 2022.01.06
[Java/문법] 스레드-1  (0) 2022.01.04
[Java/문법] 클래스  (0) 2022.01.03
[Java/문법] Main 메소드  (0) 2022.01.03
[Java/문법] 연산자  (0) 2022.01.03