JAVA/JAVA 기본

JAVA ioStream

엔테아 2017. 10. 11. 18:47

파일 입력/출력(IO)

 

스트림은 First In, First Out(fifo)구조를 통함

(선입선출법)

 

자바프로그램

 

현재 프로그래머가 작성중인 자바 프로그램

 

 

 

입력

←

inputstream

장치

 

-키보드

-마우스

-메모리

-프린터

-파일

-DB 등

출력

→

outputstream

 

스트림의 종류

1. 전송되는 데이터의 크기로 분류

- 바이트스트림 : 1바이트 전송 : 멀티미디어 파일 등에 사용 ~Stream으로 끝남

- 문자스트림 : 2바이트 전송 : 텍스트파일에 사용 ~er로 끝남

2. 특별한 기능을 갖는 스트림 여부

- 장치와 직접적으로 연결이 되는지 여부에 따라 나뉨

- 노드스트림 : 장치와 직접적으로 연결되는 스트림

- 필터스트림 : 장치와 직접적으로 연결하면 안 됨. 특별한 기능을 가지고 있음

 

범주

클래스명

설명

기타

byte스트림

InputStream

입력에 관한 부모클래스

 

OutputStream

출력에 관한 부모클래스

 

문자 스트림

Reader

입력에 관한 부모클래스

 

Writer

출력에 관한 부모클래스

 

 

바이트스트림별 사용시기

필터스트림

좀 더 빠른 속도를 위해서

ex) 일반 스트림의 속도를 더 빠르게 함

데이터스트림

특정 데이터를 전달하기 위해서

ex) 특정 데이터값(int, float, String등)을 전달

오브젝트스트림

특정 오브젝트를 전달하기 위해서

ex) 특정 오브젝트(Dog클래스 등의 클래스 내용을 전달함)

ex2) new Dog("D001", "name", 3); 의 전달도 가능

 

 

일반적인 경우

자바프로그램

←

car.jpg

→

cpcar.jpg

 

필터스트림의 사용

자바프로그램

←

​필터스트림

←

​노드스트림

car.jpg

→

​필터스트림

→

​​노드스트림

cpcar.jpg

InputStream in = null;
BufferedInputStream bis = null;
OutputStream out = null;
BufferedOutputStream bos = null;

in = new FileInputStream("c:\\car.jpg");
bis = new BufferedInputStream(in);
   
out = new FileOutputStream("c:\\cp3car.jpg");
bos = new BufferedOutputStream(out);
   
int what = -1;
   
while(true) {
     what = bis.read();
     if(what == -1) {
           break;
     }
     bos.write(what);
}
System.out.println("end");

필터스트림은 '항상' 노드스트림보다 먼저 close(); 되어야 함.

자바 프로그램에서 가까운쪽의 스트림부터 제거해나가야 함.

​입/출력은 자바프로그램에서 가까운 쪽을 이용해서 사용함.

 

데이터스트림의 사용

자바프로그램

←

​데이터 인풋

​스트림

←

​노드스트림

a.txt

→

데이터 아웃풋

​스트림

→

​​노드스트림

a.txt

  OutputStream out = null;
  DataOutputStream dos = null;
  
  try {
   out = new FileOutputStream("c:\\a.txt");
   dos = new DataOutputStream(out);
   
   dos.writeInt(365);
   dos.writeFloat(3.14F);
   dos.writeUTF("hello");
  }

  InputStream in = null;
  DataInputStream dis = null;
  
  try {
   in = new FileInputStream("c:\\a.txt");
   dis = new DataInputStream(in);
   int year = dis.readInt();
   float pie = dis.readFloat();
   String hello = dis.readUTF();
   System.out.println(year);
   System.out.println(pie);
   System.out.println(hello);
  }

 

 

인풋스트림리더의 사용

자바프로그램

←

버퍼드스트림

←

인풋스트림리더

←

노드스트림 

memo.txt

