Java

바이트 단위 입출력 스트림

yanJuicy 2024. 9. 12. 00:35
반응형

InputStream

바이트 단위 입력 스트림의 최상위 추상 클래스다

많은 추상 메서드가 선언되어 있고 이를 하위 스트림이 상속받아 구현한다

주요 하위 클래스는 다음과 같다

스트림 클래스 설명
FileInputStream 파일에서 바이트 단위로 자료를 읽는다
ByteArrayInputStream byte 배열 메모리에서 바이트 단위로 자료를 읽는다
FilterInputStream 기반 스트림에서 자료를 읽을 때 추가 기능을 제공하는 보조 스트림의 상위 클래스

주요 메소드는 다음과 같다

메서드 설명
int read() 입력 스트림으로부터 한 바이트의 자료를 읽는다. 읽은 자료의 바이트 수를 반환한다
int read(byte b[]) 입력 스트림으로 부터 b[] 크기의 자료를 b[]에 읽는다. 읽은 자료의 바이트 수를 반환한다
int read(byte b[], int off, int len) 입력 스트림으로 부터 b[] 크기의 자료를 b[]의 off변수 위치부터 저장하며 len 만큼 읽는다. 읽은 자료의 바이트 수를 반환한다
void close() 입력 스트림과 연결된 대상 리소스를 닫는다

FileInputStream 예제

다음은 파일에서 한 바이트씩 자료 읽는 예제다

import java.io.FileInputStream;
import java.io.IOException;

public class FileInputStreamTest1 {

    public static void main(String[] args) {
        FileInputStream fis = null;

        try {
            fis = new FileInputStream("input.txt");

            System.out.println((char) fis.read());
            System.out.println((char) fis.read());
            System.out.println((char) fis.read());

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (NullPointerException e) {
                e.printStackTrace();
            }
        }

        System.out.println("end");
    }

}

파일 경로에 특정 경로를 지정하지 않으면 기본적으로 프로젝트 경로부터 찾는다

image

바이트 배열 단위로 자료를 읽을 수 있다

이 경우에는 배열에 남아 있는 자료가 있을 수 있따

import java.io.FileInputStream;
import java.io.IOException;

public class FileInputStreamTest3 {

    public static void main(String[] args) {

        try (FileInputStream fis = new FileInputStream("input.txt")) {

            byte[] bs = new byte[10];
            int i;

            while ((i = fis.read(bs)) != -1) {
                for (byte b : bs) {
                    System.out.print((char) b);
                }
                System.out.println(": " + i + " bytes read");
            }

        } catch (IOException e) {
            e.printStackTrace();
        }

        System.out.println("end");
    }

}

실행 결과는 다음과 같다

image

다음처럼 마지막에 6개만 읽어서 뒤에 4개 자료가 남아있다

다음처럼 byte 배열에 남아있는 전체 자료를 읽는 것이 아니라 읽어온 갯수만큼 출력을 반복하면 해결된다

/*for(byte b : bs){
    System.out.print((char)b);
}*/
for(int k= 0; k<i; k++){
    System.out.print((char)bs[k]);
}

OutputStream

바이트 단위 출력 스트림의 최상위 클래스다

많은 추상 메소드가 선언되어 있고 이를 하위 스트림이 상속받아 구현한다

주요 하위 클래스는 다음과 같다

스트림 클래스 설명
FileOutputStream 파일에서 바이트 단위로 자료를 쓴다
ByteArrayOutputStream byte 배열 메모리에서 바이트 단위로 자료를 쓴다
FilterOutputStream 기반 스트림에서 자료를 쓸 때 추가 기능을 제공하는 보조 스트림의 상위 클래스

주요 메소드는 다음과 같다

메서드 설명
int write() 한 바이트를 출력한다
int write(byte b[]) b[] 크기의 자료를 출력한다
int write(byte b[], int off, int len) b[] 배열에 있는 자료의 off 위치부터 len 개수만큼 자료를 출력한다
void flush() 출력을 위해 잠시 자료가 머무르는 출력 버퍼를 강제로 비워 자료를 출력한다
void close() 출력 스트림과 연결된 대상 리소스를 닫는다. 출력 버퍼를 비운다

FileOutputStream 예제

파일에 한 바이트씩 쓰는 예제

파일에 쓰기를 할 때 파일이 없으면 자동으로 만든다

import java.io.FileOutputStream;
import java.io.IOException;

public class FileOutputStreamTest1 {

    public static void main(String[] args) {
        try (FileOutputStream fos = new FileOutputStream("output.txt")) {
            fos.write(65);  // A
            fos.write('B');
            fos.write(67);  // C
        } catch (IOException e) {
            e.printStackTrace();
        }

        System.out.println("출력 완료");
    }

}

byte[] 배열을 한꺼번에 파일에 쓰기

import java.io.FileOutputStream;
import java.io.IOException;

public class FileOutputStreamTest2 {

    public static void main(String[] args) throws IOException {
        FileOutputStream fos = new FileOutputStream("output2.txt");

        try (fos) {
            byte[] bs = new byte[26];
            byte data = 65;

            for (int i = 0; i < bs.length; i++) {
                bs[i] = data++;
            }

            fos.write(bs);
        } catch (IOException e) {
            e.printStackTrace();
        }

        System.out.println("출력 완료");
    }

}

A~Z까지 파일에 써진다

flush(), close()

출력 버퍼를 비울 때 flush() 메소드를 사용한다

네트워크에서 소켓에 데이터가 차기 전에 보낼 때 주로 사용한다

close() 메소드 내부에서 flush()가 호출된다

반응형

'Java' 카테고리의 다른 글

문자 단위 입출력 스트림  (1) 2024.09.26
표준 입출력 스트림  (0) 2024.09.19
IO Stream  (0) 2024.09.05
wait(), notify()를 활용한 동기화  (0) 2024.08.29
로그 남기기  (0) 2024.08.26