본문 바로가기
  • Coding & Book
학습단/JAVA 학습단

23. 혼공자 23일차(보조 스트림)

by 루이3 2023. 8. 16.

보조스트림

  • 보조스트림이란 다른 스트림과 연결이 되어 여러 가지 편리한 기능을 제공해주는 스트림을 말합니다.
  • 보조 스트림은 자체적으로 입출력을 수행할 수 없습니다.
  • 보조 스트림은 문자 변환, 입출력 성능 향상, 기본타입 입출력등의 기능을 제공합니다.
  • 아래는 입력 스트림과 출력 스트림에 보조 스트림을 연결한 모습을 가상화한것 입니다.

 

 

보조 스트림 연결하기

  • 보조 스트림을 연결하려면 보조 스트림을 생성할 때
    자신이 연결될 스트림을 다음과 같이 생성자의 매개값으로 제공하면 됩니다.
보조스트림 변수 = new 보조스트림(연결스트림)

 

예시)

InputStream을 문자 변환 보조 스트림인 InputStreamReader에 연결하는 코드

InputStream is =...;
InputStreamReader reader = new  InputStreamReader(is);

 

문자 변환 보조 스트림

  • 소스 스트림이 바이트 기반 스트림이라면서 입출력 데이터가 문자라면
    Reader와 Writer로 변환해서 사용하는것을 고려할수 있습니다.

 

OutputStreamWriter

  • OutputStreamWriter는 바이트 기반 출력 스트림에 연결되어 문자 출력 스트림인
    Writer로 변환 하는 보조 스트림입니다.
Writer writer = new OuetputStreamWriter(바이트 기반 출력 스트림);

 

InputStreamReader

  • InputStreamReader는 바이트 기반 입력 스트림에 연결되어 문자 입력 스트림인
    Reader로 변환 하는 보조 스트림입니다.
Reader reader = new InputStreamReader(바이트 기반 입력 스트림);

 

 

성능향상 보조스트림

  • 프로그램이 입출력소스와 직접 작업하지 않고 중간에 메모리 버퍼와 작업함으로 써
    실행 성능을 향상시킬 수 있습니다.
  • 예시로 프로그램이 직접 하드에 데이터를 보내지 않고 메모리 버퍼에 데이터를 보냄으로 쓰기속도가 향상됩니다.

 

BufferedOutputStream과 BufferedWriter

  • BufferedOutputStream은 바이트 기반 출력 스트림에 연결되어 버퍼를 제공해주는 보조 스트림입니다.
  • BufferedWriter는 문자 기반 출력 스트림에 연결되어 버퍼를 제공해주는 보조 스트림입니다.
  • BufferedOutputStream과 BufferedWriter는 프로그램에서 전송한 데이터를 내부 버퍼에 쌓아 두었다가 
    버퍼가 꽉차면, 버퍼의 모든 데이터를 한꺼번에 보냅니다.
  • 프로그램 입장에서 보면 메모리버퍼로 데이터를 고속 전송하기 때문에 출력 성능이
    향상되는 효과를 얻게 됩니다.
BufferedOutputStream bos = new BufferedOutputStream(바이트 기반 출력 스트림);
BufferedWriter bw = new BufferedWriter(문자 기반 출력 스트림);

 

BufferedInputStream과 BufferedReader

  • BufferedInputStream은 바이트 기반 입력 스트림에 연결되어 버퍼를 제공해주는 보조스트림입니다.
  • BufferedReader는 문자 기반 입력 스트림에 연결되어 버퍼에 제공해주는 보조 스트림입니다.
  • 두개 모두 입력소스로 부터 자신의 내부 버퍼 크기만큼 데이터를 미리 읽고 버퍼에 저장해둡니다.
  • BufferedReader는 라인 단위로 문자열을 익는 매우 편리한 readLine()메소드를 제공합니다.
BufferedInputStream bis = new BufferedInputStream(바이트 기반 입력 스트림);
BufferedReader br = new BufferedReader(문자 기반 입력 스트림);

 

예시)

