목표
자바의 Input과 Ontput에 대해 학습하세요.
학습할 것 (필수)
- 스트림 (Stream) / 버퍼 (Buffer) / 채널 (Channel) 기반의 I/O
- InputStream과 OutputStream
- Byte와 Character 스트림
- 표준 스트림 (System.in, System.out, System.err)
- 파일 읽고 쓰기
스트림 (Stream) / 버퍼 (Buffer) / 채널 (Channel) 기반의 I/O
Stream
스트림이란 데이터를 운반하는데 사용되는 연결통로
스트림은 단방향 통신만 가능하기 때문에 하나의 스트림으로 입력과 출력을 동시에 처리할 수 없다.
둘다 하려면 input stream과 output stream 2개의 스트림이 필요하다.
스트림은 먼저 보낸 데이터를 먼저 받게 되어 있으며 중간에 건너뜀 없이 연속적으로 데이터를 주고 받는다.
큐와 같은 FIFO 구조로 되어있다고 생각하면 이해하기 쉽다.
Byte기반의 스트림
-
FileInputStream , FileOutputStream
- 파일
-
ByteArrayInputStream , ByteArrayOutputStream
- 메모리 ( Byte 배열 )
-
PipedInputStream , PipedOutputStream
- 프로세스 ( 프로세스간 통신 )
-
AudioInputStream , AudioOutputStream
- 오디오장치
-
어떤 대상에 대해서 작업을 할것인지에 따라 해당 스트림을 선택해서 사용하면 된다.
입출력스트림의 부모 inputStream, outputStream
-
InputStream
- abstraact int read()
- int read(byte[] b)
- int read(byte[] b, int off, int len)
-
OutputStream
- abstract void write(int b)
- void write(byte[] b)
- void write(byte[] b, int off, int len)
Buffer
CPU와 I/O의 속도차이에서 나오는 비효율성을 줄이기 위해 등장
데이터를 전송하는 상호간의 장치에서 고속의 장치 ( java api 호출 ) 와 저속의 장치 ( OS레벨에서 시스템콜 ) 간의 속도차이로 인해 저속의 장치가 작업을 추리하는 동안 고속의 장치가 기다려야 하는 현상을 줄여준다.
JAVA I/O
스트림 가반의 I/O이며 기본적으로 buffer를 사용하지 않으며 blocking 상태이다.
JAVA NIO
채널 기반의 I/O , 기본적으로 buffer를 사용하며 non-blocking을 지원한다.
출처: https://velog.io/@jaden_94/13주차-항해일지-IO
InputStream 과 OutputStream
InputStream try (FileInputStream fis = new FileInputStream(new File(fileName))) { int content; // 돌면서 byte를 읽고 file의 끝에 도달하면 -1을 return한다. while ((content = fis.read()) != -1) { System.out.println((char)content); } } catch (IOException e) { e.printStackTrace(); } OutputStream try (FileOutputStream outputStream = new FileOutputStream(file, false)) { int read; byte[] bytes = new byte[DEFAULT_BUFFER_SIZE]; while ((read = inputStream.read(bytes)) != -1) { outputStream.write(bytes, 0, read); } }
출처 https://mkyong.com/java/how-to-convert-inputstream-to-file-in-java/
- NIO가 아닌 IO를 사용한 stream이여서 buffer를 자동으로 사용하지 않아 느리다.
Byte와 Character 스트림
-
inputStream과 outputStream은 대표적인 byteStream이다.
-
1 byte 단위로 데이터를 입출력한다.
-
characterStream은 2바이트단위로 데이터를 전송한다.
-
유니코드는 기본단위가 2바이트로 문자를 입출력할때 CharacterStream을 쓰는것이 적절하다.
-
characterStream은 클래스명에 Reader, Writer이 들어가 있다.
BufferReader // 리소스 폴더로부터 파일을 불러온다. InputStream is = InputStreamToReaderExample.class .getClassLoader() .getResourceAsStream("file/abc.txt"); // BufferedReader -> InputStreamReader -> InputStream // try-with-resources, auto close String line; try (BufferedReader br = new BufferedReader( new InputStreamReader(is, StandardCharsets.UTF_8))) { // read line by line while ((line = br.readLine()) != null) { System.out.println(line); } } BufferedWriter try (FileWriter writer = new FileWriter("app.log"); BufferedWriter bw = new BufferedWriter(writer)) { bw.write(content); } catch (IOException e) { System.err.format("IOException: %s%n", e); }
출처 https://mkyong.com/java/how-to-write-to-file-in-java-bufferedwriter-example/
표준 스트림 (System.in, System.out, System.err)
표준 스트림
-
콘솔을 통해 데이터입력과 콘솔로의 데이터 출력을 의미
-
자바에서는 표준 입출력을 위해 3가지 입출력 스트림 in,out,err를 제공한다.
-
자바앱의 실행과 동시에 자동으로 생성되기 때문에 별도의 스트림없이 사용이 가능하다.
-
- 콘솔로 부터 데이터를 입력받는데 사용
-
System.out
- 콘솔로 데이터를 출력하는데 사용
-
System.err
- 콘솔로 데이터를 출력하는데 사용
파일 읽고 쓰기
BufferReader와 BufferWriter의 예제 참고.
'백선생님 온라인스터디' 카테고리의 다른 글
12주차 애노테이션 (0) | 2021.02.28 |
---|---|
10주차 멀티스레드 프로그래밍 (0) | 2021.01.31 |
11주차 Enum (0) | 2021.01.30 |
9주차 - 예외 처리 (0) | 2021.01.19 |
8주차 - 인터페이스 (0) | 2021.01.16 |