본문 바로가기

Java

Day 7. 과제(JAVA IO)

JAVA I/O(Input/Output)


기본적으로 데코레이터 패턴을 사용한다. 데코레이터 패턴이란 디자인 패턴의 한 종류이다. 객체의 결합을 통해 기능을 유연하게 확장 할 수 있게 해주는 패턴이라고 한다. 즉, 기본 기능에 추가할 수 있는 기능의 종류가 많은 경우에 각 추가 기능을 Decortor 클래스로 정의 한 후 필요한 Decorator 객체를 조합함으로서 추가 기능의 조합을 쉽게 설계하는 방식이다. 데코레이터 패턴을 쓸 때 주인공과 장식을 구별할 줄 알아야 한다. 


자바 I/O 공부하기 전에 알아야 할 것

1) 자바 IO는 데코레이터 패턴으로 구성된다.

2) 표준입력 : System.in(키보드, InputStream), 표준출력 : System.out(모니터, PrintStream), 표준에러출력 : System.err(모니터, PrintStream)

3) 자바 IO는 바이트(byte) 단위 입출력과 문자(char)단위 입출력이 있다. 

바이트(byte) 단위 입출력 : 클래스 이름이 Stream으로 끝난다. 입력 - InputStream 출력 - OutputStream 으로 끝난다.

문자(char) 단위 입출력 : 클래스 이름이 Reader, Writer로 끝난다. 000Reader, 000Writer로 끝난다.

4) 자바 IO 클래스는 추상 클래스인 InputStream, OutputStream, Reader, Writer 중에 하나를 상속받는다.

5) 장식에 해당하는 클래스는 생성자에 InputStream, OutputStream, Reader, Writer 클래스를 파라미터로 받는다.  



주인공 - 생성자를 보면 InputStream, OutputStream, Reader, Writer를 받아들이지 않는 애들


생성자에 무언가를 넣어준다는 것은 가진다는 뜻이다. 

장식은 가진다. 주인공을 가지고 뭔가를 한다. 자동차 극장은 자동차들을 수용한다. 버스, 트럭, 등등


InputStream 은 추상 클래스이다. 추상 클래스는 인스턴스가 될 수 없다.

InputStream st = new InputStream() -> 불가능하다.


DataInputStream(InputStream in)

-> InputStream을 받아 들인다는 것은 InputStream의 자손, 후손 중에서 인스턴스를 받아들인다는 뜻이다.


그니깐 여기서 DataInputStream()은 장식이고, InputStream은 주인공이다.


JAVA IO 에서 주인공 역할은 어디에서 읽어들일 것인가를 결정하는 것이다.

ex> FileInputStream - 파일로 부터 읽어들인다.

      ByteArrayOutputStream - 바이트 배열에 저장한다.

      has a (가진다_)->다이렉트 어소시에이션


주인공은 간단한 메소드만 가지고 있다.

int read() // byte, char를 읽어들이는 메소드

int read(byte[]) , int read(char[]) 

write(int) // byte, char를 쓰는 메소드

write(byte[]...) write(char[]..)//쓰는 메소드

---------------------------------------------

장식은 굉장히 다양한 메소드를 가지고 있다.

한줄 읽어들인다. 한줄 쓴다. int단위로 읽고 쓴다던지

------------------------------------------------------------

주인공만 쓰면 입출력시 굉장히 불편해짐

-------------------------------------------------------------

한 줄씩 입력받아 , 한줄 씩 쓰시오 - 주인공만으로는 어렵

한 바이트씩 읽어들여 한바이트씩 쓰시오 -주인공으로 가능

byte[]씩 읽어들여 byte[]씩 쓰시오 - 주인공으로 가능

int, char, long으로 읽어들인 후 쓰시오, - 주인공으로 가능

---------------------------


java io 용법 - 클래스 사용법


byte로 읽어들여 byte로 쓴다.


InputStream in = null;

