입출력 스트림 (1). 바이트 스트림, 문자 스트림

KIHYUK MOON·2023년 2월 11일
0
post-thumbnail
post-custom-banner

컴퓨터 내부 또는 외부 장치와 프로그램 간의 데이터를 주고 받는것을 입출력이라 한다. 장치와 입출력을 하기 위해서는 하드웨어 장치에 직접 접근이 필요한데 다양한 매체에 존재하는 데이터들을 사용하기 위해 입출력 데이터를 처리할 공통적인 방법으로 스트림을 사용한다.

스트림

자바에서는 파일이나 콘솔의 입출력을 직접 다루지 않고, 스트림(stream)이라는 흐름을 통해 다룹니다.

스트림(stream)이란 실제의 입력이나 출력이 표현된 데이터의 이상화된 흐름을 의미합니다.

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

스트림의 특징

FIFO 구조

먼저 들어간 데이터가 먼저 나오는 형태로 데이터의 순서가 바뀌지 않는다

단방향

하나의 스트림에서 입출력이 동시에 이루어 지지 않는다
입력과 출력에 각각 스트림을 열어 사용해야 한다

지연 가능

-> 단점
스트림 내의 데이터가 모두 전송되기 전까지 프로그램이 지연 상태에 빠질 수 있다.

스트림의 분류

용도에 의한 분류

  • 1차 스트림 : 디바이스에 직접 연결되는 스트림
  • 2차 스트림 : 1차 스트림과 연결을 통해 디바이스와 연결되는 스트림

전송 방향에 의한 분류

  • 입력 스트림 : 디바이스로부터 데이터를 읽어오는 스트림
  • 출력 스트림 : 디바이스로 데이터를 출력하는 스트림

전송단위에 의한 분류

  • 바이트 스트림 : 1 Byte 단위로 입력, 출력하는 스트림
  • 문자 스트림 : 한 문자(2 Byte) 단위로 입력, 출력하는 스트림

보조 스트림

  • 스트림의 기능을 향상시키거나 새로운 기능을 추가시키며, 직접적인 데이터 입출력을 할 수 없다

바이트 스트림

바이트 단위로 데이터를 전송한다. 동용상 이미지 음악 등 바이트로 구성된 파일을 처리하기에 적합하다

OutputStream

바이트 기반 출력 스트림

OutputStream 메소드

public static void main(String[] args) throws IOException {
    OutputStream os = new FileOutputStream("test.db");
    byte a = 10;
    byte b = 20;
    byte c = 30;
    os.write(a);
    os.write(b);
    os.write(c);

    os.flush(); // 버퍼 비우기
    os.close(); // 자원 반납 후 스트림 닫기
}

배열 전체를 출력하기

public static void main(String[] args) throws IOException {
    OutputStream os = new FileOutputStream("test2.db");
    byte[] array = {10, 20, 30};
    os.write(array);
    os.flush();
    os.close();
}

배열 일부를 출력하기

public static void main(String[] args) throws IOException {
    OutputStream os = new FileOutputStream("test3.db");
    byte[] array = {10, 20, 30, 40, 50};
    os.write(array, 1, 3); // 배열의 1번 인댁스 부터 3개 출력
    os.flush();
    os.close();
}

InputStream

바이트 기반 입력 스트림

InputStream 메소드

1바이트씩 읽기

public static void main(String[] args) throws IOException {
    InputStream is = new FileInputStream("test2.db");
    while(true) {
        int data = is.read(); // 1 바이트씩 읽기
        if(data == -1) break; // 파일의 끝에 도달
        System.out.println(data);
    }
    is.close();
}

배열의 길이만큼 읽기

public static void main(String[] args) throws IOException {
    InputStream is = new FileInputStream("test2.db");
    byte[] buffer = new byte[100];
    while(true) {
        int readByteNum = is.read(buffer); // 배열의 길이 만큼 읽기
        if(readByteNum == -1) break;  // 파일의 끝에 도달
        for(int i = 0; i < readByteNum; i++) {
            System.out.println(buffer[i]);
        }
    }
    is.close();
}

지정된 길이만큼 읽기

public static void main(String[] args) throws IOException {
    InputStream is = new FileInputStream("test2.db");
    byte[] buffer = new byte[5];
    int readByteNum = is.read(buffer, 2, 3);
    if(readByteNum != -1) {
        for(int i = 0; i < buffer.length; i++) {
            System.out.println(buffer[i]);
        }
    }
    is.close();
}

문자 스트림

문자단위로 데이터를 전송. 사용방법은 바이트 스트림과 동일하다.

  • InputStream -> Reader
  • OutputStream -> Writer

비교

Writer

Writer 는 문자열 기반 출력 스트림의 최상위 클래스로 추상클래스이다.

Write 메소드

write(int c)

public static void main(String[] args) throws Exception {
		Writer writer = new FileWriter("test.txt");
		char[] data = "곰돌이사육사".toCharArray();
		for(int i=0; i<data.length; i++) {
			writer.write(data[i]);
		}
		writer.flush();
		writer.close();
	}

write(char[] c)

public static void main(String[] args) throws Exception {
		Writer writer = new FileWriter("test.txt");
		char[] data = "곰돌이사육사".toCharArray();
		writer.write(data);

		writer.flush();
		writer.close();
	}

write(char[] c, int off, int len)

public static void main(String[] args) throws Exception {
		Writer writer = new FileWriter("test.txt");
		//char[] data = "곰돌이사육사".toCharArray();
		String data = "곰돌이사육사";
		writer.write(data, 1, 2);

		writer.flush();
		writer.close();
	}

Reader

Reader 는 문자열 기반 입력 스트림의 최상위 클래스로 추상클래스이다.

Reader 메소드

read()
입력 스트림으로 부터 문자를 읽고 int타입으로 리턴한다.
리턴한 int값을 char형으로 변환하면 읽은 문자열을 확인할 수 있다.

public static void main(String[] args) throws Exception {
    Reader reader = new FileReader("src/test.txt");
    int readData;
    while( true ) {
        readData = reader.read();
        if(readData == -1) break;
        System.out.print((char)readData);
    }
    reader.close();
}

read(char[] cbuf)
입력스트림으로 부터 매개변수로 주어진 문자 배열의 길이만큼 문자를 읽고 배열에 저장하고 읽은 문자 수를 리턴. 실제로 읽은 문자 수가 배열 길이 보다 작을 경우 읽은 수만큼만 리턴

public static void main(String[] args) throws Exception {
    Reader reader = new FileReader("src/test.txt");
    int readCharNo;
    char[] cbuf = new char[10];
    String data = "";
    while( true ) {
        readCharNo = reader.read(cbuf);
        if(readCharNo == -1) break;
        data += new String(cbuf, 0, readCharNo);
    }
    System.out.println(data);

    reader.close();
}
profile
개발자 전직중..
post-custom-banner

0개의 댓글