바로가기 >> [Java] 자바 I/O 에 대한 이해 (1)
♦ Node 계열과 Filter 계열
자바 I/O 처리는 2가지 계열(Node, Filter) 클래스를 이용한다.
Node 계열
원시 데이터를 직접 처리하는 클래스 계열이다. 원시데이터는 가공되지 않은 I/O 기본 처리 데이터인 byte 와 char 를 의미한다.
대표적으로 상위클래스들인 InputStream, OutputSteram, Reader, Writer 클래스들이다.
Node 계열 클래스들은 비효율적인 입출력만 가능한다.
Filter 계열
데이터를 좀 더 효율적으로 처리하기 위해 제공되는 클래스들을 의미한다.
대표적으로 InputStreamReader, BufferedReader, PrintWriter 클래스들이다.
Filter 계열을 사용하여 효율적인 I/O 작업을 할 수 있으며 이러한 방법으로 프로그램을 구현하는 패턴을 ‘데코레이션 패턴’이라고 한다.
데코레이션 패턴 적용
new BufferedReader(new InputStreamReader(System.in));
InputStream 형의 System.in 을 InputStreamReader 생성자의 인자로 지정하여 byte 처리를 char 처리로 변경
BufferedReader 를 사용하여 한 라인씩 입력 데이터를 처리할 수 있도록 데코레이션을 적용
♦ File API
파일 및 디렉토리와 관련된 메타 데이터를 처리하는 클래스를 말한다. 파일명, 파일크기, 읽기모드, 쓰기모드, 디렉토리 생성 등과 같은 작업을 담당한다. 실제 파일내의 접근은 I/O를 이용한다.
File 객체의 생성자
생성자 | 설명 |
File(String fileName) | 파일명을 인자로 지정하여 File 객체를 생성한다. |
File(String dir, fileName) | dir 의 파일객체와 파일명을 이용하여 File 객체를 생성한다. |
File(String dir, String fileName) | dir 의 파일경로와 파일명을 이용하여 File 객체를 생성한다. |
**File 객체의 생성은 실제 물리적으로 파일을 생성하는 것이 아니라, 기존에 존재하는 파일의 메타정보를 알아보기 위한 객체를 생성하는 것이다.
File 객체를 이용한 파일의 메타정보 출력
import java.io.File; public class Test05 { public static void main(String[] args) { try { // 현재 시스템의 파일 구분자 출력 System.out.println(File.separator); File file = new File("D:\\fileTest", "javaTest.txt"); System.out.println(file.exists()); // 파일 존재여부 출력 System.out.println(file.getName()); // 파일명 출력 System.out.println(file.getPath()); // 파일 경로 출력 System.out.println(file.length()); // 파일 크기 출력 // javaTest 폴더내의 파일 및 디렉터리 목록 출력 String[] listing = new File("D:\\fileTest").list(); for (String s : listing) { System.out.println(s); } } catch (Exception e) { e.printStackTrace(); } } }
♦ 파일 입출력
일반 텍스트 파일
일반적인 텍스트 파일인 txt 확장자를 가진 파일접근은 char 단위로 처리하는 것이 효율적이다.
FileReader 와 FileWriter 같은 Node 계열 클래스를 사용하여 처리하며, BufferedReader 및 PrintWriter 같은 Filter 계열 클래스를 데코레이션하여 구현하면 더욱 효율적이다.
바이너리 파일
이미지 파일과 같은 바이너리 파일접근은 byte 단위로만 처리가 가능하다.
FileInputStream 과 FileOutputStream 을 사용하여 처리한다.
텍스트 파일 내용 출력
import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; public class Test06 { public static void main(String[] args) { try{ File file = new File("D:\\fileTest", "javaTest.txt"); FileReader reader = new FileReader(file); BufferedReader buffer = new BufferedReader(reader); String str = buffer.readLine(); while( str != null ){ System.out.println(str); str = buffer.readLine(); } buffer.close(); }catch(FileNotFoundException e){ e.printStackTrace(); }catch(IOException e){ e.printStackTrace(); } } }
입력 데이터를 텍스트 파일로 저장
import java.io.BufferedReader; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintWriter; public class Test07 { public static void main(String[] args) { try{ File file = new File("D:\\fileTest", "output.txt"); System.out.println("데이터를 입력하세요"); InputStream is = System.in; InputStreamReader reader = new InputStreamReader(is); BufferedReader buffer = new BufferedReader(reader); FileWriter writer = new FileWriter(file); PrintWriter out = new PrintWriter( writer ); out.print( buffer.readLine() ); buffer.close(); out.close(); }catch(IOException e){ e.printStackTrace(); } } }
이미지 파일 복사하기
public class Test08 { public static void main(String[] args) { try { File readFile = new File("D:\\fileTest", "testImage.png"); // testImage.png 파일은 존재해야함 File writeFile = new File("D:\\fileTest", "cypeImage.png"); int size = (int) readFile.length(); // testImage.png 파일의 크기를 size 변수에 저장 byte[] readByte = new byte[size]; // size 변수값 만큼 byte 배열 생성 FileOutputStream fos = new FileOutputStream(writeFile, false); // byte로 파일로 출력하기 위한 객체 생성. fos.write(readByte); // byte 배열에 저장된 데이터를 출력 = 이미지 파일 생성 fos.close(); } catch (IOException e) { e.printStackTrace(); } } }
자바 I/O 에 대한 이해 (3) 에서 이어집니다..
바로가기 >> [Java] 자바 I/O 에 대한 이해 (3)