컴퓨터공학 💻 도서관📚

Part2. 6-16 여러가지 보조 스트림 클래스들 본문

✅🌲강의 복습 노트/패캠 JavaSpring 강의,코드 복습

Part2. 6-16 여러가지 보조 스트림 클래스들

들판속초록풀 2025. 8. 31. 18:18

보조 스트림

  • 실제 읽고 쓰는 스트림이 아닌 보조 기능을 제공하는 스트림
    (보조 스트림은 읽고 쓰는 기능은 없고  감싸서 다른 기능을 제공한다
    보조 스트림은 또 다른 보조 스트림을 계속 감쌀 수 있다.
    보조스트림은 읽고 쓰는 기능이 없어 혼자 돌아갈 수 없기 때문에
    반드시 다른 인풋, 아웃풋 스트림을 생성자의 매개변수로 받는다
    (보조 스트림들은 다 매개변수로 스트림을 받는다 ,  혼자 못 돌아가기 때문에)
    그래서 매개변수로 다른 스트림의 기능을 호출하고 거기에 자기가 플러스 알파를 해준다.
    부가적인 기능을 제공하는 방법이 클래스로 제공이 된다)
  • FilterInputStream과 FilterOutputStream이 보조 스트림의 상위 클래스들
  • 생성자의 매개변수로 또 다른 스트림(기반 스트림이나 다른 보조 스트림)을 가짐
  • Decorator Pattern으로 구현 되어 있다
    여러 개의 다양한 기능이 조합될 수 있게끔 제공하는 패턴 중 하나가 데코레이터 패턴인데
    자바의 입출력 스트림 , 보조 스트림은 데코레이터 패턴으로 구현되어 있다.
    (밑에 타원형의 기반 스트림을 컴포넌트 , 보조 스트림을 데코레이터라고 부른다)
  • 상위 클래스 생성자

InputStreamReader와 OutputStreamWriter

  • 바이트 단위로 읽거나 쓰는 자료를 문자로 변환해주는 보조 스트림 (이걸로 한글 출력 가능)
  • FileInputStream으로 읽은 자료를 문자로 변환해주는 예
public class InputStreamReaderTest {

	public static void main(String[] args) {
                                                   // 보조 스트림으로 인풋 스트림을 감싸고 있다.
		try(InputStreamReader isr = new InputStreamReader(new FileInputStream("reader.txt"))){
			int i;
			while( (i = isr.read()) != -1){  //보조 스트림으로 읽습니다.
				System.out.print((char)i);
			}
		}catch(IOException e) {
			e.printStackTrace();
		}
	}
}

BufferedInputStream과 BufferedOutputStream

  • 약 8k의 배열이 제공되어 입출력이 빠르게 하는 기능이 제공되는 보조 스트림
  • BufferedReader와 BufferedWriter는 문자용 입출력 보조 스트림
  • BufferedInputStream과 BufferedOutputStream을 이용하여 파일 복사하는 예
    (밑에 코드에서 파일 인풋, 아웃풋 스트림이어서 버펄드 인풋, 아웃풋 스트림으로 감쌌고
    파일 리더인 경우는 버펄드 리더로 감싸면 된다.)
    (시간이 28513 걸렸다고 나오면 28초라는 뜻이다.)
    (버펄드 리더에는 readLine() 이라는 함수가 제공이 되는데 이게 버펄드 리더밖에 없는 기능이다.
     이건 어떤 웹문서 같은 게 new line 되어 있는 문서가 있을 때 그걸 한 줄씩 읽으려고 하면 버펄드 리더로 반환하고
     readLine() 메서드로 한 줄을 읽으면 굉장히 편하게 코딩을 할 수 있다.)
public class BufferedStreamTest {

	public static void main(String[] args) {

		long millisecond = 0;    // long으로 선언
		try(FileInputStream fis = new FileInputStream("a.zip");  // try 리소소 선언부 안에 여러 개 선언
				FileOutputStream fos = new FileOutputStream("copy.zip");
				BufferedInputStream bis = new BufferedInputStream(fis);   // 위에 꺼를 보조 스트림을 감싼다.
				BufferedOutputStream bos = new BufferedOutputStream(fos)){  // 위에 꺼를 보조 스트림을 감싼다.
		
			millisecond = System.currentTimeMillis();  // 현재 시간 재기
			
			int i;
			while( ( i = bis.read()) != -1){
				bos.write(i);
			}
			
			millisecond = System.currentTimeMillis() - millisecond;  // 걸린 시간 구하기
		}catch(IOException e) {
			e.printStackTrace();
		}
		
		System.out.println("파일 복사 하는 데 " + millisecond + " milliseconds 소요되었습니다.");
	}
}

DataInputStream과 DataOutputStream

  • 자료가 메모리에 저장된 상태 그대로 읽거나 쓰는 스트림
    자료가 메모리에 저장된 상태가 있는데 그거를 그대로 읽거나 쓰는 스트림이다

    만약에 똑같은 정수다라고 해도,
    바이트 정수가 있을 수 있고, short 정수가 있고, Integer 정수가 있을 수 있는데
    근데 그거를 바이트면 한 바이트, 인트면 4바이트, 이런 식으로
    그대로 쓰고 그대로 저장을 하고, 그 다음에 그대로 다시 복원을 하는 그런 스트림이다.

    얘네들은 보조 스트림이기 때문에 이미 읽거나 쓰는 스트림이 있는 상태에서 걔네들을 wrapping해서
    사용하는 스트림이다.

    그리고 이걸 사용할 때는 메서드를 그 자료형에 맞게 써야 한다.
  • DataInputStream 메서드

  • DataOutputStream 메서드

public class DataStreamTest {

	public static void main(String[] args) {


		try(FileOutputStream fos = new FileOutputStream("data.txt");
				DataOutputStream dos = new DataOutputStream(fos))
		{
		
			dos.writeByte(100);
			dos.writeChar('A');
			dos.writeInt(10);
			dos.writeFloat(3.14f);
			dos.writeUTF("Test");    // String은 writeUTF 메서드를 사용한다.
		}catch(IOException e) {
			e.printStackTrace();
		}
		
		try(FileInputStream fis = new FileInputStream("data.txt");
				DataInputStream dis = new DataInputStream(fis))
		{
		
			System.out.println(dis.readByte());   // 자료형에 맞게 메서드 쓰기
			System.out.println(dis.readChar());
			System.out.println(dis.readInt());
			System.out.println(dis.readFloat());
			System.out.println(dis.readUTF());
		}catch (IOException e) {
			e.printStackTrace();
		}
	}
}
 
Comments