8장 자바 입출력
자바 입출력 File 클래스 입출력 스트림 클래스 예외 final 수정자
자바 입출력 File 클래스 파일이나 디렉토리를 생성, 삭제, 이름 변경 등을 정의해놓은 클래스가 File 클래스임. 메 서 드 설 명 File(String directoryPath) 파일이 존재하는 디렉토리명(파일이름 포함)을 인수로하는 생성자 File(Stirng directoryPath, String filename) 파일이 존재하는 디렉토리명과 파일이름을 인수로 하는 생성자 File(File dirObj, String filename) 파일이 있는 디렉토리의 파일 객체와 파일이름을 인수로하는 생성자
자바 입출력 생성된 File 클래스 객체를 조작하기 위한 중요 메서드. 메 서 드 설 명 boolean canRead() 설 명 boolean canRead() 파일이 읽기 가능하면 TRUE, 아니면 FALSE를 반환 boolean canWrite() 파일이 쓰기 가능하면 TRUE, 아니면 FALSE를 반환 boolean delete() 파일이 삭제하고 TRUE, 삭제 할 수 없으면 FALSE를 반환 boolean equal(Object obj) 두 파일 객체가 같은 파일을 참조하고 있으면 TRUE, 아니면 FALSE를 반환 boolean exists() 파일이 존재하면 TRUE, 아니면 FALSE String getAbsolutePath() 파일에 대한 절대 경로를 반환 String getCannicalPath() 파일에 대한 정규 경로를 반환 String getParent() 부모 디렉토리의 이름을 반환 String getName() 파일의 이름을 반환 String getPath() 파일의 경로를 반환 boolean isAbsolute() 경로가 절대 경로이면 TRUE, 아니면 FALSE 반환 boolean isDirectory() 현재 객체가 디렉토리이면 TURE, 아니면 FALSE 반환 boolean isFile() 현재 객체가 파일이면 TRUE, 아니면 FALSE 반환 long lastModified() 파일이 마지막으로 수정된 시간과 날짜 GMT 시간으로 반환 long length() 파일의 바이트 수를 반환 String[] list() 디렉토리에서 파일의 이름을 반환 boolean mkdir() 디렉토리 생성에 성공하면 TRUE, 실패하면 FALSE 반환. 지정된 모든 경로가 존재해야 한다. boolean mkdirs() 디렉토리 생성에 성공하면 TRUE, 실패하면 FALSE 반환. 지정된 모든 경로가 존재하지 않으면 그 경로의 상위 디렉토리에 생성. boolean renameTo(File newName) 파일이나 디렉토리의 이름을 newName으로 변경하고 TRUE를 반환, 실패하면 FALSE를 반환한다.
자바 입출력 import java.io.*; import java.util.*; class FileExam { public static void main(String args[]) { File dir = new File("c:\\test"); File file = new File(dir, “test.txt"); if(dir.isDirectory()) { System.out.println("File 클래스 객체 dir은 디렉토리입니다."); String files[] = dir.list(); System.out.println("디렉토리의 파일 목록 : "); for(int index=0; index < files.length; index++) { System.out.println(" "+files[index]); } } System.out.println("상위 디렉토리 : " + dir.getParent()); System.out.println("디렉토리의 이름 : " + dir.getName()); System.out.println("디렉토리의 경로 : " + dir.getPath()); if(file.isFile()) { System.out.println("File 클래스 객체 file은 파일입니다."); System.out.println("마지막 수정시간 : "+ new Date(file.lastModified())); System.out.println("파일의 크기 "+ file.length() + "byte"); System.out.println("상위 디렉토리 : " + file.getParent()); System.out.println("파일의 이름 : " + file.getName()); System.out.println("파일의 경로 : " + file.getPath()); } }
자바 입출력 실행결과
자바 입출력 자바의 입출력 스트림(stream) 입출력 데이터의 추상적인 표현. 프로그래머가 스트림 객체를 이용하면 실제 하드웨어 장치와 상관없이 일관된 방법으로 입출력을 처리할 수 있기 때문임. 이런 스트림은 키보드, 파일 등의 입력장치로부터 데이터를 읽어 들이는 입력 스트림과 모니터, 파일 등의 출력장치로 데이터를 출력하는 출력 스트림으로 분류 할 수 있음. 문자 스트림과 바이트 스트림으로 분류 할 수 있는데 문자 스트림은 16비트 문자나 문자열들을 읽고 쓰기 위한 스트림이고 바이트 스트림은 8비트의 바이트를 읽고 쓰기 위한 스트림 임.
자바 입출력 자바에서 입출력을 위해 제공하는 스트림 클래스 문자 스트림의 계층 구조도 바이트 스트림의 계층 구조도
자바 입출력 예제 import java.io.*; public class CharStreamExam { public static void main(String args[]) { try { FileReader fr = new FileReader(new File("c:\\test\\file.txt")); BufferedReader br = new BufferedReader(fr); String line = null; while((line=br.readLine())!= null) { System.out.println(line); } }catch(IOException ioe) {} } }
자바 입출력 바이트 입출력 스트림 클래스는 8비트 단위로 입출력을 하며 텍스트 형태의 데이터뿐만 아니라 이진 데이터를 읽는데도 유용하게 사용할 수 있음. 바이트 입출력 스트림은 8비트 단위로 입출력 함으로 텍스트 형식의 데이터를 입출력 할 때 약간의 주의가 필요함. 아스키코드와 같이 8비트보다 작은 문자 코드로 된 파일을 읽을 때는 문제가 없지만 유니코드와 같은 텍스트 데이터를 읽을 때는 인코딩을 해주어야 올바른 데이터를 화면에 출력할 수 있음.
자바 입출력 예제 import java.io.*; public class ByteStreamExam { public static void main(String args[]) { try { BufferedInputStream bis = new BufferedInputStream(System.in); BufferedOutputStream bos = new BufferedOutputStream(System.out); byte buf[] = new byte[64]; int len = 0; bos.write("문자열을 입렵하세요 : \n".getBytes()); bos.flush(); while((len=bis.read(buf))!= -1) { bos.write(buf, 0, len); bos.flush(); } bis.close(); bos.close(); }catch(Exception e) {} } }
자바 입출력 예외(Exception) 예외란 프로그램 실행 중에 발생하는 오류를 말함. 자바는 예외를 객체로 취급하며, 각 상황에 따른 예외 관련 클래스를 제공하고 있고 상속을 통해 확장할 수 있음. 자바의 예외처리는 자바 프로그램을 좀 더 견고하게 만듦.
자바 입출력 예외 클래스의 계층 구조도
자바 입출력 Exception 클래스는 많은 예외 클래스를 하위 클래스로 가지고 있음. 50여개의 예외 클래스 중 중요 클래스의 구조임. Throwable 클래스는 Error 클래스와 Exception 클래스를 하위 클래스로 가짐. Error 클래스는 주로 하드웨어 관련 예외를 처리하기 위한 클래스 임. 이런 종류의 예외는 일반적으로 프로그램에서 처리하지 않고 JVM에게 위임됨. Exception 클래스는 많은 예외 클래스를 하위 클래스로 가지고 있음.
자바 입출력 주요 예외 클래스 자바 컴파일러는 Error과 RuntimeException를 제외한 나머지 예외에 대해서는 프로그램에서 처리하도록 요구하는데 IOException을 던지는 메서드를 호출할 때 예외처리를 하지 않는다면 컴파일러는 에러를 발생 시켜 프로그래머에게 예외처리를 하도록 요구함. 예외 클래스 설 명 NoSuchMethodException 메서드가 존재하지 않을 때 ClassNotFoundException 호출된 클래스가 존재 하지 않을 때 CloneNotSupportedException 복제가 지원되지 않는 객체의 복제를 시도 했을 때 IllegalaccessException Class클래스의 forName과 같은 메서드를 사용하여 문자열 이름으로 클래스에 로드하려 할 때 InstantiationException 추상클래스나 인터페이스로부터 객체를 생성하려 할 때 InterruptedException 쓰레드가 인터럽트 되었을 때 RuntimeException 프로그램의 실행시간에 예외가 발생 했을 때
자바 입출력 예외처리를 하지 않았을 때 발생하는 컴파일 에러 예외를 처리하는 방법 throws 문을 사용하여 자신을 호출한 메서드에게 위임하는 방법 throws는 처리해야 하는 모든 예외를 하나의 메서드에서 처리하게 할 때 유용 사용법 메서드가 여러 가지의 예외를 처리해야 할 때는 ,(컴마)를 사용하여 처리해야하는 모든 예외 클래스를 나열함. [접근 제어자] 반환데이터형 메서드이름 throws 예외클래스[, 예외클래스, ...] { 예외가 발생하는 문장; }
자바 입출력 try-catch문을 사용하여 처리하는 방법 try-catch문을 사용하여 예외를 처리하는 형식 주의 할 것은 catch문이 순차적으로 실행되기 때문에 가장 하위에 있는 Exception 클래스가 앞에 와야 한다는 것임. finally 문은 선택적으로 사용되는 문장으로서 예외의 발생 여부에 상관없이 수행되어야 하는 문장을 정의함. try { 예외가 발생하는 문장; } catch(Exception 클래스나 상속받아 구현된 클래스의 객체1) { 예외 발생시 수행되어야 하는 문장; . catch(Exception 클래스나 상속받아 구현된 클래스의 객체 N) { [ finally { 예외에 상관없이 무조건 수행되어야 하는 문장; } ]
자바 입출력 final 수정자 final 수정자는 “한번 결정된 것은 마지막“이라는 의미를 가지고 있음. 클래스에 사용되었을 때는 보안등의 이유로 이 클래스가 더 이상 상속될 수 없는 마지막 클래스임을 의미함. 메서드에 사용되었을 때는 클래스와 비슷하다. 메서드에 사용되었을 때는 더 이상 이 메서드가 오버라이딩 될 수 없다는 것을 의미한다. 보안등의 이유로 상속받는 모든 클래스가 같은 기능을 가져야 할 때 사용함. 멤버 변수나 로컬 변수에 사용되었을 때는 이 변수는 상수와 같이 사용됨. 변수에 final 수정자를 사용할 때는 변수를 선언할 때 값을 설정해주어야 한다는 것을 주의해야 한다.
자바 입출력 예제 class FinalExam { public static final String className = "FinalExam"; private final int MAX_SIZE = 10; private int[] array = new int[MAX_SIZE]; //final로 선언된 메서드인 getArraySize()는 FinalExam을 상속받은 FinalClassExam 클래스에서 오버라이딩 할 수 없다. public final int getArraySize() { return array.length; } } // FinalClassExam 클래스를 상속받는 클래스를 구현할 수 없다. public final class FinalClassExam extends FinalExam { public static void main(String args[]) { FinalExam finalExam = new FinalClassExam(); System.out.println("클래스 이름 : " + FinalExam.className); System.out.println("배열의 크기 : " + finalExam.getArraySize()); 예제