[Close()]

=> Java 코드가 메모리에 생성한 것이 아닌 것과 

작성을 할 때는 사용이 끝나면 사용이 종료 되었다는 것을알려주어야합니다. 


=> 이때 사용되는 메소드 이름은 대부분 close, disconnect, release(자원에 대한 해제, 이거 다썼다 ) 


어떤 문제가 생기는가 ? 


이 이유로 인해서 대부분의 코드가 아래처럼 작성됩니다. 


자원을 사용하는 클래스에 변수를 만들고 null을 대입합니다. 

try를 만들어서 안에서 자원을 사용 

try안에서 클로즈를 할 수 없는 이유는 

클로즈를 하기전에 문제가 발생하면 클로즈를 못함 

그렇기에  finally를 만들어서 finally에서 자원을 해제 합니다. 



클래스 s =  null;


try{


}catch(Exception e ) {


System.out.println("예외" + e.getMessage());


}finally {


try {

if (ois != null) {

// 종료

s.close();

}

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

  }

}






**AutoCloseable 인터페이스 

- java 1.7 에서부터 사용됨 

=> 일정시간동안 사용하지 않으면, 자동으로 Close 해주는 메소드를 소유한 인터페이스

이 인터페이스가 implements 클래스는 close()하지 않아도 자동으로 연결해제 됩니다. 



[사용방법]


**try ~ with ~ Resourece

//괄호 안에서 생성한 객체는 예외가 발생하지 않으면 try 끝에서 close()를 호출하고 

//예외가 발생하면, 즉시 close()를 부릅니다. 

try(객체생성 ){

}

catch(    ) {  } 





버퍼가 출력되지 못한 상태에서 프로그램이 종료되버리면, 끝까지 데이터가 출력되지 못할 수 도 있다. 

그러므로 Close() 호출해주어서 버퍼에 남아있던 모든 내용이 출력되도록해주어야한다.

Stream에 대한 정의 



 **Stream ( 데이터를 주고 받기 위한 통로 )


외부 HW나 파일 또는 네트워크와 데이터를 주고받을 수 있는 통로 


[일반적으로 스트림을 쓰는 경우 ]


스트림

  Program              <======================>  File, Network (Soket), H/W ( keyboard, Monitor) 

  

  


  

  keyboard와 연결된 스트림은 System.int

  Monitor와 연결된 스트림은 System.out

  

  


  

[ 방향에 따른 분류 ]

  

1) Input Stream 

  

2) Output Stream  

  


[ 데이터에 따른 분류 ]

  

1) Byte Stream     : 일반적인 스트림 

  

2) Character Stream : 문자 단위로 해석 

  

  문자에는 Encoding이 있다 





  AComputer <-----------------> BComputer

   A컴퓨터와 B컴퓨터가 통신을 하고 싶다 . 

  

  OS  == OS      운영체제마다 Default가 있다. // 운영체제가 다르면 안된다 

      언어 ==언어     프로그래밍 언어어도 같아야한다 . 

운영체제와 언어가 다르면 Character를 안쓰고 ByteStream을써야한다.


[처리과정]


             //try안에 작성을 한다.

try{  

     1) 스트림 생성 

     2) 읽고 쓰기 

}

   //반드시 닫아하기 때문에 finally에 저장 

finally { 

      3) 스트림 닫기  ( 항상 닫아야합니다 ) 

}

프로그램이 종료되지 않는다면, 상관이 없는데 

종료가 안되면 문제가 생긴다. 

java.io의 close()를 해주지 않으면 어떤 문제가 생길까요 ? 



Data에 수정을 하기 위해 접근을 하면,  Lock에는  eXclusive와  Shared가 있습니다.

Lock에는 Write는 1개, Read는  n개가 있습니다.

수정을 할 때는 eXclusive가 있는지 확인해보고 eXclusive가 있으면 수정의 권한을 가지게됩니다. 

그러나 Close()를 해주지 않으면 eXclusive는 이미 다른 프로그램에 사용중이라서 

다른 프로그램은 Data에 수정으로 접근을 할수 없습니다. 

단, 읽기는 n개가 있기 때문에 수에 제약을 받지 않습니다. 




Stream을 이용한 파일복사 









파일이나 전송되어온 데이터가 많은 경우에는 부분적으로 읽어서 기록하는 것이 효율적입니다.


아래 방법은 데이터를 나누어 배열에 넣어 나누어서 출력하는 코드입니다. 



package IO;


import java.io.FileInputStream;

import java.io.FileOutputStream;


public class ByteMain {


public static void main(String[] args) { // TODO Auto-generated method stub

// 파일에 바이트 단위로 기록할 수 있는 스트림을 생성


// try {

// // true를 쓰면 이어붙이기가 됩니다.

// FileOutputStream fos = new FileOutputStream("test.txt", true);

//

// byte [] b ="Hello".getBytes();

//

// fos.write(b);

//

//

// //계속 예외처리하라고 하면 Exception으로 바꿔주기

// fos.close();

// } catch (Exception e) {

// // TODO Auto-generated catch block

// e.printStackTrace();

// }


// FileOutputStream fos = new FileOutputStream("test.txt", true);


FileOutputStream의 매개변수 자리에 true 를 사용하면 

test 파일 안에 문자가 리셋되는 것이 아니라 

계속 추가되어 문자가 쓰여진다.


/***************************************************************************************************/

// try {

//

// FileInputStream fis = new FileInputStream("test.txt");

// // 1개 읽기

// int r = fis.read();

// System.out.println(r);

// fis.close();

// } catch (Exception e) {

// System.out.println(e.getMessage());

// }



//텍스트 파일 생성 

/***************************************************************************************************/

try {


FileInputStream fis = new FileInputStream("test.txt");

byte[] b = new byte[fis.available()];

fis.read(b);


// String(byte[] bytes)

// Constructs a new String by decoding the specified array of bytes using the

// platform's default charset.


//new String 생성자를 생성해서 

// byte의 숫자를 문자로 형변환 해준다. 

//String 클래스의 생성자중 byte 배열을 Charset으로 변화해주는 생성자를 쓰면 쉽게 숫자를 문자로 바꾸어 

읽어 올 수 있다.  

System.out.println(new String(b));


// for(byte x : b ) {

// System.out.println(x);

// }

// System.out.println(b);

fis.close();

} catch (Exception e) {

System.out.println(e.getMessage());

}

}


}









+ Recent posts