상세 컨텐츠

본문 제목

IO 패키지 (InputStream, read(), FileReader, FileOutputStream)

기록 - 프로그래밍/Java

by wjjun 2024. 2. 29. 13:00

본문

 

자바 데이터는 스트림을 통해 입출력 되는데 특징에 대해 알아보겠습니다.

java.io 패키지 주요 클래스 설명
File 파일 시스템 파일 정보를 얻기 위한 클래스
Console 콘솔로부터 문자를 입출력 하기 위한 클래스
InputStream / OutputStream 바이트 단위 입출력 위한 최상위 입출력 스트림 클래스
FileInputStream / FileOutputStream
DataInputStream / DataOutputStream
ObjectInputStream / ObjectOutputStream
PrintStream
BufferedInputStream / BufferedOutputStream
바이트 단위 입출력 위한 하위 입출력 스트림 클래스
Reader / Writer 문자 단위 입출력 위한 최상위 입출력 스트림 클래스
FileReader / FileWriter
InputStreamReader / OutputStreamWriter
PrintWriter
BufferedReader / BufferedWriter
문자 단위 입출력 위한 하위 스트림 클래스

 

스트림 클래스는 바이트 기반 스트림과 문자 기반 스트림 두 가지로 구분됩니다.

바이트 기반 스트림은 그림, 멀티미디어, 문자 등 모든 종류 데이터를 받고 보낼 수 있습니다.

문자 기반 스트림은 문자만 받고 보낼 수 있습니다.

 

 

InputStream

바이트 입력 기반 스트림 최상위 클래스로

모든 바이트 기반 입력 스트림 클래스는 이 클래스를 상속 받습니다.

 

InputStream 클래스에는 바이트 기반 스트림에서 필요한 메서드가 정의되어 있습니다.

int read() 입력 스트림으로부터 1 바이트를 읽고 읽은 바이트를 리턴한다
int read(byte[] b) 입력 스트림으로부터 읽은 바이트들을 매개값으로 주어진 바이트 배열 b에 저장하고 실제로 읽은 바이트 수를 리턴한다
int read(byte[] b, int off, int len) 입력 스트림으로부터 len개의 바이트만큼 읽고 매개값으로 주어진 바이트 배열 b[off]부터 len개까지 저장한다. 그리고 실제 읽은 바이트수만 len개를 리턴한다. 만약 len개를 모두 읽지 못하면 실제로 읽은 바이트 수를 리턴한다.
void close() 사용한 시스템 자원을 반납하고 입력 스트림을 닫는다.

 

 

read(byte[] b)

입력스트림으로 부터 100개의 바이트가 들어오면 read() 메서드는 100번 루핑해서 읽어야 한다. 그러나 ㄱㄷㅁㅇ(byte[] b) 메서드는 한 번 읽을 때 매개값으로 주어진 바이트 배열 길이만큼 읽기 때문에 루핑 횟수가 줄어든다.

그래서 많은 양의 바이트를 읽을 때는 read(byte[] b) 메서드를 사용하는 것이 좋다.

 

close()

InputStream을 더 이상 사용하지 않을 경우에 사용하며 close() 메서드를 호출해서 InputStream 에서 사용했던 시스템 자원을 해제합니다.

 

 

OutputStream

모든 바이트 기반 출력 스트림이 기본적으로 가져야할 메서드가 정의되어 있습니다.

리턴타입 메서드 설명
void wirte(int b) 출력 스트림으로 1바이트를 보낸다
void write(byte[] b) 출력 스트림으로 주어진 바이트 배열 b의 모든 바이트를 보낸다
void write(byte[] b, int off, int len 출력 스트림으로 주어진 바이트 배열 b[off]부터 len개까지 바이트를 보낸다
void flush() 버퍼에 잔류하는 모든 바이트를 출력한다
void close() 사용한 시스템 자원을 반납하고 출력 스트림을 닫는다

 

wirte(int b) 메서드

매개변수로 주어진 int 값에서 끝에 있는 1바이트만 출력 스트림으로 보낸다.

매개 변수가 Int 타입이므로 4바이트 모두를 보내는 것으로 오해할 수 있다.

 

byte -> (int b) -> OutputStream

 

write(byte[] b) 메서드

매개값으로 주어진 바이트 배열의 모든 바이트를 출력 스트림으로 보냅니다.

 

byte -> b[0], b[1], b[2], b[3]... -> (byte b[]) -> OutputStream .. (3), (2), (1)

 

flush(), close()

프로그램에서 더 이상 출력할 데이터가 없다면 flush() 메서드를 호출해 버퍼에 남아있는 모든 데이터가 출력되게 해야 합니다.

OutputStream을 더 이상 사용하지 않을 경우 close() 메서드를 호출해 OutputStream이 사용한 시스템 자원을 풀어줘야 합니다.

 

read() 메서드

read() 메서드가 리턴한 int 값을 char 타입으로 변환하면 읽은 문자를 얻을 수 있습니다.

 

read(char[] cbuf) 메서드

입력 스트림으로부터 매개값으로 주어진 문자 배열 길이만큼 문자를 읽고 배열에 저장합니다. 읽은 문자수를 리턴합니다. 실제 읽은 문자 수가 배열 길이보다 작을 경우 읽은 수만큼만 리턴합니다.

 

read(char[] cbuf, int off, int len) 메서드

read(char[] cbuf, int off, int len) 메서드는 입력 스트림으로부터 len개의 문자만큼 읽고 매개값으로 주어진 문자 배열 cbuf[off]부터 len개까지 저장합니다. 그리고 읽은 문자수인 len개를 리턴합니다. 실제 읽은 문자 수가 len개 보다 작을 경우 읽은 수만큼 리턴합니다.

 

 

File

파일 정보와 파일을 읽고 생성하는데 사용할 수 있습니다.

리턴타입 메서드 설명
boolean canExecute() 실행할 수 있는 파일인지 여부
boolean canRead() 읽을 수 있는 파일인지 여부
String getName() 파일 이름을 리턴
String getParent() 부모디렉토리 리턴
String getPath() 전체 디렉토리 리턴
String[] list() 디렉토리에 포함된 파일 및 서브 디렉토리 목록 전부 String 배열로 리턴

 

FileInputStream

바이트 단위로 읽기 때문에 그림, 오디오, 비디오, 텍스트, 파일 등 모든 종류의 파일을 읽을 수 있습니다.

 

문자열로된 파일 경로를 가지고 FileInputStream 을 생성

File file = new File("C:/Temp/image.gif");
FileInputStream fls = new FileInputStream(file)

 

FileOutputStream

파일이 이미 존재할 경우 데이터를 출력하면 파일을 덮어쓰게 되어 기존 내용이 사라질 수 있습니다.

기존 파일 내용 끝에 데이터를 추가할 경우 FileOutputStrweam 생성자의 두 번째 매개값을 true로 주면 됩니다.

FileOutputStream fis = new FileOutputStream("C:/Temp");
FileOutputStream fis = new FileOutputStream(file, true);

 

FileReader

문자 단위로 읽기 때문에 텍스트가 아닌 그림, 오디오, 비디오 등의 파일은 읽을 수 없습니다.

 

관련글 더보기

댓글 영역