[Java] ☕ 입출력 (I/O)
📖 입출력 (I/O)
I/O
는 input/output
의 약자로 입출력이다.
🍄 스트림 (Stream)
- 자바에서는 파일이나 콘솔의 입출력을 직접 다루지 않고, 스트림이라는 흐름을 통해 다룬다.
- 자료의 입출력을 도와주는
중간 매개자
역할이며, 응용 프로그램과 입출력 장치를 연결하는 소프트웨어 모듈 - 데이터가 순서대로 들어오는
단방향의 통로
이다. 동기적
이며blocking
방식이므로 데이터를 읽거나 쓰기 위해 스트림에 요청하면 스트림은 자신의 역할에 맞춰 다시 데이터를 읽거나 쓸 수 있을 때까지 다른 작업을 못하고 무한정 기다린다.
blocking이란?
- 특정 작업이 실행 요청을 받아 실제로 수행되는 동안, 다른 작업은 작업을 진행하지 못하고 대기해야만 하는 방식
🍄 버퍼 (Buffer)
데이터를 전송하는 과정에서 두 장치가 서로 속도차이가 날 때, 고속 장치에서 발생하는 기다리는 시간을 줄여주는 역할을 한다.
또한 바이트 단위로 데이터가 입력된다면 Stream
은 즉시 전송하는데, 이는 매번 출력이나 입력 때마다 운영체제를 불러오기 때문에 매우 비효율적인 처리가 된다.
따라서 버퍼를 사용하여 두 장치의 속도 차이를 개선하고, I/O의 성능을 향상시킨다.
🍄 BufferReader
- 모든 값을
Stirng
으로만 받는다. throws IOException
예외처리를 꼭 해줘야 하며,try & catch
로 처리도 가능하다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
br.readLine();
🍄 StringTokenizer
- 위의
BufferedReader
를 공백 단위로 쉽게 사용하기 위하여 사용하는 것이StringTokenizer
이다. st.nextToken()
을 사용하여String
타입의 데이터를 공백 단위로 나눌 수 있다.
StringTokenizer st = new StringTokenizer(br.readLine());
st.nextToken();
🍄 Channel
- 기존 자바의 입출력 방식은
Stream
의 단방향을 개선한 방식으로NIO
이다. - 데이터가 흘러다니는
양방향의 통로
이므로input/output
을 구분하지 않는다. - 기존의
Stream
과 다르게 무조건buffer
단위로 데이터를 전송한다.
I/O 대신 무조건 NI/O 가 좋은 방식인가?
- 입출력 처리가 오래 걸리는 작업의 경우 스레들르 재사용하여
non-blocking
방식으로 처리하는 NIO는 좋은 효율을 내지 못할 수 있다. - 대용량 처리시 NIO의 버퍼 크기 문제로 복잡해질 수 있다.
📖 InputStream & OutputStream
- 바이트 단위로 데이터를 입력/출력 스트림의 최상위 추상 클래스
- 모든 바이트 기반 스트림은 이 클래스를 상속받는다.
- 키보드나 다른 서버에서 입력/출력을 받을때 기본적으로 사용하는 메서드이다.
📖 Byte와 Character 스트림
- Byte Stream
- binary 데이터를 입출력
- 데이터를 1바이트 단위로 처리
- 이미지, 동영상 처리때 사용
- Character Stream
- text 데이터 입출력
- 데이터는 2바이트 단위로 처리
- 텍스트 처리떄 사용
📖 표준 스트림
public final class System {
public static final InputStream in;
public static final PrintStream out;
public static final PrintStream err;
....
}
- 실제 java.lang 패키지에 접속하면 위와 같이
in/out
이 정의되어 있다. System.in/System.out
을 사용하면inputstream/printStream
을 사용하는 것이다.
📖 파일 읽고 쓰기
public static void main(String[] args) {
// 1. 파일 객체 생성
File file = new File("d:\\example\\writeFile.txt");
// 2. 파일 존재여부 체크 및 생성
if (!file.exists()) {
file.createNewFile();
}
// 3. Buffer를 사용해서 File에 write할 수 있는 BufferedWriter 생성 FileWriter fw = new FileWriter(file);
BufferedWriter writer = new BufferedWriter(fw);
// 4. 파일에 쓰기
writer.write("안녕하세요");
// 5. BufferedWriter close
writer.close();
}
개인 공부 기록용 블로그입니다.
틀리거나 오류가 있을 경우 제보해주시면 감사하겠습니다.😁