
Java
  try {
    예외발생이 예상되는 수행문1;
    예외발생이 예상되는 수행문2;
    수행문3;
  } catch (예외클래스 e) {
    수행문4;
  } catch (예외클래스 e) {
    수행문5;
  } finally {
    수행문6;	// 애플리케이션이 점유했던 자원을 해제하는 수행문
  }
package day3;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
public class ExceptionApp1 {
	public static void main(String[] args) {
		
		FileWriter writer = null;
		
		try {
			writer = new FileWriter("src/day3/sample1.txt"); // 컴퓨터의 입출력 자원 점유
			
			writer.write("finally 블록 연습\n");	// 컴퓨터의 입출력 자원 사용 - 파일에 기록
			writer.write("finally 블록 연습\n");	// 컴퓨터의 입출력 자원 사용 - 파일에 기록
			writer.write("finally 블록 연습\n");	// 컴퓨터의 입출력 자원 사용 - 파일에 기록
			writer.write("finally 블록 연습\n");	// 컴퓨터의 입출력 자원 사용 - 파일에 기록
			writer.write("finally 블록 연습\n");	// 컴퓨터의 입출력 자원 사용 - 파일에 기록
			writer.write("finally 블록 연습\n");	// 컴퓨터의 입출력 자원 사용 - 파일에 기록
			writer.write("finally 블록 연습\n");	// 컴퓨터의 입출력 자원 사용 - 파일에 기록
			
			// 아래의 코드는 try블록내의 모든 수행문이 오류없이 실행ㄷ왼 후에 실행되는 수행문이다.
			// try블록내의 수행문 실행 중 오류가 발생하면 실행되지 않는 수행문이다.
			// * 점유했던 자원을 해제시키는 수행문의 위치로 적절하지 않음.
			// writer.close(); // 프로그램이 점유했던 컴퓨터의 자원을 해제하는 수행문
			
		} catch (IOException e) {
			e.printStackTrace();
			// 아래의 코드는 try블록내의 수행문에서 오류가 발생할 떄만 실행되는 수행문이다
			// * 점유했던 자원을 해제시키는 수행문의 위치로 적절하지 않음.
			// writer.close(); // 프로그램이 점유했던 컴퓨터의 자원을 해제하는 수행문
		} finally {
			// FileWriter객체 생성 후 점유했던 컴퓨터의 자원을 해제하는 수행문
			try {
				if (writer != null) {
					writer.close();
				}
			} catch (IOException e) {
				// 수행할 작업 없음
			}
		}
	}
}
package day3;
import java.io.FileWriter;
import java.io.IOException;
public class ExceptionApp2 {
	public static void main(String[] args) {
		
		// 프로그램이 점유했떤 컴퓨터의 자원으로 자동으로 해제하기
		/*
		    try (자원을 점유하는 객체를 생성하는 수행문) {
		    	점유한 자원을 사용하는 수행문;
		    	점유한 자원을 사용하는 수행문;
		    	점유한 자원을 사용하는 수행문;
		    } catch(예외 e) {
		    	예외 발생시 실행할 수행문;
		    }
		    
		    위와 같이 작성한 프로그램은 객체가 사용했던 컴퓨터 자원을 안전하게 해제시켜준다.
		    AutoCloseable 인터페이스를 구현한 하위 클래스만 자동 자원해제가 지원된다.
		    자바 7 버전부터 지원된다.
		 */
		
		try (FileWriter writer = new FileWriter("src/day3/sample2.txt")) {
			writer.write("자동 자원해제");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
  // 1 byte 읽기
  InputStream in = new FileInputStream("c:/files/sample.dat");
  // oneByteData에는 read() 메소드가 스트림으로부터 읽어온 데이터가 저장된다.
  int oneByteData = in.read();
  
  // 스트림의 끝까지 읽기
  InputStream in = new FileInputStream(new File("c:/files", "sample.dat"));
  int oneByteData = 0;
  // int read() : 1byte씩 읽어서 반환한다. 스트림의 끝에 도달하면 -1을 반환한다.
  while ((oneByteData = in.read()) != -1) {
    // oneByteData에는 한 바이트식 읽어온 데이터가 들어있다
    // 읽어온 데이터 처리하기
  }
  
  // 스트림의 끝까지 읽기
  InputStream in = new FileInputStream(new File("c:/files/sample.dat"));
  // bytes 배열은 read(Byte[] buf) 메소드가 스트림으로부터 한 번에 읽어올 byte데이터를 저장하기 위한 배열이다.
  byte[] bytes = new byte[1024];
  // len은 read(byte[] buf) 메소드가 스트림으로부터 한번에 읽어서 byate배열에 저장한 데이터의 갯수가 저장된다.
  // byte배열의 크기가 1024라면 len의 값은 0 ~ 1014 범위의 값이다. 
  int len = 0;
  while ((len = in.read(bytes)) != -1) {
     // bytes배열의 데이터 처리하기
  }  // BufferedInputStream은 다른 InputStream과 연결해서 사용한다.
  BufferedInputStream in = new BufferedInputStream(new FileInputStream("c:/files/sample.dat"));
  
  // 스트림의 끝가지 읽기
  int data = 0;
  while ((data = in.read()) != -1) {
    // data의 값 처리하기
  }  // DataInputStream은 다른 InputStream과 연결해서 사용한다.
  Socket socket = new Socket("192.168.10.11", 300);
  DataInputStream in = new DataInputStream(socket.getInputStream());
  // DataInputStream의 xxxRead() 메소드로 값 읽어오기
  boolean value1 = in.readBoolean();
  int value2 = in.readInt();
  long value3 = in.readLong();
  double value4 = in.readDouble();
  String value5 = in.readUTF();
  ...  // 1 바이트씩 읽어서 1바이트씩 출력하기
  FileInputStream in = new FileInputStream("c:/files/sample.dat");
  FileOutputStream out = new FileOutputStream("c:/files/sample.dat.backup");
  
  int value = 0;
  while ((value = in.read()) != -1) {
    out.write(value);
  }
  
  // bytes배열로 읽어서 출력하기
  FileInputStream in = new FileInputStream("c:/files/sample.dat");
  FileOutputStream out = new FileOutputStream("c:/files/sample.dat.backup");
  byte[] bytes = new byte[1024];
  int len = 0;
  while ((len = in.read(bytes)) != -1) {
    out.write(bytes, 0, len);
  }  DataOutputStream out = new DataOutputStream(new FileOutputStream("c:/files/data.sav"));
  out.writeBoolean(true);
  out.writeInt(10);
  out.writeLong(10000L);
  out.writeDouble(3.14);
  out.writeUTF("")  // 직렬화할 객체를 생성하고, 초기화한다. 
  Person person = new Person(10, "hong", "홍길동", "010-1234-1234");
  
  Socket socket = new Socket("192.168.10.20", 3000);
  // ObjectOutputStream은 객체를 연결된 출력스트림으로 출력할 수 있다.
  ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
  // Person객체를 ObjectOutputStream의 writeObject(Object obj)로 출력한다.
  out.writeObject(person);  // 화면에 출력하기
  // PrintStream은 출력전용 스트림이다.
  PrintStream out = new PrintStream(Sytem.out);
  out.println(true);
  out.println(10);
  out.println(1000L);
  out.println(3.14);
  out.println("실습");  // 텍스트 한 줄 읽기
  BufferedReader reader = new BufferedReader(new FileReader("c:/files/sample.txt"));
  String line = reader.readLine();
  
  // 텍스트 읽기
  Bufferedreader reader = new Bufferedreader(new FileReader("c:/files/sample.txt"));
  String line = null;
  while ((line = reader.readLine()) != null) {
    // 읽어온 텍스트를 처리하기
  }  // 키보드로 입력한 내용을 한 줄 읽어오기
  BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
  
  // InputStream을 다른 Reader와 연결하기
  BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("c:/files/sample.txt")))
  
  // InputStream을 다른 reader와 연결하기
  Socket socket = new Socket("192.168.10.100", 3000);
  BufferedReader reader = new BufferedReader(new InputStreamReader(soket.getInputStream()));