[Java] 입출력 IO? Input/Output, 기반스트림과 보조스트림
TIL: 스스로 이해한 것을 바탕으로 정리하였기에 오류가 있을 수 있습니다. 틀린 부분은 댓글로 알려주시면 감사하겠습니다.
I.O?
Input과 Output의 약자로 컴퓨터 내부 또는 외부 장치와 프로그램 간의 데이터를 주고받는 것을 말한다.
외부장치에서 데이터의 입출력을 하기 위해서는 하드웨어 장치에 직접 접근이 필요한데, 이때 스트림을 사용해서 데이터를 처리한다.
스트림(Stream)
입출력 장치에서 데이터를 읽고 쓰기 위해 자바에서 제공하는 클래스
모든 스트림은 단방향(입력과 출력은 별개)이며, 순서대로 처리된다. (선입선출)
그렇기 때문에 시간지연문제가 발생할 수 있다.
스트림의 구분
1 > 통로의 사이즈
바이트 스트림 : 1byte짜리가 왔다 갔다 할 수 있을 정도의 사이즈 (통로가 좁음)
=> 입력 (inputStream)/출력(outputStream)
문자 스트림 : 2byte짜리가 왔다 갔다 할 수 있을 정도의 사이즈 (통로가 넓음)
=> 입력(reader)/출력(writer)
2 > 외부매체와 직접 연결 여부
기반 스트림(기본 스트림): 외부 매체와 직접적으로 연결하는 통로
보조 스트림: 기반 스트림만으로 부족한 성능을 향상시켜주는 용도 (외부 매체와 직접적으로 연결되는 통로가 아니다)
속도 향상, 자료형 변환 등등 유용한 기능들을 제공한다.
외부 매체와 직접적으로 연결되는 통로가 아니므로 단독 사용은 불가하다.
InputStream
바이트 기반 입력 스트림의 최상위 클래스이다. (추상 클래스)
OutputStream
바이트 기반 출력 스트림의 최상위 클래스 (추상 클래스)
파일 객체 생성 => FileOutputStream f = new FileOutputStream("XXX.txt");
FileOutputStream f = new FileOutputStream("XXX.txt", true);
(true 작성 시 이어서 작성되고, 미작성 시(기본값 false) 덮어 씌어진다.)
Reader
문자 기반 입력 스트림의 최상위 클래스 (추상 클래스)
Writer
문자 기반 출력 스트림의 최상위 클래스 (추상 클래스)
File 클래스
파일 시스템의 파일을 표현한 클래스
파일크기, 파일 속성, 파일 이름 등의 정보와 파일 생성 및 삭제 기능을 제공한다.
-> File객체 생성
File file = new File("파일 경로");
File file = new File("C:/경로/ㅇㅇ.txt");
스트림명 |
설명 |
객체 생성 |
FileInputStream |
파일로부터 바이트 단위로 읽을 때 사용 |
FileInputStream 이름 = new FileInputStream("경로"); |
FileOutputStream |
파일로부터 바이트 단위로 저장할 때 사용 |
FileOutputStream 이름 = new FileOutputStream("경로"); |
FileReader |
텍스트 파일로부터 문자 단위로 읽을 때 사용 |
FileReader 이름 = new FileReader("경로"); |
FileWriter |
텍스트 파일로부터 문자 단위로 저장할 때 사용 |
FileWriter 이름 = new FileWriter("경로"); |
FileSave |
파일 저장 |
fileOutputStream(파일명. txt); |
출력시
읽을 때는 한 글자 씩(1바이트씩) 읽어오기 때문에 개수만큼 출력을 해야 함
넘치게 출력하면 -1을 출력한다.
매번 println구문을 넣을 수 없고 몇 개나 출력할 수 없음으로 조건은 -1을 만나면 끝나는 조건을 두고
1. 무한반복 돌려놓고 조건 검사
2. 애초에 반복문에 조건식 제시하기
보조 스트림
기반 스트림만으로 부족한 성능을 향상하는 메소드
보조 스트림은 실제 데이터를 주고받는 스트림이 아니기 때문에 단독으로 입출력 처리가 불가능하다.
(기반 스트림을 먼저 생성한 후 이를 이용하여 보조 스트림 생성)
보조스트림 종류
보조스트림 기능 |
보조스트림 종류 |
문자변환 |
InputStreamReader/ OutputStreamWriter |
입출력 성능 (속도 향상용) |
BufferedInputStream/ BufferedOutputStream |
기본 데이터 타입 출력 |
DataInputStream/ DataOutputStream |
객체 입출력 |
ObjectInputStream/ ObjectOutputStream |
보조 스트림 객체 생성
보조스트림 이름 = new 보조스트림(new File(Reader or Writer) ("내용");
BufferedWriter bw = new BufferedWriter(new FileWriter("dfdf"));
ex.) 버퍼드라이터면 => 파일라이터 / 버퍼드 리더면 => 파일리더
항상 클로스 해야 한다.
try catch 하면 클로스 때문에 finally 해야 함
보완해서 나온 게
try catch resource
입력받는 것
한 문장씩 읽어 들이기
문자열로 돌려주기 때문에 정수 값 돌려주지 않는데
파일의 끝을 만나면 null이라는 값을 만나기 때문에 조건 넣어서 반복문을 돌려야 함
객체 입출력 보조 스트림
객체를 파일 또는 네트워크로 입출력할 수 있는 스트림
객체는 문자가 아니므로 바이트 기반 스트림으로 데이터를 변경해주는 직렬 화가 필수이다.
스트림을 이용한 DAO예시)