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()메서드가 호출되면 출력 버퍼가 비워짐
레퍼런스
부족한 점이나 잘못 된 점을 알려주시면 시정하겠습니다 :>
댓글