13주차 과제: I/O
목표
자바의 Input과 Ontput에 대해 학습하세요.
목차
1. 스트림 (Stream) / 버퍼 (Buffer) / 채널 (Channel) 기반의 I/O
2. InputStream과 OutputStream
3. Byte와 Character 스트림
4. 표준 스트림 (System.in, System.out, System.err)
5. 파일 읽고 쓰기
1. 스트림 (Stream) / 버퍼 (Buffer) / 채널 (Channel) 기반의 I/O
- 스트림(Stream)
데이터 전송 통로
- 스트림은 단방향이라 입출력을 동시에 하기 위해선 input stream, output stream이 필요하다.
- 큐 형식(FIFO)을 가진다.
- 스트림은 입출력 장치와 자바 응용프로그램을 연결
- 바이트나 문자 단위로 입출력
- 버퍼(Buffer)
데이터 임시 저장 공간
버퍼를 사용하면 입력을 저장했다가 한 번에 보낸다.
- 채널(Channel)
양방향으로 하나의 채널로 입출력이 가능하며 비동기적으로 데이터를 읽고 쓸 수 있다.
2. InputStream과 OutputStream
바이트 단위 입출력을 위한 최상위 클래스
하위 스트림 클래스 | 입출력 대상 |
FileInputStream/FileOutputStream | 파일 |
ByteArrayInputStream/ByteArrayOutputStream | 메모리 |
PipedInputStream/PipedOutputStream | 프로새스 |
AudioInputStream/AudioOutputStream | 오디오 |
InputStream 메소드
메소드 | 내용 |
int read(byte[] b) | 읽은 바이트들을 배열에 저장하고 읽은 바이트 수를 반환 |
int read(byte[] b, int off, int len) | 배열의 off위치에 len만큼의 바이트를 읽어서 읽은 바이트 수를 반환 |
abstract int read() | 1바이트를 읽고 int 값으로 반환. 읽어올 데이터가 없으면 -1을 반환 |
int available() | 읽을 수 있는 바이트 수 반환 |
void close() | 사용하던 자원을 반환하고 스트림을 닫음 |
void mark(int readlimit) | 현재 위치를 표시 |
boolean markSupported() | mark()와 reset()은 선택적으로 지원하는 기능이기 때문에, 해당 기능을 지원하는지 확인 |
void reset() | mark()를 마지막으로 호출한 위치로 이동 |
long skip(long n) | n바이트 데이터를 스킵한고 바이트 수를 반환 |
OutputStream 메소드
메소드 | 내용 |
void write(byte[] b) | 배열에 저장된 내용 출력 |
void write(byte[] b, int off, int len) | 배열의 off부터 len 만큼을 출력 |
abstsract void write(int b) | 정수 b 의 하위 1바이트를 출력 |
void close() | 스트림 닫음 |
void flush() | 버퍼에 남은 출력 스트림을 출력 |
3. Byte와 Character 스트림
바이트 기반 스트림의 최상위 - InputStream, OutpuStream
문자 기반 스트림의 최상위 - Reader, Writer
(1) 바이트 기반 스트림
바이트를 다루기 때문에 문자든 이미지든 보낼 수 있다.
바이트 스트림을 다루는 클래스는 공통적으로 이름 뒤에 Stream을 붙인다.
(2) 문자 기반 스트림
문자만 다루며 문자 하나의 크기는 2바이트이다.
문자 스트림을 다루는 클래스는 Reader/Writer를 붙인다.
4. 표준 스트림 (System.in, System.out, System.err)
표준 입출력으로 콘솔로부터의 데이터 출입력.
- System.in : 콘솔로부터 데이터를 입력받음
- System.out : 콘솔로부터 데이터를 출력
- System.err : 콘솔로 오류를 출력
5. 파일 읽고 쓰기
클래스 | 내용 |
FileWriter | 문자 기반 스트림. 텍스트를 파일에 저장. |
BufferedWriter | 버퍼에 받아 파일에 쓴다 |
FileReader | 파일 읽는 기능 제공 |
BufferedReader | 버퍼에 받아 파일을 출력한다 |
파일생성
File file = new File("파일경로");
FileWriter
import java.io.FileWriter;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
FileWriter fw = new FileWriter("test.txt", true); // 기존에 있는 파일이라면 덮어쓰고, true를 설정하면 기존파일에 이어서 쓴다.
fw.write("파일에 글을 써보자");
fw.close();
}
}
BufferedWriter
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedWriter bw = new BufferedWriter(new FileWriter("파일경로"));
bw.write("버퍼를 이용해서");
bw.write("파일에 글을 써보자");
bw.close();
}
}
BufferedWriter와 FileWriter를 같이 사용하면 속도가 향상된다.
FileReader
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("파일경로");
String str;
while((str = fr.readLine()) != null){
System.out.println(str);
}
fr.close();
}
}
BufferedReader
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("파일경로");
BufferedReader br = new BufferedReader(fr);
String str;
while((str = br.readLine()) != null){
System.out.println(str);
}
br.close();
}
}
명품 JAVA Programming/황기태,김효수