1. InputStream
InputStream 은 바이트 단위로 읽는 스트림 중 최상위 스트림이다.
InputStream 은 추상 메서드를 포함한 추상 클래스로 하위 클래스에서 추상 메서드를 구현한다.
<InputStream 하위 클래스>
FileInputStream | 파일에서 바이트 단위로 자료 읽기 |
ByteArrayInputStream | Byte 배열에서 바이트 단위로 자료 읽기 |
FilterInputStream | 입력 스트림의 보조 스트림의 상위 클래스 |
<InputStream 클래스 메서드>
read() 반환형은 int로 더 이상 읽어들일 자료가 없는 경우에 -1 반환
int read() | 입력 스트림으로부터 한 바이트 자료 읽기 읽은 자료 바이트 수 반환 |
int read(byte b[]) | 입력 스트림으로부터 b[] 크기의 자료를 b[] 에 읽기 읽은 자료 바이트 수 반환 |
int read(byte b[], int off, int len) | 입력 스트림으로부터 b[] 크기의 자료를 b[]의 off 위치부터 len만큼 읽기 읽은 자료 바이트 수 반환 |
void close() | 입력 스트림과 연결된 대상 리소스 닫기 (ex. FileInputStream 인 경우 파일 닫음) |
2. FileInputStream
FileInputStream 은 InputStream 중 가장 많이 사용하는 클래스로
파일에서 바이트 단위로 자료를 읽을 때 사용하는 스트림 클래스다.
<FileInputStream 클래스 생성자>
생성자 | 매개변수 | 설명 |
FileInputStream(String name) | 파일 이름(경로 포함) | 입력스트림 생성 |
FileInputStream(File f) | File 클래스 정보 |
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) {
System.out.println(e);
} finally{
try {
fis.close(); // 파일 닫기
} catch (IOException e) {
System.out.println(e);
} catch (NullPointerException e){
System.out.println(e);
}
}
System.out.println("end");
}
}
- IOException: input.txt 파일이 없는 경우, FileNotFoundException 처리
- NullPointerException: input.txt 파일이 없어 스트림을 생성하지 못하여 스트림이 null 인 경우, 예외 처리
1. 파일에서 자료 읽기
- (char)fis.read(): 한 바이트씩 자료를 읽어 아스키코드 값으로 반환-> 문자로 변환
2. 파일 끝까지 읽기
파일에 내용이 얼만큼 있는지 모르는 경우, 파일의 끝에 도달할 때까지 반복해서 읽어야 한다.
read() 메서드는 파일의 끝에 도달하면 -1을 반환한다.
while ( (i = fis.read()) != -1){
System.out.println((char)i);
}
3. int read(byte[] b) 메서드로 읽기
선언한 바이트 배열의 크기만큼 한꺼번에 자료를 읽어 처리 속도가 빠르다. 읽은 자료의 바이트 수를 반환한다.
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]);
}
}
(주의) 마지막으로 읽어들인 바이트 수가 선언한 바이트 배열보다 작을 수 있으므로 바이트 배열의 크기가 아닌 읽어들인 바이트 수만큼의 값만 활용한다.
3. OutputStream
OutputStream 은 바이트 단위로 쓰는 스트림 중 최상위 스트림이다.
<OutputStream 하위 클래스>
FileOutputStream | 파일에 바이트 단위로 자료 쓰기 |
ByteArrayOutputStream | Byte 배열에 바이트 단위로 자료 쓰기 |
FilterOutputStream | 출력 스트림의 보조 스트림의 상위 클래스 |
<InputStream 클래스 메서드>
int write(int b) | 한 바이트 자료 출력 |
int write(byte b[]) | b 배열의 자료 출력 |
int wirte(byte b[], int off, int len) | b 배열의 off 위치부터 len 만큼 자료 출력 |
void flush() | 출력을 위해 자료가 잠시 대기하는 출력 버퍼를 강제로 비워 자료 출력 |
void close() | 출력 스트림과 연결된 대상 리소스 닫기 (ex. FileInputStream 인 경우 파일 닫음) |
4. FileOutputStream
FileOutPutStream 은 파일에 바이트 단위 자료를 출력하기 위해 사용하는 스트림이다.
<FileOutputStream 클래스 생성자>
생성자 | 매개변수 | 설명 | |
FileOutputStream(String name) | 파일 이름(경로 포함) | 출력스트림 생성 | |
FileOutputStream(String name, boolean append) | 파일 이름(경로 포함) | 이어쓰기 설정 (디폴트 false) |
|
FileInputStream(File f) | File 클래스 정보 | ||
FileOutputStream(File f, boolean append) | File 클래스 정보 | 이어쓰기 설정 (디폴트 false) |
1. write() 메서드 사용하기
- fos.write(): 숫자를 해당 아스키코드 값의 문자로 변환하여 출력
2. write(byte[] b) 메서드 사용하기
바이트 배열에 있는 자료를 한꺼번에 출력한다.
FileOutputStream fos = new FileOutputStream("output2.txt",true);
try(fos){ //java 9 부터 제공되는 기능
byte[] bs = new byte[26];
byte data = 65; //'A' 의 아스키 값
for(int i = 0; i < bs.length; i++){ // A-Z 까지 배열에 넣기
bs[i] = data;
data++;
}
fos.write(bs); //배열 한꺼번에 출력하기
}catch(IOException e) {
e.printStackTrace();
}
3. write(byte[] b, int off, int len) 메서드 사용하기
배열의 전체 자료를 출력하지 않고 배열의 off 위치부터 len 길이만큼 출력한다. 즉, 배열의 일부를 출력할 때 사용한다.
try(FileOutputStream fos = new FileOutputStream("output3.txt"))
{
byte[] bs = new byte[26];
byte data = 65; //'A' 의 아스키 값
for(int i = 0; i < bs.length; i++){ // A-Z 까지 배열에 넣기
bs[i] = data;
data++;
}
fos.write(bs, 2, 10); // 배열의 2 번째 위치부터 10 개 바이트 출력하기
}catch(IOException e) {
e.printStackTrace();
}
4. flush() 메서드와 close() 메서드
1) flush() 메서드
flush() 는 강제로 자료를 출력하는 것이다. 자료의 양이 출력할 만큼 많지 않으면 write() 메서드로 출력했어도 파일에 쓰이지 않거나 전송되지 않을 수 있다. 따라서, 이런 경우에 flush() 메서드를 사용한다.
'Java > Do It! 자바 프로그래밍' 카테고리의 다른 글
[JAVA] 15-5. 보조 스트림 (0) | 2022.05.12 |
---|---|
[JAVA] 15-4. 문자 단위 스트림 (0) | 2022.05.11 |
[JAVA] 15-2. 자바 입출력_표준 입출력 (0) | 2022.05.11 |
[JAVA] 15-1. 자바 입출력_자바 입출력과 스트림 (0) | 2022.05.11 |
[JAVA] 14. 예외 처리 (0) | 2022.05.11 |