나는 드디어 “상위 호환성”이 의미하는 걸 알게 되었다.
그건 옛날 실수까지 그대로 유지되어야 한다는 뜻이다.
젠장.
(Dennie van Tassel)
- IO와 Stream이란?
- IO
- Stream
- Stream의 종류
- InputStream
- OutputStream
- Reader
- Writer
- FileClass
- FileInputStream
- FileOutputStream
- FileReader
- FileWriter
- 보조스트림
- 문자변환(InputStreamReader/OutputStreamWriter)
- 입출력 성능(BufferedInputStream/BufferedOutputStream)
- 기본 데이터 타입 출력(DataInputStream, DataOutputStream)
- 객체 입출력(ObjectInputStream/ObjectOutputStream)
- 사용시 주의점
1. IO와 Stream이란?
1) IO
Input과 Output의 약자, 컴퓨터 내부 또는 외부 장치와 프로그램 간의 데이터를 주고 받는 것으로, 장치와 입출력을 위해서는 하드웨어 장치에 직접 접근이 필요한데 다양한 매체에 존재하는 데이터들을 사용하기 위해 입출력 데이터를 처리할 공통적인 방법으로 스트림을 이용한다.
2) Stream
입출력 장치에서 데이터를 읽고 쓰기 위해서 자바에서 제공하는 클래스로, 모든 스트림은 단방향이며 각각의 장치마다 연결할 수 있는 스트림 존재이다. 하나의 스트림으로 입출력을 동시에 수행할 수 없으므로 동시에 수행하려면 2개의 스트림 필요하다.
1) InputStream
바이트 기반 입력 스트림의 최상위 클래스로 추상클래스!
2) OutputStream
바이트 기반 출력 스트림의 최상위 클래스로 추상클래스!
3) Reader
문자 기반 입력 스트림의 최상위 클래스로 추상클래스!
4) Writer
문자 기반 출력 스트림의 최상위 클래스로 추상클래스
3. FileClass 파일 시스템의 파일을 표현하는 클래스이며 파일 크기, 파일 속성, 파일 이름 등의 정보와 파일 생성 및 삭제 기능 제공한다.
1) FileInputStream
파일로부터 바이트 단위로 읽을 때 사용하며 그림, 오디오, 비디오, 텍스트 파일 등 모든 종류의 파일 읽기 가능하다. InputStream의 하위 클래스로 InputStream과 사용 방법 동일하다. FileInputStream 객체가 생성될 때 파일과 직접 연결 되며, 파일이 존재하지 않으면 FileNotFoundException이 발생하므로 예외처리가 필수이다.
FileInputStream fis = new FileInputStream("C:/data/test.txt");
2) FileOutputStream
파일로부터 바이트 단위로 저장할 때 사용하며 그림, 오디오, 비디오, 텍스트 파일 등 모든 종류의 데이터를 파일로 저장한다. OutputStream의 하위 클래스로 OutputStream과 사용 방법 동일하다. FileOutputStream객체가 생성될 때 파일과 직접 연결 된다. 파일이 존재하지 않으면 자동으로 생성하지만 이미 파일이 존재하는 경우 파일을 덮어쓰는 단점이 있다. FileOutputStream fos = new FileOutputStream("C:/data/test.txt");
만일 기존 파일에 이어서 계속 작성하고 싶다면 아래 예제처럼 객체 생성 시 가능하다.
FileOutputStream fos = new FileOutputStream("C:/data/test.txt", true);
3) FileReader // 2byte
텍스트 파일로부터 문자 단위로 읽을 때 사용하며, 텍스트가 아닌 그림, 오디오, 비디오 등의 파일은 읽기가 불가능하다.
Reader의 하위 클래스로 Reader와 사용 방법 동일하다. FileReader객체가 생성될 때 파일과 직접 연결 되며, 파일이 존재하지 않으면 FileNotFoundException이 발생하므로 예외처리 필수이다.
FileReader fr = new FileReader("C:/data/test.txt");
FileReader fr = new FileReader(new File("C:/data/test.txt"));
4) FileWriter // 2byte
텍스트 파일로부터 문자 단위로 저장할 때 사용한다. 텍스트가 아닌 그림, 오디오, 비디오 등의 파일은 저장 불가능하고 Writer의 하위 클래스로 Writer와 사용 방법 동일하다. FileWriter객체가 생성될 때 파일과 직접 연결 되며 파일이 존재하지 않으면 자동으로 생성하지만 파일이 존재하는 경우 파일을 덮어쓰는 단점이 있다.
FileWriter fw = new FileWriter("C:/data/test.txt");
만일 기존 파일에 이어서 계속 작성하고 싶다면 아래 예제처럼 객체 생성 시 가능하다.
FileWriter fw = new FileWriter("C:/data/test.txt", true);
4. 보조스트림
스트림의 기능을 향상시키거나 새로운 기능을 추가하기 위해 사용한다. 보조 스트림은 실제 데이터를 주고 받는 스트림이 아니기 때문에 입출력 처리 불가능하고, 기반 스트림을 먼저 생성한 후 이를 이용하여 보조 스트림 생성한다. 단독으로는 사용이 불가한데, 이는 단독으로 객체 생성이 불가함을 의미한다.
[표현법 ] 보조스트림클래스명 객체명 = new 보조스트림클래스명(기반스트림객체); |
1) 문자 변환(InputStreamReader/OutputStreamWriter)
소스 스트림이 바이트 기반 스트림이지만 데이터가 문자일 경우 사용하며, Reader와 Writer는 문자 단위로 입출력을 하기 때문에 데이터가 문자인 경우 바이트 기반 스트림보다 편리하게 사용 가능하다.
2) 입출력 성능(BufferedInputStream/BufferedOutputStream)
성능 향상 보조 스트림이라고도 하며 느린 속도로 인해 입출력 성능에 영향을 미치는 입출력 소스를 이용하는 경우 사용한다. 입출력 소스와 직접 작업하지 않고 버퍼에 데이터를 모아 한꺼번에 입출력을 하여 실행 성능을 향상시킨다(입출력 횟수 줄임).
3) 기본 데이터 타입 출력(DataInputStream, DataOutputStream)
기본 자료형 별 데이터 읽고 쓰기가 가능하도록 기능 제공. 단, 입력된 자료형의 순서와 출력될 자료형의 순서가 서로 일치하여야 한다.
4) 객체 입출력(ObjectInputStream/ObjectOutputStream)
객체를 파일 또는 네트워크로 입출력 할 수 있는 기능 제공. 단, 객체는 문자가 아니므로 바이트 기반 스트림으로 데이터를 변경해주는 직렬화가 필수이다.
5) 사용시 주의점
1. 반드시 기반스트림과 보조스트림의 통로의 사이즈는 같아야 함 |
바이트 기반스트림 + 바이트 보조스트림 문자 기반스트림 + 문자 보조스트림 |
2. 반드시 기반스트림과 보조스트림의 데이터 이동 방향이 같아야 함 |
입력 기반스트림 + 입력 보조스트림 출력 기반스트림 + 출력 보조스트림 |
어렵다...
- 후술하겠지만 추상클래스다 [본문으로]