자바에서의 I/O는 입출력 순서가 있는 일련의 데이터인 스트림을 통해 이루어지며, 스트림 클래스에 바탕을 둔 I/O 기능을 위해 java.io라는 패키지를 제공하고 있습니다.

여기에 바이트 단위 입출력 스트림 최상위 추상 클래스인 InputStream/OutputStream은 데이터를 읽어오거나 출력하는 메서드들이 선언되어 있습니다.

InputStream

InputStream은 모든 입력 스트림 클래스의 상위 클래스로 입력에 관련된 기본적인 메서드들을 제공하고 있습니다.

InputStream의 주요 하위 클래스는 다음과 같습니다.

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

이러한 InputStream에는 이런 메서드들을 가지고 있습니다.

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

OutputStream

OutputStream은 모든 출력 스트림 클래스의 상위 클래스로 출력에 관련된 기본적인 메서드들을 제공하고 있습니다.

OutputStream의 주요 하위 클래스는 다음과 같습니다.

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

이러한 OutputStream에는 이런 메서드들을 가지고 있습니다.

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

FileInputStream & FileOutputStream

FileInputStream 클래스는 파일로부터 데이터를 읽기 위해 사용됩니다. 생성자가 호출될 때 파일을 열 수 없으면 예외(FileNotFoundException)가 발생하기 때문에 항상 try-catch 문을 사용하여 예외가 발생할 상황을 대비해야 합니다.

FileInputStream은 "ABC"라는 내용이 입력된 input.txt파일이 존재할 때, 아래와 같이 파일 내용 끝까지 한 바이트씩 데이터를 읽을 수 있습니다.

public class FileInputStreamTest {

	public static void main(String[] args) {

		try(FileInputStream fis = new FileInputStream("input.txt")){ 
			int i;
			while ( (i = fis.read()) != -1){
				System.out.println((char)i);
			}
			System.out.println("end");
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

결과

ABC

FileOutStream 클래스는 FileInputStream과 유사하며, 데이터를 파일에 저장하기 위해 사용되어지는 클래스입니다.

이러한 클래스들의 메서드들은 파일에 대하여 동작한다는 것을 제외하면 InputStream이나 OutputStream 클래스와 같다고 볼 수 있습니다.

output.txt파일에 "ABC"를 한 바이트씩 쓰는 코드는 다음과 같습니다.

public class FileOutputStreamTest {

	public static void main(String[] args) {
		
		try(FileOutputStream fos = new FileOutputStream("output.txt")){
			fos.write(65);  //A
			fos.write(66);  //B
			fos.write(67);  //C
		}catch(IOException e) {
			e.printStackTrace();
		}
		System.out.println("출력이 완료되었습니다.");
	}
}

결과

출력이 완료되었습니다.

파일에 정상적으로 쓰여졌다면 콘솔에 출력이 완료되었습니다.라고 출력되며, output.txt 파일에 "ABC"라는 글자가 저장된 것을 확인할 수 있을 것입니다.

ByteArrayInputStream & ByteArrayOutputStream

ByteArrayInputStream & ByteArrayOutputStream은 바이트 배열을 입력 스트림의 입력 대상이나 출력 스트림의 출력 대상으로 사용하는 클래스입니다.

이 클래스들의 메서드들은 배열에 대하여 동작한다는 것을 제외하면 역시 InputStream과 OutputStream 클래스와 같습니다.

ByteArrayInputStream에서, 입력의 대상이 되는 바이트 배열은 생성자의 매개변수로 지정하고 ByteArrayOutputStream 클래스에서, 버퍼의 크기를 생성자의 매개변수로 줄 수 있습니다.

FilterInputStream & FilterOutputStream

FilterInputStream & FilterOutputStream은 데이터를 읽거나 쓸 때 값을 수정하는 작업을 부가적으로 할 수 있는 메서드들을 갖고 있는 클래스입니다.

이상으로 자바에서 사용하는 바이트 단위 입출력 스트림에 대해서 간단하게 알아봤습니다.

profile
꾸준함으로 성장하는 개발자 지망생

0개의 댓글