OutputStream out = null;


try{

in = ....;

out = ...;

//이 ...들에 주인공들의 자식이 올수 있는 것이다.


int readCount = 0;//읽어들인 수

byte[] buffer = new byte[1024];

int readBuffer = -1;

while((readBuffer =in.read() != -1){

   out.write(readBuffer);

}

}catch(Exception ex){


}finally{

in, out을 close()한다.

}


FileInputStream, FileOutputStream을 이용하여 파일을

복사하는 클래스


byte --> byte 쓰는 것

byte[] --> byte[] 쓰는 것


위의 2가지 예제를 만드는데 복사한 시간을 출력해보는 예제를

만들어보자


주인공인 애들을 쓸 때는 메소드가 굉장히 단순하다.

한 바이트 읽어들이고 한 바이트를 쓰는 방식이다.


package my.examples.javaexam;

import com.sun.xml.internal.messaging.saaj.util.ByteInputStream;

import java.io.ByteArrayInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

public class IoExample {
public static void main(String[] args) throws Exception {
//InputStream, OutputStream은 추상 클래스
InputStream in = null;
OutputStream out = null;

try {
//byte[]로 읽어들어서 파일에 저장하고 싶다.
byte[] buffer = new byte[]{1,2,3};
in = new ByteArrayInputStream(buffer);//주인공 변수로 byte[]이 들어온다.
out = new FileOutputStream("bytearray.dat");
int readBuffer = -1;
while ((readBuffer = in.read()) != -1) {
out.write(readBuffer);
//in.read()에 1, 2, 3이 리턴되면서 돌다가 벗어나면 -1을 호출하고 while문을 벗어나면서 프로그램이 종료가 됩니다.

}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
in.close();
out.close();
}
}
}
package my.examples.javaexam;

import com.sun.xml.internal.messaging.saaj.util.ByteInputStream;

import java.io.*;

public class IoExample02 {
public static void main(String[] args) throws Exception {
//InputStream, OutputStream은 추상 클래스
InputStream in = null;
OutputStream out = null;

try {
// 파일로 부터 byte 배열을 읽어들인 후 배열에 저장.
in = new FileInputStream("bytearray.dat");
out = new ByteArrayOutputStream();
int readBuffer = -1;
while ((readBuffer = in.read()) != -1) {
out.write(readBuffer);
//in.read()에 1, 2, 3이 리턴되면서 돌다가 벗어나면 -1을 호출하고 while문을 벗어나면서 프로그램이 종료가 됩니다.

}
byte[] buf = ((ByteArrayOutputStream) out).toByteArray();
for(int i = 0; i <buf.length; i++){
System.out.println(buf[i]);
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
in.close();
out.close();
}
}
}
package my.examples.javaexam;

import java.io.*;
import java.net.URL;

public class IoExample03 {
public static void main(String[] args) throws Exception {
//InputStream, OutputStream은 추상 클래스
InputStream in = null;
OutputStream out = null;

try {
//URl url = URL("http://oracle.com");
//in = url.open
in = new FileInputStream("./src/main/java/IoExample.java");
out = new FileOutputStream("file.txt");//프로젝트에 생기는 파일

int readCount = 0;
byte[] buffer = new byte[1024];

while((readCount = in.read(buffer)) != -1){
out.write(buffer,0,readCount);
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
in.close();
out.close();
}
}
}

후기 : 정말 어렵다. 일단 이게 IO의 기본 구조라니깐 달달 외워야겠다. 2강으로 넘어가서 다시 한번 들어봐야겠다.

'Java' 카테고리의 다른 글

어노테이션  (0) 2018.12.15
Day 7. 정렬  (0) 2018.12.14
Day 7. 과제  (0) 2018.12.12
Day 6. Java 로또 프로그램(객체지향)  (0) 2018.12.12
Day 6. file, folder 관계와 컴포시트 패턴  (0) 2018.12.12