[Java] 자바 I/O 에 대한 이해 (2)


바로가기 >> [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)

답글 남기기