290 likes | 510 Views
8 장 자바 입출력. 자바 입출력. File 클래스 입출력 스트림 클래스 예외 final 수정자. 자바 입출력. File 클래스 파일이나 디렉토리를 생성 , 삭제 , 이름 변경 등을 정의해놓은 클래스가 File 클래스임 . File 클래스 객체는 파일이나 디렉토리를 생성 , 삭제 , 변경하는 것 외어 입출력 클래스와 같이 사용하여 파일에 데이터를 입출력 할 수 있음 File 클래스 객체를 생성하기 위해 사용될 수 있는 생성자. 자바 입출력.
E N D
자바 입출력 • File 클래스 • 입출력 스트림 클래스 • 예외 • final 수정자
자바 입출력 • File 클래스 • 파일이나 디렉토리를 생성, 삭제, 이름 변경 등을 정의해놓은 클래스가 File 클래스임. • File 클래스 객체는 파일이나 디렉토리를 생성, 삭제, 변경하는 것 외어 입출력 클래스와 같이 사용하여 파일에 데이터를 입출력 할 수 있음 • File 클래스 객체를 생성하기 위해 사용될 수 있는 생성자.
자바 입출력 • 생성된 File 클래스 객체를 조작하기 위한 중요 메서드.
자바 입출력 • 예제 // File 클래스를 사용하기 위해 java.io 패키지를 import 한다. import java.io.*; import java.util.*; class FileExam { public static void main(String args[]) { // "c:\test" 디렉토리에 해당하는 File 클래스 객체를 생성한다. File dir = new File("c:\\test"); // File 클래스 객체 dir과 파일 이름 "file.txt"를 인자로 받아 "c:\test\file.txt" 파일에 // 해당하는 File 객체를 생성한다. File file = new File(dir, "file.txt"); // File 클래스의 isDirectory()를 호출하여 dir이 디렉토리인지 검사한다. // dir은 디렉토리임으로 if문의 실행문을 실행한다. if(dir.isDirectory()) { System.out.println("File 클래스 객체 dir은 디렉토리입니다."); // list() 메서드를 호출해 디렉토리에 있는 파일과 디렉토리 목록을 String형 배열로 구한다. String files[] = dir.list(); System.out.println("디렉토리의 파일 목록 : "); for(int index=0; index < files.length; index++) { System.out.println(" "+files[index]); } }
자바 입출력 // getParent() 메서드를 호출해 상위 디렉토리의 경로를 구한다. // "c:\test" 디렉토리의 상위경로인 "c:\"를 반환한다. System.out.println("상위 디렉토리 : " + dir.getParent()); // getName() 메서드를 호출해 디렉토리의 이름을 구한다. // 경로를 제외한 나머지를 반환함으로 "test"를 반환한다. System.out.println("디렉토리의 이름 : " + dir.getName()); // getPath() 메서드를 호출해 파일이나 디렉토리의 전체 경로를 구한다. System.out.println("디렉토리의 경로 : " + dir.getPath()); // isFile() 메서드를 호출하여 file이 파일인지 검사한다. if(file.isFile()) { System.out.println("File 클래스 객체 file은 파일입니다."); System.out.println("마지막 수정시간 : "+ new Date(file.lastModified())); System.out.println("파일의 크기 "+ file.length() + "byte"); } // getParent() 메서드를 호출해 상위 디렉토리의 경로를 구한다. System.out.println("상위 디렉토리 : " + file.getParent()); // getName() 메서드를 호출해 디렉토리의 이름을 구한다. System.out.println("파일의 이름 : " + file.getName()); // getPath() 메서드를 호출해 파일이나 디렉토리의 전체 경로를 구한다. System.out.println("파일의 경로 : " + file.getPath()); } }
자바 입출력 • 실행결과
자바 입출력 • 자바의 입출력 스트림 • 입출력 데이터의 추상적인 표현. • 프로그래머가 스트림 객체를 이용하면 실제 하드웨어 장치와 상관없이 일관된 방법으로 입출력을 처리할 수 있기 때문임. • 이런 스트림은 키보드, 파일 등의 입력장치로부터 데이터를 읽어 들이는 입력 스트림과 모니터, 파일 등의 출력장치로 데이터를 출력하는 출력 스트림으로 분류 할 수 있음. • 문자 스트림과 바이트 스트림으로 분류 할 수 있는데 문자 스트림은 16비트 문자나 문자열들을 읽고 쓰기 위한 스트림이고 바이트 스트림은 8비트의 바이트를 읽고 쓰기 위한 스트림 임.
자바 입출력 • 자바에서 입출력을 위해 제공하는 스트림 클래스 • 문자 스트림의 계층 구조도 • 바이트 스트림의 계층 구조도
자바 입출력 • 문자 입출력 스트림 클래스는 16비트(유니코드) 단위로 입출력을 하며 주로 텍스트 형태의 데이터를 읽고 쓰는데 사용됨. • 문자 입출력 스트림의 중요 메서드 • 문자 입력 스트림의 중요 메서드
자바 입출력 • 문자 출력 스트림의 중요 메서드
자바 입출력 • 예제 import java.io.*; // 입출력 스트림을 사용하기 위해 java.io 패키지를 import 한다. public class CharStreamExam { public static void main(String args[]) { try { // File 클래스 객체를 인자로 FileReader 클래스 객체를 생성한다. // File 클래스 객체가 아닌 문자열을 바로 입력해도 FileReader 클래스 객체는 생성된다. FileReader fr = new FileReader(new File("c:\\test\\file.txt")); // 생성한 FileReader 클래스 객체를 BufferedReader와 결합하여 사용한다. BufferedReader br = new BufferedReader(fr); // 바이트 출력 스트림인 System.out를 문자 출력 스트림으로 사용하기 위해 // OutputStreamWriter 객체를 생성한다. OutputStreamWriter osw = new OutputStreamWriter(System.out); String line = null; // BufferedReader 클래스의 readLine() 메서드를 호출해 파일을 한 줄씩 읽어온 값이 // null일 때가지 루프를 반복한다. while((line=br.readLine())!= null) { // Writer 클래스의 write() 메서드를 호출해 읽어온 문자열을 출력한다. readLine() 메서드를 // 사용해 문자열을 읽으면 개행문자를 읽지 않으므로 "\n"을 같이 출력해 커서를 다음 라인에 // 위치 시킨다. osw.write(line+"\n"); // write() 메서드를 사용해 버퍼에 쓴 내용을 해당 출력 장치로 내보낸다. osw.flush(); } /* …사용한 입출력 스트림을 close() 메서드를 사용해서 닫는 것을 구현 … */ // 스트림을 통해 입출력을 수행하는 동안 발생하는 예외를 처리하기위해 IOException을 // try catch문을 사용해 처리한다. }catch(IOException ioe) {} } }
자바 입출력 • 실행결과
자바 입출력 • 바이트 입출력 스트림 클래스는 8비트 단위로 입출력을 하며 텍스트 형태의 데이터뿐만 아니라 이진 데이터를 읽는데도 유용하게 사용할 수 있음. • 바이트 입출력 스트림은 8비트 단위로 입출력 함으로 텍스트 형식의 데이터를 입출력 할 때 약간의 주의가 필요함. • 아스키코드와 같이 8비트보다 작은 문자 코드로 된 파일을 읽을 때는 문제가 없지만 유니코드와 같은 텍스트 데이터를 읽을 때는 인코딩을 해주어야 올바른 데이터를 화면에 출력할 수 있음.
자바 입출력 • 바이트 입출력 스트림의 중요 메서드 • 바이트 입력 스트림의 중요 메서드 • 바이트 출력 스트림의 중요 메서드
자바 입출력 • 예제 import java.io.*; // 입출력 스트림을 사용하기 위해 java.io 패키지를 import 한다. public class ByteStreamExam { public static void main(String args[]) { try { // 프롬프트창으로부터 입력받기위한 입력 스트림 System.in을 인자로 BufferedInputStream 클래스 객체를 생성한다. BufferedInputStream bis = new BufferedInputStream(System.in); // 프로프트창에 출력하기위한 출력 스트림 System.out을 인자로 BufferedOutputStream 클래스 객체를 생성한다. BufferedOutputStream bos = new BufferedOutputStream(System.out); //BufferedInputStream 클래스의 read() 메서드를 사용해 데이터를 읽어들이기 위한 버버로 byte 배열을 사용한다. byte buf[] = new byte[64]; // 스트림으로부터 읽어들인 바이트 수를 기록하기위한 int형 변수 int len = 0; // write() 메서드를 사용해 문자열을 출력하기위해 String 클래스의 getBytes() 메서드로 문자열을 byte 배열로 변환한다. bos.write("문자열을 입렵하세요 : \n".getBytes()); // 출력 스트림에 쓴 내용을 flush() 메서드를 사용해 해당장치로 출력한다. bos.flush(); while((len=bis.read(buf))!= -1) { bos.write(buf, 0, len); bos.flush(); } // 사용한 입출력 스트림을 close() 메서드를 사용해서 닫는다. bis.close(); bos.close(); // 스트림을 통해 입출력을 수행하는 동안 발생하는 예외를 처리하기위해 IOException을 try catch문을 사용해 처리한다. }catch(Exception e) {} } }
자바 입출력 • 실행결과
자바 입출력 • 예외(Exception) • 예외란 프로그램 실행 중에 발생하는 오류를 말함. • 자바는 예외를 객체로 취급하며, 각 상황에 따른 예외 관련 클래스를 제공하고 있고 상속을 통해 확장할 수 있음. • 자바의 예외처리는 자바 프로그램을 좀 더 견고하게 만듬.
자바 입출력 • 예외 클래스의 계층 구조도
자바 입출력 • 50여개의 예외 클래스 중 중요 클래스의 구조임. • Throwable 클래스는 Error 클래스와 Exception 클래스를 하위 클래스로 가짐. • Error 클래스는 주로 하드웨어 관련 예외를 처리하기 위한 클래스 임. 이런 종류의 예외는 일반적으로 프로그램에서 처리하지 않고 JVM에게 위임됨. • Exception 클래스는 많은 예외 클래스를 하위 클래스로 가지고 있음. • RuntimeException 클래스는 실행시간에 발생할 수 있는 예외와 관련된 하위 클래스들을 가지고 있는데 이런 예외들은 예외지정에 소요 되는 비용이 예외지정을 함으로써 얻는 효과에 비해 더 크기 때문에 일반적으로 프로그램에서 지정하지 않음.
자바 입출력 • 주요 예외 클래스 • 자바 컴파일러는 Error과 RuntimeException를 제외한 나머지 예외에 대해서는 프로그램에서 처리하도록 요구하는데 IOException을 던지는 메서드를 호출할 때 예외처리를 하지 않는다면 컴파일러는 에러를 발생 시켜 프로그래머에게 예외처리를 하도록 요구함.
자바 입출력 • 예외처리를 하지 않았을 때 발생하는 컴파일 에러 • 예외를 처리하는 방법 • throws 문을 사용하여 자신을 호출한 메서드에게 위임하는 방법 • throws는 처리해야 하는 모든 예외를 하나의 메서드에서 처리하게 할 때 유용 • 사용법 • 메서드가 여러 가지의 예외를 처리해야 할 때는 ,(컴마)를 사용하여 처리해야하는 모든 예외 클래스를 나열함.
자바 입출력 • try-catch문을 사용하여 처리하는 방법 • try-catch문을 사용하여 예외를 처리하는 형식 • 각 예외에 대한 catch문을 추가하여 하나의 try-catch문이 여러 가지 예외에 대해서 처리할 수 있음. • 주의 할 것은 catch문이 순차적으로 실행되기 때문에 가장 하위에 있는 Exception 클래스가 앞에 와야 한다는 것임. • finally 문은 선택적으로 사용되는 문장으로서 예외의 발생 여부에 상관없이 수행되어야 하는 문장을 정의함.
자바 입출력 • 예제 import java.io.*; public class ExceptionExam { // 메소드 내부에서 IOException이 발생하면 메서드내에서 try catch문을 사용해 처리하지 않고 // run() 메서드를 호출한 메서드에게 예외처리의 책임을 맞긴다. public void run() throws IOException { FileReader fr = new FileReader(new File("c:\\test\\file.txt")); BufferedReader br = new BufferedReader(fr); OutputStreamWriter osw = new OutputStreamWriter(System.out); String line = null; br.close(); // 예외를 발생시키기 위해 객체 br을 close() 메서드를 호출해 닫는다 while((line=br.readLine())!= null) { // readLine() 메서드를 호출하며 IOException이 발생 osw.write(line+"\n"); osw.flush(); } osw.close(); fr.close(); } public static void main(String args[]) { try { // 예외가 발생하는 코드를 try문 안에 위치 ExceptionExam exception = new ExceptionExam(); exception.run(); }catch(Exception e) { // run() 메서드가 발생시키는 IOException을 처리 // 예외클래스들의 상위 클래스인 Exception 클래스의 printStackTrace() 메서드를 호출해 예외에 대한 정보를 출력 e.printStackTrace(); System.out.println("예외가 발생해 프로그램을 종료합니다."); System.exit(0); } } }
자바 입출력 • 실행결과
자바 입출력 • final 수정자 • final 수정자는 “한번 결정된 것은 마지막“이라는 의미를 가지고 있음. • final 수정자의 의미 • 클래스에 사용되었을 때는 보안등의 이유로 이 클래스가 더 이상 상속될 수 없는 마지막 클래스임을 의미함. • 메서드에 사용되었을 때는 클래스와 비슷하다. 메서드에 사용되었을 때는 더 이상 이 메서드가 오버라이딩 될 수 없다는 것을 의미한다. 보안등의 이유로 상속받는 모든 클래스가 같은 기능을 가져야 할 때 사용함. • 멤버 변수나 로컬 변수에 사용되었을 때는 이 변수는 상수와 같이 사용됨. 변수에 final 수정자를 사용할 때는 변수를 선언할 때 값을 설정해주어야 한다는 것을 주의해야 한다.
자바 입출력 • 예제 • 실행결과 class FinalExam { // 클래스 외부에서 바로 접근할 수 있는 멤버를 final로 설정하면 클래스 외부에서 값을 변경할 수 없다. public static final String className = "FinalExam"; private final int MAX_SIZE = 10; // MAX_SIZE는 final로 설정되어있으므로 int형 상수 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(); // String형 상수 className를 static로 선언하였기 때문에 FinalExam 클래스의 인스턴스를 생성하지 않고 접근할 수 있다 System.out.println("클래스 이름 : " + FinalExam.className); System.out.println("배열의 크기 : " + finalExam.getArraySize()); } }