✓ 입출력 스트림
- 자바에서 데이터는 스트림을 통해 입출력된다.
- 프로그램이 도착지면 흘러온 데이터를 입력받아야 하기 때문에 입력 스트림을 사용
- 프로그램이 출발지면 데이터를 출력해야 하므로 출력 스트림을 사용
java.io 패키지에서 제공하는 입출력 스트림의 종류
1️⃣ 바이트 기반 스트림: 그림, 멀티미디어 등의 바이너리 데이터를 읽고 출력할 때 사용 (InputStream, OutputStream)
2️⃣ 문자 기반 스트림: 문자 데이터를 읽고 출력할 때 사용 (Reader, Writer)
✏️ OutputStream 바이트 출력 스트림
FileOutputStream, PrintStream, BufferedOutputStream, DataOutputStream
- write(int b): 1byte 출력
- write(byte[] b): 매개값으로 주어진 배열 b의 모든 바이트를 출력한다
- write(byte[] b, int off, int len): 매개값으로 주어진 배열 b[off]부터 len개 까지의 바이트를 출력한다
📖 InputStream 바이트 입력 스트림
FileInputStream, BufferedInputStream, DataInputStream
- read(): 1byte를 읽고 읽은 바이트를 리턴.
- read(byte[] b): 읽은 바이트를 매개값으로 주어진 배열에 저장하고 읽은 바이트 수를 리턴
- read(byte[] b, int off, int len): len개의 바이트를 읽고 매개값으로 주어진 배열에서 b[off]부터 len개까지 저장. 그리고 읽은 바이트 수를 리턴
✏️ Writer 문자 출력 스트림
FileWriter, BufferedWriter, PrintWriter, OutputStreamWriter
- write(int c): 매개값으로 주어진 한 분자를 보냄
- write(char[] cbuf): 매개값으로 주어진 배열의 모든 문자를 보냄
- write(char[] cbuf, int off, int len): 매개값으로 주어진 배열에서 cbuf[off]부터 len개까지의 문자를 보냄
- write(String str): 매개값으로 주어진 문자열을 보냄
- write(String str, int off, int len): 매개값으로 주어지 문자열에서 off 순번부터 len개까지의 문자를 보냄
📖 Reader 문자 입력 스트림
FileReader, BufferedReader, InputStreamReader
- read(): 1개의 문자를 읽고 리턴
- read(byte[] b): 읽은 문자를 매개값으로 주어진 문자 배열에 저장하고 읽은 문자수를 리턴
- read(byte[] b, int off, int len): len개의 문자 읽고 매개값으로 주어진 문자 배열에서 cbuf[off]부터 len개까지 저장. 그리고 읽은 문자 수를 리턴
✅ 공통 메소드
- flush(): 버퍼에 잔류하는 모든 데이터를 출력
- close() : 스트림을 닫음
✓ 보조 스트림
✏️ 보조 스트림: 다른 스트림과 연결이 되어 여러 가지 편리한 기능을 제공해주는 스트림
보조 스트림 연결하기
보조스트림 변수 = new 보조스트림(연결스트림)
// 예시
InputStream is = ... ;
InputStreamReader reader = new InputStreamReader(is);
보조 스트림은 연속적으로 연결될 수 있다
InputStream is = System.in;
InputStreamReader reader = new InputStreamReader(is);
BufferedReader br = new BufferedReader(reader);
1️⃣ 문자 변환 보조 스트림
소스 스트림이 바이트 기반 스트림이면서 입출력 데이터가 문자일 경우 쓸 수 있는 보조 스트림
1) OutputStreamWriter: 바이트 기반 출력 스트림에 연결되어 문자 출력 스트림인 Writer로 변환
Writer writer = new OutputStreamWriter(바이트 기반 출력 스트림);
//예시
FileOutputStream fos = new FileOutputStream("C:/Temp/test1.txt");
Writer writer = new OutputStreamWriter(fos);
2) InputStreamReader: 바이트 기반 입력 스트림에 연결되어 문자 입력 스트림인 Reader로 변환
Reader reader = new InputStreamReader(바이트 기반 입력 스트림);
//예시
FileInputStream fis = new FileInputStream("C:/Temp/test1.txt");
Reader reader = new InputStreamReader(fis);
2️⃣ 성능 향상 보조 스트림
메모리 버퍼를 추가로 제공하여 프로그램 실행 성능을 향상 시키는 보조스트림
1) BufferedOutputStream과 BufferedWriter
프로그램에서 전송한 데이터를 내부 버퍼에 쌓아 두었다가 버퍼가 꽉 차면 버퍼의 모든 데이터를 한꺼번에 보낸다.
BufferedOutputStream bos = new BufferedOutputStream(바이트 기반 출력 스트림);
BufferedWriter bw = new BufferedWriter(문자 기반 출력 스트림);
2) BufferedInputStream과 BufferedReader
입력 소스로부터 자신의 내부 버퍼 크기만큼 데이터를 미리 읽고 버퍼에 저장한다.
프로그램은 외부 입력소스로부터 직접 읽는 대신 버퍼로부터 읽음으로써 읽기 성능이 향상된다.
BufferedInputStream bis = new BufferedInputStream(바이트 기반 입력 스트림);
BufferedReader br = new BufferedReader(문자 기반 입력 스트림);
+ readLine(): 라인 단위로 문자열을 읽는 메소드 ;
Reader reader = new FileReader(
ReadLineExample.class.getResource("language.txt").getPath() //문자 기반 입력 스트림 얻기
);
BufferedReader br = new BufferedReader(reader); // 보조 스트림 연결
while(true) {
String data = br.readLine(); // 라인 단위 문자열을 읽고 리턴
if(data == null) break; // 파일 끝에 도달했을 경우
System.out.println(data);
}
br.close(); // 입력 스트림 닫기
3️⃣ 기본 타입 입출력 보조 스트림
DataInputStream dis = new DataInputStream(바이트 기반 입력 스트림);
DataOutputStream dos = new DataOutputStream(바이트 기반 출력 스트림);
메소드
- DataInputStream: readBoolean(), readByte(), readChar(), readDouble() 등
- DataOutputStream: writeBoolean(), writeByte(), writeChar(), writeDouble() 등
❗️ 데이터 타입과 크기가 모두 다르기 때문에 출력한 데이터를 다시 읽어올 때 출력한 순서와 동일한 순서로 읽어야 한다.
4️⃣ 프린터 보조 스트림
PrintStream ps = new PrintStream(바이트 기반 출력 스트림);
PrintWriter pw = new PrintWriter(문자 기반 출력 스트림);
- 메소드: print(), println()
5️⃣ 객체 입출력 보조 스트림
- ObjectOutputStream: 객체를 직렬화(객체를 바이트 배열로 만드는 것)
- ObjectInputStream: 객체로 역직렬화(바이트 배열을 다시 객체로 복원하는 것)
ObjectInputStream ois = new ObjectInputStream(바이트 기반 입력 스트림);
ObjectOutputStream oos = new ObjectOutputStream(바이트 기반 출력 스트림);
oos.writeObject(객체); // 객체 직렬화하여 출력 스트림으로 보냄
객체타입 변수 = (객체타입) ois.readObject(); // 역직렬화. 원래 타입으로 강제 변환해야 함
✓ 입출력 관련 API
1. System.in 필드: 콘솔로부터 데이터를 입력받음
2. System.out 필드: 콘솔에 데이터를 출력함
3. System.err: 에러를 출력
4. Scanner 클래스: 문자 파일이나 바이트 기반 입력 스트림에서 라인 단위 문자열을 쉽게 읽도록 하기 위해 java.util 패키지에서 제공하는 클래스
5. File 클래스: 파일 및 폴더(디렉터리) 정보를 제공해주는 역할
'컴퓨터 & 코딩 > Java' 카테고리의 다른 글
[혼공학습단 10기][혼공자] 6주차 미션 (0) | 2023.07.27 |
---|---|
[혼공학습단 10기][혼공자] 5주차 미션 (0) | 2023.07.23 |
[혼공학습단 10기][혼공자] 컬렉션 프레임워크 (0) | 2023.07.20 |
[혼공학습단 10기][혼공자] 스레드 제어 (0) | 2023.07.18 |
[혼공학습단 10기][혼공자] 4주차 미션 (0) | 2023.07.17 |