라인 단위로 문자열 읽기

package sec20.exam01;

import java.io.*;

public class ReadLine {

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		Reader reader = new FileReader(
				ReadLine.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();
		}
}

 

 

기본 타입 입출력 보조 스트림

  • DataInputStream과 DataOutputStream 보조 스트림을 연결하면
    기본 타입인 boolean,char,shor,int,long,float,double을 입출력할수 있습니다.
  • 아래 코드는 DataInputStream과 DataOutputStream 객체를 생성하는 코드 입니다.
DataInputStream dis = new DataInputStream(바이트 기반 입력 스트림);
DataOutputStream dos = new DataOutputStream(바이트 기반 출력 스트림);

 

예시)

이름 등급 순위 순으로 파일에 출력하고 다시 파일로부터 입력받는 코드

package sec20.exam01;

import java.io.*;


public class DataInputOutputStreamExample {

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		FileOutputStream fos = new FileOutputStream("저장위치/test.db");
		DataOutputStream dos = new DataOutputStream(fos);
		
		dos.writeUTF("아이언맨");
		dos.writeUTF("A+");
		dos.writeInt(1);
		
		dos.writeUTF("토르");
		dos.writeUTF("A+");
		dos.writeInt(2);
		
		dos.flush(); dos.close(); fos.close();
		
		FileInputStream fis = new FileInputStream("저장위치/test.db");
		DataInputStream dis = new DataInputStream(fis);
		
		for(int i=0; i<2; i++) {
			String name = dis.readUTF();
			String score = dis.readUTF();
			int order = dis.readInt();
			System.out.println(name + " : " + score + " : " + order);
		}
		
		dis.close(); fis.close();
	}
}

 

 

프린터 보조 스트림

  • PrintStream과 PrintWriter는 프린터와 유사하게 출력하는 print(),println() 메소드를
    가지고 있는 보조 스트림입니다.
  • PrintStream과 PrintWriter는 다른 보조 스트림과 마찬가지로 연결할 출력 스트림을
    생성자의 매개값으로 받습니다.
PrintStream ps = new PrintStream(바이트 기반 출력 스트림);
PrintWriter pw = new PrinterWriter(문자 기반 출력 스트림);

 

PrinterStream / PrinterWriter
void print(boolean b) void println(boolean b)
void print(char c) void println(char c)
void print(double d) void println(double d)
void print(float f) void println(float f)
void print(int i) void println(int i)
void print(long l) void println(long l)
void print(Object obj) void println(Object obj)
void print(String s) void println(String s)
    void println()

 예시) 라인단위로 출력하는 코드 입니다.

package sec20.exam01;

import java.io.*;


public class PrintStreamExample {

	public static void main(String[] args) throws Exception {
		FileOutputStream fos = new FileOutputStream("저장위치/print.txt");
		PrintStream ps = new PrintStream(fos);
		
		ps.println("프린터에서");
		ps.print("출력하는 것처럼");
		ps.println("보입니다.");
		
		ps.flush();
		ps.close();
	}
}

 

 

객체 입출력 보조 스트림

  • ObjectOutputStream과 ObjectInputStream 보조 스트림을 연결하면 메모밀에 생성된
    객체 파일 또는 네트워크로 출력할수 있습니다.
  • ObjectOutputStream은 객체를 직렬화 하는 역할을 합니다.
  • ObjectInputStream은 객체로 역직렬화 하는 역할을 합니다.
ObjectInputStream ois = new ObjectInputStream(바이트 기반 입력 스트림);
ObjectOutputStream oos = new ObjectOutputStream(바이트 기반 출력 스트림);

 

'학습단 > JAVA 학습단' 카테고리의 다른 글

6주차 완료  (0) 2023.08.17
24. 혼공자 24일차(입출력 관련 API)  (0) 2023.08.17
22. 혼공자 22일차(입출력 스트림_2)  (0) 2023.08.15
21. 혼공자 21일차(입출력 스트림)  (0) 2023.08.14
5주차 완료  (0) 2023.08.12