그냥 ‘스트림’과 ‘I/O 스트림’의 차이는?
• 스트림의 주제
데이터를 어떻게 원하는 형태로 걸러내고 가공할 것인가?
• I/O 스트림의 주제
어떻게 데이터를 입력하고 출력할 것인가?
• 파일에 저장된 문자열을 꺼내어 컬렉션 인스턴스에 저장
→ ‘I/O 스트림’으로 해결해야 할 부분
• 컬렉션 인스턴스에 저장된 문자열 중 길이가 5 이상인 문자열만 출력
→ ‘스트림’으로 해결해야 할 부분
I/O 스트림 모델의 소개
프로그램의 상당 부분은 다음 대상의 입출력과 관련이 있다. 그리고 이들에 대한 자바의 입출력 방식을 가리켜 I/O 모델이라 한다.
• 파일
• 키보드와 모니터
• 그래픽카드, 사운드카드
• 프린터, 팩스와 같은 출력장치
• 인터넷으로 연결되어 있는 서버 또는 클라이언트
I/O 모델과 스트림(Stream)의 이해, 그리고 파일 대상의 입력 스트림 생성
• 입력 스트림 (Input Stream): 실행 중인 자바 프로그램으로 데이터를 읽어 들이는 스트림
• 출력 스트림 (Output Stream): 실행 중인 자바 프로그램으로부터 데이터를 내보내는 스트림
InputStream in = new FileInputStream("date.dat"); // 입력 스트림 생성
int data = in.read(); // 데이터 읽어 들임
OutputStream out = new FileOutputStream("date.dat"); // 출력 스트림 생성
out.write(7); // 데이터 7을 파일에 전달
파일 대상 입출력 스트림 생성의 예
class Write7ToFile {
public static void main(String[] args) throws IOException {
OutputStream out = new FileOutputStream("data.dat"); // 출력 스트림 생성
out.write(7); // 7을 저장
out.close(); // 스트림 종료
}
}
class Read7FromFile {
public static void main(String[] args) throws IOException {
InputStream in = new FileInputStream("data.dat"); // 입력 스트림 생성
int dat = in.read(); // 데이터 읽음
in.close(); // 입력 스트림 종료
System.out.println(dat);
}
}
7
입출력 스트림 관련 코드의 개선: finally 기반 close
class Write7ToFile2 {
public static void main(String[] args) throws IOException {
OutputStream out = null;
try {
out = new FileOutputStream("data.dat");
out.write(7);
}
finally {
if(out != null) // 출력 스트림 생성 성공했다면,
out.close();
}
}
}
class Read7FromFile2 {
public static void main(String[] args) throws IOException {
InputStream in = null;
try{
in = new FileInputStream("data.dat");
int dat = in.read();
System.out.println(dat);
}
finally {
if(in != null) // 입력 스트림 생성 성공했다면,
in.close();
}
}
}
입출력 스트림 관련 코드의 개선: try-with-resource 기반
class Write7ToFile3 {
public static void main(String[] args) {
try(OutputStream out = new FileOutputStream("data.dat")) {
out.write(7);
}
catch(IOException e) {
e.printStackTrace();
}
}
}
class Read7FromFile3 {
public static void main(String[] args) {
try(InputStream in = new FileInputStream("data.dat")) {
int dat = in.read();
System.out.println(dat);
}
catch(IOException e) {
e.printStackTrace();
}
}
}
바이트 단위 입출 및 출력 스트림
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("대상 파일: ");
String src = sc.nextLine();
System.out.print("사본 이름: ");
String dst = sc.nextLine();
try(InputStream in = new FileInputStream(src) ;
OutputStream out = new FileOutputStream(dst)) {
int data;
while(true) {
data = in.read(); // 파일로부터 1 바이트를 읽는다.
if(data == -1) // 더 이상 읽어 들일 데이터가 없다면,
break;
out.write(data); // 파일에 1바이트를 쓴다.
}
}
catch(IOException e) {
e.printStackTrace();
}
}
바이트 단위 파일 복사 프로그램!
보다 빠른 속도의 파일 복사 프로그램
1K바이트 버퍼 기반 파일 복사 프로그램!
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("대상 파일: ");
String src = sc.nextLine();
System.out.print("사본 이름: ");
String dst = sc.nextLine();
try(InputStream in = new FileInputStream(src) ;
OutputStream out = new FileOutputStream(dst)) {
byte buf[] = new byte[1024];
int len;
while(true) {
len = in.read(buf); // 배열 buf로 데이터를 읽어 들이고, (더 이상 읽어 들일 데이터 없으면 -1 반환)
if(len == -1)
break;
out.write(buf, 0, len); // len 바이트만큼 데이터를 저장한다.
}
}
catch(IOException e) {
e.printStackTrace();
}
}
public int read(byte[] b) throws IOException
→ 파일에 저장된 데이터를 b로 전달된 배열에 저장
public void write(byte[] b, int off, int len) throws IOException
→ b로 전달된 배열의 데이터를 인덱스 off에서부터 len 바이트만큼 파일에 저장
'# 02 > Java' 카테고리의 다른 글
[윤성우 열혈자바] 32-3. 문자 스트림의 이해와 활용 (0) | 2019.10.28 |
---|---|
[윤성우 열혈자바] 32-2. 필터 스트림의 이해와 활용 (0) | 2019.10.28 |
[윤성우 열혈자바] 31-2. 시간대를 적용한 코드 작성 그리고 출력 포맷의 지정 (0) | 2019.10.28 |
[윤성우 열혈자바] 31-1. 시각과 날짜 관련 코드의 작성 (0) | 2019.10.28 |
[윤성우 열혈자바] 30-3. 스트림의 최종 연산 (0) | 2019.10.28 |