Java의 바이트 단위 입출력
InputStream
바이트 수준 입력 스트림에 대한 최상위 추상 클래스입니다
주요 하위 클래스에는 FileInputStream
, ByteArrayInputStream
, FilterInputStream
이 포함됩니다.
이러한 클래스에는 파일 또는 바이트 배열 메모리에서 바이트 단위로 데이터를 읽고 기본 스트림에서 데이터를 읽을 때 추가 기능을 제공하는 메서드가 있습니다.
- InputStream은 읽으려는 파일이 없을 경우 Not Found 에러를 발생시킵니다
주요 하위 클래스
스트림 클래스 | 설명 |
---|---|
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() | 입력 스트림과 연결된 대상 리소스를 닫습니다. |
예제 코드
public class FileInputStreamTest3 {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("input2.txt")){
byte[] bs = new byte[10];
int i;
while ( (i = fis.read(bs)) != -1){
/*for(byte b : bs){
System.out.print((char)b);
}*/
for(int k= 0; k<i; k++){
System.out.print((char)bs[k]);
}
System.out.println(": " +i + "바이트 읽음" );
}
/*while ( (i = fis.read(bs, 1, 9)) != -1){
for(int k= 0; k<i; k++){
System.out.print((char)bs[k]);
}
System.out.println(": " +i + "바이트 읽음" );
}*/
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("end");
}
}
read를 사용하다보면, 버퍼에 데이터가 남아있는데 그대로 출력하는 경우가 있다.
메모리 공간을 재사용하는 상황에서 이전 데이터를 지우지 않기 때문이다.
읽을 자료만큼만 읽으면 되니, 필요한 만큼만 데이터를 읽자
while ( (i = fis.read(bs)) != -1){
// k<i로 범위를 지정해서 딱 필요한 만큼만 읽도록 한다
for(int k= 0; k<i; k++){
System.out.print((char)bs[k]);
}
System.out.println(": " +i + "바이트 읽음" );
}
OutputStream
바이트 수준 출력 스트림에 대한 최상위 추상 클래스입니다
주요 하위 클래스에는 FileOutputStream
, ByteArrayOutputStream
및 FilterOutputStream
이 포함됩니다.
이러한 클래스에는 파일 또는 바이트 배열 메모리에 바이트 단위로 데이터를 쓰고 기본 스트림에서 데이터를 쓸 때 추가 기능을 제공하는 메서드가 있습니다.
- OutputStream은 출력 파일이 없으면, 파일을 만들어줍니다
- 기본적으로 쓸 때 출력 파일의 처음부터 쓰기 때문에 덮어쓰는 위험이 존재합니다
- 만약 이어서 적고 싶다면
FileOutputStream("text.txt",true)
처럼 옵션을 주어 해결 합니다
- 만약 이어서 적고 싶다면
주요 하위 클래스
스트림 클래스 | 설명 |
---|---|
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() | 출력 스트림과 연결된 대상 리소스를 닫습니다. 출력 버퍼가 비워집니다. |
예제 코드
public class FileOutputStreamTest1 {
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("출력이 완료되었습니다.");
}
}
flush() 와 close() 메서드
- 출력 버퍼를 비울때 flush() 메서드를 사용
- close() 메서드 내부에서 flush()가 호출되므로 close()메서드가 호출되면 출력 버퍼가 비워짐
레퍼런스
부족한 점이나 잘못 된 점을 알려주시면 시정하겠습니다 :>
728x90
'DEV > Java' 카테고리의 다른 글
Java의 보조 스트림 - 🐥 카카오 테크 캠퍼스 (0) | 2023.05.03 |
---|---|
Java의 문자 단위 입출력 - 🐥 카카오 테크 캠퍼스 (0) | 2023.05.03 |
Java의 입출력 스트림 - 🐥 카카오 테크 캠퍼스 (0) | 2023.05.03 |
Java의 로그 남기기 - 🐥 카카오 테크 캠퍼스 (0) | 2023.05.03 |
Java의 예외처리 - 🐥 카카오 테크 캠퍼스 (0) | 2023.05.03 |