2021. 04. 21(수) TIL

Dylan·2021년 4월 21일
0

Java

예외처리

finally 블록

  • finally 블록에는 예외 발생 유무와 상관없이 반드시 실행되어야 하는 수행문을 작성하는 블록이다.
  • 애플리케이션 실행 중 점유했던 시스템의 자원(리소스)을 해제하는 코드(수행문)을 주로 작성한다.
  • 데이터베이스 엑세스 작업에서 트랜잭션처리와 관련된 코드를 작성한다.
  • 작성예
      try {
        예외발생이 예상되는 수행문1;
        예외발생이 예상되는 수행문2;
        수행문3;
      } catch (예외클래스 e) {
        수행문4;
      } catch (예외클래스 e) {
        수행문5;
      } finally {
        수행문6;	// 애플리케이션이 점유했던 자원을 해제하는 수행문
      }
    • 예외발생시
      1. 수행문1 or 수행문2(예외발생)
      2. 수행문4 or 수행문5
      3. 수행문6
    • 정상 실행
      1. 수행문1
      2. 수행문2
      3. 수행문3
      4. 수행문6
    • 수행문3/수행문4/수행문5 은 예외발생 유무에 따라서 실행될 수 있고, 아닐 수도 있다.
    • 수행문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();
		}
	}
}

I/O

  • java.io 패키지의 클래스
  • 애플리케이션에서 리소스를 읽어오거나, 애플리케이션의 데이터를 목적지로 출력하는 작업을 수행하는 클래스

ByteStream

  • 한 번 1byte씩 읽거나 쓰는 스트림
  • InputStream과 OutputStream이 있다.

InputStream 클래스

  • 스트림객체로 1byte씩 읽어오는 스트림이다.
  • InputStream의 주요 메소드
    • int read()
      • 한 바이트씩 읽어서 반환한다.
      • 스트림의 끝에 도달하면 -1을 반환한다.
    • int read(byte[] buf)
      • 지정된 byte[]배열에 한 바이트씩 저장한다. 반환되는 값은 배열에 저장된 데이터의 갯수다.
      • 스트림의 끝에 도달하면 -1을 반환한다.
    • void close()
      • 애플리케이션이 사용했던 시스템의 입출력 자원을 반환한다.
  • 주요 클래스
    • FileInputStream
      • 지정된 파일의 데이터를 1바이트씩 읽어온다.
    • BufferedInputStream
      • 다른 InputStream과 연결해서 사용하는 보조스트림이다.
      • 읽기 성능을 향상시킨다.
    • DataInputStream
      • DataOutputStream으로 출력한 내용을 읽어오는 스트림이다.
      • readInt(), readLong(), readDouble(), readUTF()와 같은 메소드를 사용해서 타입 그대로 읽어올 수 있다.
    • ObjectInputStream
      • ObjectOutputStream으로 직렬화된 객체를 역직렬화해서 객체로 복원한다.
      • readObject() 메소드를 사용해서 직렬화된 객체를 스트림으로 읽어서 역직렬화 시킨다.
    • ByteArrayInputStream
      • Byte배열에서 읽어온다.
    • PipedInputStream
      • 멀티스레드 환경에서 사용하는 스트림이다.
  • InputStream 실습
  • FileInputStream 예제
      // 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 예제
      // BufferedInputStream은 다른 InputStream과 연결해서 사용한다.
      BufferedInputStream in = new BufferedInputStream(new FileInputStream("c:/files/sample.dat"));
      
      // 스트림의 끝가지 읽기
      int data = 0;
      while ((data = in.read()) != -1) {
        // data의 값 처리하기
      }
  • DataInputStream
      // 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();
      ...
  • ObjectOutputStream 예제

OutputStream 클래스

  • 스트림객체로 1byte씩 출력하는 스트림이다.
  • OutputStream의 주요 메소드
    • void write(int data)
      • 한 바이트씩 출력한다.
    • void write(byte[])
      • 지정된 byte[]배열에 저장된 데이터를 출력한다.
    • void write(byte[] buf, int offset, int length)
      • 지정된 byte[]배열에 저장된 데이터를 offset위치부터 lengh만큼 출력한다.
    • void flush()
      • 스트림의 내부저장소가 채워지지 않아도 강제로 목적지로 출력시킨다.
    • void close()
      • 애플리케이션이 사용했던 시스템의 입출력 자원을 반환한다.
  • 주요 클래스
    • FileOutputStream
      • 파일로 1 byte씩 출력하는 스트림
    • BufferedOutputStream
      • 연결된 InputStream의 쓰기 성능을 향상시키는 스트림
    • DataOutputStream
      • 연결된 InputStream으로 값을 기본자료형이나 String형태로 출력하는 스트림이다.
    • ObjectOutputStream
      • 객체를 직렬화해서 연결된 스트림으로 출력하는 스트림이다.
    • ByteArrayOutputStream
      • 바이트배열에 출력한다.
    • PipedOutputStream
      • 멀티스레드 환경에서 사용하는 스트림이다.
    • PrintStream
      • 출력전용 스트림이다.
  • OutputStream 실습
    • FileOutputStream 예제
      // 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 예제
      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("")
    • ObjectOutputStream 예제
      // 직렬화할 객체를 생성하고, 초기화한다. 
      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은 출력전용 스트림이다.
      PrintStream out = new PrintStream(Sytem.out);
      out.println(true);
      out.println(10);
      out.println(1000L);
      out.println(3.14);
      out.println("실습");

CharacterStream

  • 1문자씩 읽고 출력하는 텍스트 전용 스트림

Reader 클래스

  • Reader의 주요 메소드
    • int read()
      • 한 글자씩 읽어서 반환한다.
    • int read(char[] buf)
    • 지정된 char[]배열에 한 글자씩 저장하고, 저장된 문자갯수를 반환한다.
    • void close()
    • 애플리케이션이 사용했던 시스템의 입출력 자원을 반환한다.
  • 주요클래스
    • FileReader
      • 텍스트 파일에서 한 글자씩 읽어오는 스트림
    • BufferedReader
      • 연결된 캐릭터스트림으로부터 한 줄씩 읽어오는 스트림
    • InputStreamReader
      • InputStream과 Reader를 연결하는
  • Reader 스트림 실습
    • FileReader, BufferedReader 예제
        // 텍스트 한 줄 읽기
        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) {
          // 읽어온 텍스트를 처리하기
        }
    • InputStreamReader 예제
        // 키보드로 입력한 내용을 한 줄 읽어오기
        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()));

0개의 댓글