본문 바로가기
Java/정리

[Java] IO(입출력)_스트림

by 콧등치기국수 2021. 6. 1.
IO(입출력)

 

IO란 Input과 Output의 약자로 입력과 출력, 간단히 줄여 입출력이라고 한다. 입출력은 컴퓨터 내부 또는 외부의 장치와 프로그램 간의 데이터를 주고받는 것을 말한다.이때 입출력 데이터를 처리할 공통적인 방법으로 스트림을 이용한다. 

 

 

Stream(스트림) : 입출력장치에서 데이터를 읽고 쓰기 위해서 자바에서 제공하는 클래스

 

 스트림은 운영체제에 의해 생성되는 가상의 연결 고리를 의미하며, 중간 매개자 역할을 한다.

외부입력장치(키보드) 또는 외부파일의 데이터를 읽어 프로그램으로 도착하는 경우 입력스트림(InputStream), 프로그램이 데이터를 보내서 모니터에 출력하거나 파일로 출력되는 경우 출력스트림(OutputStream)이라고 한다.

 

이러한 스트림은 한방향으로만 통신할 수 있는 단방향성이기 때문에 입력과 출력 2개가 하고 싶다면 2개의 스트림을 생성해야 한다. 따라서 사용목적에 따라 입력스트림과 출력스트림으로 구분된다.

양방향이면 참 편할텐데 왜 단방향이어서 입력할 때 만들고 출력할 때 만들어야 하는가...

 

자바에서의 스트림 생성은 이러한 스트림 클래스 타입의 인스턴스를 생성한다는 의미이다.

 

 

스트림 분류 (바이트스트림, 문자스트림 / 기반스트림, 보조스트림)

 

스트림은 바이트 단위로 처리하는 바이트 스트림과 문자단위로 처리하는 문자 스트림으로 2가지로 분류할 수 있다.

바이트스트림에서 입력스트림에서 최상위 클래스가 OutputStream이고 보조스트림은 OutputStream을 상속한다. 

스트림은 사용한뒤 반드시 close()닫아줘야 한다.

 

보조스트림은 스트림의 기능을 향상시키거나 새로운 기능을 추가하기 위해서 사용한다. 보조스트림은 실제 데이터를 주고받는 스트림은 실제 데이터를 주고받는 스트림은 아니어서 입출력 처리가 불가능하다.

따라서 기반 스트림을 먼저 생성한 후 보조스트림을 생성해야 한다.

스트림 분류 최상위 클래스 기반스트림 보조스트림
바이트 스트림 InputStream FileInputStream
ByteArrayInputStream
StringBufferedInputStream
DataInputStream
BufferedInputStream
ObjectInputStream
OuputStream FileOuputStream
ByteArrayOuputStream
DataOuputStream
BufferedOuputStream
ObjectOuputStream
문자 스트림 Reader FileReader
PipedReader
StringReader
BufferedReader
InputStreamReader
Writer FileWriter
PipedWriter
StringWriter
PrintWriter
BuffereWriter
OutputStreamWriter

기반스트림 생성 후 보조스트림 생성해야 한다. 보조스트림만으로는 입출력 처리 불가능!

 

 

기반스트림 : 입출력 대상이 파일일 경우 

 

바이트 기반스트림

1) FileInputStream

- 파일로부터 바이트 단위로 읽을 때 사용하며, 그림,오디오,비디오,텍스트 파일등 모든 종류의 파일을 읽을 수 있다.

- 만약 파일이 존재하지 않는 경우 FileNotFoundException이 발생하므로 예외처리가 필수이다.

FileInputStream fis= newFileInputStream("test.txt");  //자바프로젝트 내 test파일을 읽는다.

fis.close();  //꼭 해줘야 한다.

2) FileOutputStream

- 바이트 단위이므로 그림,오디오,비디오,텍스트 파일 등 모든 종류의 데이터를 파일로 저장가능하다.

- FileOutputStream객체가 생성될 때 파일과 직접 연결되며, 파일이 존재하지 않으면 자동으로 생성한다.

- 파일이 존재하면 파일을 덮어쓰기 때문에 객체 생성시 ,true를 적어줘야 한다.

FileOutputStream fos= newFileOutputStream("C:/data/test.txt");
FileOutputStream fos= newFileOutputStream("C:/data/test.txt", true);  //이미 파일이 존재하는 경우 본래 내용뒤에 추가로 작성

fos.close();  //꼭 해줘야 한다.

 

 

문자 기반스트림

1) FileReader

- 텍스트파일로부터 문자 단위로 읽을 때 사용하며, 텍스트가 아닌 그림,오디오,비디오등의 파일은 읽을 수 없다.

- 만약 파일이 존재하지 않는 경우 FileNotFoundException이 발생하므로 예외처리가 필수이다.

FileReader fr = newFileReader(newFile("yeoni.txt"));

fr.close();

 

2) FileWriter

- 텍스트파일로부터 문자단위로 저장할 때 사용한다. 그림,오디오,비디오,텍스트 파일 등은 파일로 저장할 수 없다.

- FileOutputStream객체가 생성될 때 파일과 직접 연결되며, 파일이 존재하지 않으면 자동으로 생성한다.

- 파일이 존재하면 파일을 덮어쓰기 때문에 객체 생성시 ,true를 적어줘야 한다.

FileWriter fr = new FileWriter("data.txt");
FileWriter fr = new FileWriter("data.txt",true);

fr.close();

 

 

보조스트림 중 BufferedInputStream/OuputStream과 ObjectInputStream/OuputStream은 어떻게 사용하는지와 함께 포스팅할 예정이다.

 

 

 

출처 및 참고:

0. kh정보교육원 강의자료

1. 사진,스트림이란 - https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=mcm1092&logNo=220952343121 

2. 스트림 분류 - http://tcpschool.com/java/java_io_stream

꽤 자세히 나와있어서 또 보면 좋을 것 같다.

'Java > 정리' 카테고리의 다른 글

[Java] double 계산오차  (0) 2021.06.23
[Java] 컬렉션 프레임워크 - ArrayList  (0) 2021.06.16
[Java] API_String관련 클래스  (0) 2021.05.27
[Java] 다형성  (0) 2021.05.25
[Java] 예외처리_try with resource  (0) 2021.05.25