컴퓨터 & 코딩/Java

[혼공학습단 10기][혼공자] 입출력 스트림

구로그 2023. 7. 22. 01:11
728x90

✓ 입출력 스트림

- 자바에서 데이터는 스트림을 통해 입출력된다.

- 프로그램이 도착지면 흘러온 데이터를 입력받아야 하기 때문에 입력 스트림을 사용

- 프로그램이 출발지면 데이터를 출력해야 하므로 출력 스트림을 사용

 

 

 

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) BufferedOutputStreamBufferedWriter

프로그램에서 전송한 데이터를 내부 버퍼에 쌓아 두었다가 버퍼가 꽉 차면 버퍼의 모든 데이터를 한꺼번에 보낸다. 

BufferedOutputStream bos = new BufferedOutputStream(바이트 기반 출력 스트림);
BufferedWriter bw = new BufferedWriter(문자 기반 출력 스트림);

 

 

2) BufferedInputStreamBufferedReader

입력 소스로부터 자신의 내부 버퍼 크기만큼 데이터를 미리 읽고 버퍼에 저장한다.

프로그램은 외부 입력소스로부터 직접 읽는 대신 버퍼로부터 읽음으로써 읽기 성능이 향상된다.

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 클래스: 파일 및 폴더(디렉터리) 정보를 제공해주는 역할 

 

 

[혼공학습단 10기][혼공자] 변수와 시스템 입출력

✓ 출력하기 println() : 출력 후 행 바꿈 print() : 단순 출력 printf("형식문자열", 값1, 값2, ...): 괄호 안의 첫 번째 문자열 형식대로 내용을 출력 ✏️ 형식문자열 ⇨ 구조: %[argument_index$] [flags] [width] [.

hianzhi.tistory.com

 

 

 

반응형