InputStream in = null;
InputStreamReader isr = null;
BufferedReader br = null;
  
try {
     in = new FileInputStream("c:\\memo.txt");
     isr = new InputStreamReader(in);
     br = new BufferedReader(isr);
   
     while(true) {
          String str = br.readLine();
          if(str == null) {
               break;
          }
          System.out.println(str);
     }
}

 

오브젝트스트림의 사용

자바프로그램

→

오브젝트스트림

→

노드스트림

 

자바프로그램

←

오브젝트스트림

←

노드스트림

 

OutputStream out = null;
ObjectOutputStream os = null;
  
try {
     out = new FileOutputStream("c:\\show.txt");
     os = new ObjectOutputStream(out);
   
     os.writeObject(new Dog("d001", "happy", 4));
     os.writeObject(new Dog("d002", "merry", 10));
}

InputStream in = null;
ObjectInputStream ois = null;
  
try {
     in = new FileInputStream("c:\\show.txt");
     ois = new ObjectInputStream(in);
   
     Dog d1 = (Dog)ois.readObject();
     Dog d2;
     Object obj = ois.readObject();
     if(obj instanceof Dog) {
          d2 = (Dog)obj;
          System.out.println(d2);
   }

 

문자스트림의 사용

자바프로그램

→

노드스트림

go.txt

←

노드스트림

go.txt

Writer out = null;
Reader in = null;
  
try {
     out = new FileWriter("c:\\go.txt");
     out.write("hello");
     out.write(System.getProperty("line.separator"));
     out.write("hi");
   
     out.flush();
   
     in = new FileReader("c:\\go.txt");
     char[] arr = new char[2];
     int leng = -1;
   
     while(true) {
          leng = in.read(arr, 0, arr.length);
          if(leng == -1) {
               break;
          }
          for(int i = 0; i < leng; i++) {
               System.out.print(arr[i]);
          }

     }
}

out.write(System.getProperty("line.separator"));

는 줄바꿈을 만드는 코드이다.

이는 ("\r\n");역시 마찬가지이나, 위의 것이 모든 운영체제에서 작동한다.

out.flush();

는 문자스트림에서 인풋과 아웃풋을 하나에서 같이 사용할 때, 꼭 사용해야 하는 메소드이다.

 

문자스트림 bufferedWriter의 사용

자바프로그램

→

버퍼드라이터

→

노드스트림

must.txt

자바프로그램

←

버퍼드리더

←

노드스트림

must.txt

Writer out = null;
BufferedWriter bw = null;
Reader in = null;
BufferedReader br = null;
  
try {   
     out = new FileWriter("c:\\must.txt");
     bw = new BufferedWriter(out);
   
     bw.write("안녕하세요");
     bw.newLine();
     bw.write("hello world");
     bw.newLine();
   
     bw.flush();
   
     in = new FileReader("c:\\must.txt");
     br = new BufferedReader(in);
   
     while(true) {
          String msg = br.readLine();
          if(msg == null) {
               break;
          }
          System.out.println(msg);
     }
}

 

ioStream 기본 작성법

InputStream in = null;

OutputStream out = null;

try~catch문 작성

첫번째 try~catch문에 finally 추가

finally에 try~catch문 추가

finally내부 try~catch문에 if문을 사용

    if(in != null) {
     in.close();
    }
    if(out != null) {
     out.close();
    }

첫번째 try에 해야 할 작업을 입력

 

팁.

System.currentTimeMillis();은

1970년 1월 1일 0시 0분 0초 000을 0으로 가정함.

1970년 1월 1일 0시 0분 0초 001은 1이 됨

 

팁.

중요한 값이기에 io스트림 사용을 막고 싶다면, transient를 사용하면 된다.

ex) private transient int age;

 

팁.

c:\\memo.txt

는

"c:"+file.separator+"memo.txt"처럼 넣어주는 것이 호환성에 좋다.

file.separator 는 \\와 같은 기능을 한다.