15 입출력 I/O - 자바에서의 입출력

Freddie·2022년 4월 10일
0

자바의 정석

목록 보기
7/8

1. 자바에서의 입출력

1.1 입출력이란?

I/O: Input과 Output(입출력)
입출력: 컴퓨터 내부 또는 외부의 장치와 프로그램간의 데이터를 주고 받는 것.

1.2 스트림(Stream)

데이터를 어느 한쪽에서 -> 다른 한쪽으로 전달하려면,
두 대상을 연결하고 데이터를 전송할 수 있는 무언가가 필요함.
=> Stream.

스트림이란 데이터를 운반하는데 사용되는 연결 통로이다.

물이 한쪽 방향으로만 흐르는 것과 같이 스트림은 단방향통신만 가능하기 때문에 하나의 스트림을로 입력과 출력을 동시에 처리할 수 없다.
=> 입력스트림(Input Stream), 출력스트림(Output Stream) 2개의 스트림이 필요함.

1.3 바이트기반 스트림 - InputStream, OutputStream

입력스트림과 출력스트림의 종류

스트림은 바이트 단위로 데이터를 전송함.

InputStream과 OutputStream에 정의된 읽기와 쓰기를 수행하는 메서드

InputStream의 read()와 OutputStream의 write(int b)는 입출력의 대상에 따라 읽고 쓰는 방법이 다르기 때문에 추상메서드로 정의되어있음.

public abstract class InputStream {
	abstract int read(); 
    //입력스트림으로 부터 1byte를 읽어서 반환함. 읽을 수 없으면 -1 반환
    
	int read(byte[] b, int off, int len){ 
    //입력스트림으로부터 len개의 byte를 읽어서 byte 배열 b의 off 위치부터 저장.
    
    	for(int i = off; i < off + len; i++){
        	//read()를 호출해서 데이터를 읽어서 배열을 배움. 
            b[i] = (byte)read();
        }
    }
}
//입력스트림으로부터 byte 배열 b의 크기만큼 데이터를 읽어서 배열 b에 저장
int read(byte[] b){
	return read(b, 0, b.length);
}

read()는 반드시 구현되어야 하는 핵심 메소드!
read() 없이는 read(byte[] b, int off, int len)와 read(byte[] b)는 의미가 없음.

1.4 보조 스트림

데이터 입출력 X
하지만 스트림 기능 향상 또는 새로운 기능 추가 O

스트림 생성 보조스트림 생성

FileInputStream fis = new FileInputStream("text.txt")
Buffered InputStream bis = new BufferedInputStream(fis);
bis.read();

위 코드를 보면 실제 입력기능은 FileInputStream이 수행하고,
BufferedInputStream은 버퍼만을 제공함.

버퍼를 사용한 입출력과 사용하지 않은 입출력 간의 성능차이는 상당함.

1.5 문자기반 스트림 - Reader, Writer

Java에서는 한 문자를 의미하는 char형이 1byte가 아니라 2byte이기 때문에 바이트 기반의 스트림으로 2byte인 문자를 처리하는데는 어려움이 있음.
-> 이 점을 보완하기 위해 문자기반의 스트림이 제공됨.

문자기반 스트림은 바이트기반 스트림에서 InputStream을 Reader로,
OutputStream을 Writer로 바꾸면 됨.
(단, ByteArrayInputStream에 대응하는 문자기반 스트림은 char 배열을 사용하는 CharArrayReader)

차이점
byte 배열 대신 char 배열 사용
추상메서드가 달라짐.

보조스트림
문자기반 보조스트림이 존재하며, 사용 목적과 방식은 바이트기반 보조스트림과 다르지 않음.

profile
그냥 'Freddie'라는 이름이 좋아보였습니다.

0개의 댓글