카테고리 없음

[Android] 입출력 스트림(InputStream, OutputStream)

코딩하는후운 2023. 4. 10. 17:09
반응형

Stream이란
외부에서 데이터를 읽거나 외부로 데이터를 출력하는 작업이 자주 일어난다.
이때 데이터가 이동하는 통로를 Stream이라고 한다.
InputStream, OutputStream
추상 클래스이며 추상 메서드를 오버라이딩해서 역할을 수행 (예: 파일, 네트워크, 메모리 입출력)

InputStream

외부에서 데이터를 읽는 역할
바이트 기반 입력 스트림 최상위 추상 클래스
파일 데이터를 읽거나 네트워크 소켓을 통해 데이터를 읽거나 키보드에서 입력한 데이터를 읽을 때 사용.

public abstract int read() throws IOException;

입력 스트림에서 1 바이트씩 읽고 읽은 바이트를 반환한다.
데이터를 모두 읽었다면 -1을 반환

public int read(byte buffer[]) throws IOException {
	return (read(buffer, 0, buffer.length);
}

입력 스트림에서 byte buffer []만큼 읽고 읽은 데이터 수를 반환.
데이터를 모두 읽었다면 -1을 반환
read() 메서드와 다른 점은 read() 메서드의 반환 값이 읽은 데이터가 아니라 읽은 데이터 수라는 점입니다.
읽은 데이터는 매개변수로 넘긴 buffer에 저장됩니다.

public int read(byte buffer[], int off, int len) throws IOException

입력 스트림에서 buffer [off]부터 len개만큼 buffer에 저장합니다.
읽은 데이터 개수를 반환하고 더 이상 읽을 데이터가 없다면 -1을 반환
len개를 읽지 못하면 실제로 읽은 데이터 수를 반환

int len = 4;
int readCnt = 0;
int offset = 0;
byte[] buffer = new byte[1024];

while ((readCnt = is.read(buffer, offset, len)) != -1) {
    offset += readCnt;
    for (int index = 0; index < offset; index++) {
        System.out.print(buffer[index]);
    }
    System.out.println();

}

데이터를 4개씩 읽으며, 다시 읽을 때 배열 처음 위치가 아닌 offset위치부터 읽습니다.
offset은 읽은 데이터 수(readCnt)만큼 증가, 읽을 데이터의 수가 꼭 len값으로 나누어 떨어지지 않기 때문에 offset은 읽은 데이터 수만큼 증가해주어야 한다. (보통 네트워크 통신 시 사용)
 

OutputStream

외부로 데이터를 출력하는 역할
바이트 기반 출력 스트림의 최상위 추상클래스

public abstract void write(int b) throws IOException
public void write01() throws IOException {
    byte[] bytes = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};

    File file = new File("D://write_test.txt");
    OutputStream outputStream = new FileOutputStream(file);

    for (byte b : bytes) {
        outputStream.write(b);
    }

    //바이트를 한번에 넣을 수 있다.  
    //outputStream.write(bytes);

    outputStream.close();
}

바이트 배열을 write_text.txt 파일에 write 하는 예제
OutputStream을 상속받은 FileOutputStream을 생성하고, 한 바이트씩 write 하거나 여러 바이트씩 write 할 수 있다.

public void write(byte b[], int off, int len) throws IOException
public void write() throws IOException {
    byte[] bytes = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 7, 8, 7, 8, 5, 2, 4};
    int len = 3;
    int offset = 0;
    int total = bytes.length;

    File file = new File("D://write_test.txt");
    OutputStream outputStream = new FileOutputStream(file);

    while (total >= (offset + len)) {
        outputStream.write(bytes, offset, len);
        offset += len;
    }

    if (total - offset > 0) {
        outputStream.write(bytes, offset, total - offset);
    }

    outputStream.close();
}

byte 배열을 offset부터 len만큼 write 합니다.
 

파일 읽어와서 출력

public void read() throws IOException {
    File file = new File("D://write_test.txt");
    InputStream inputStream = new FileInputStream(file);
    int b;
    while ((b = inputStream.read()) != -1) {
        System.out.print(b);
    }
}

write_test.txt로 write 한 데이터를 한 바이트씩 꺼내서 출력합니다.

public void flush() throws IOException {}

버퍼를 지원하는 경우 버퍼에 존재하는 데이터를 목적지까지 보냅니다.

public void close() throws IOException { }

OutputStream을 종료합니다.
 
참조 :
https://bamdule.tistory.com/179

반응형