반응형
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");
}
}
파일 경로에 특정 경로를 지정하지 않으면 기본적으로 프로젝트 경로부터 찾는다
바이트 배열 단위로 자료를 읽을 수 있다
이 경우에는 배열에 남아 있는 자료가 있을 수 있따
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");
}
}
실행 결과는 다음과 같다
다음처럼 마지막에 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 |