본문 바로가기
IT 실무/JAVA

[Java] 파일 입출력(I/O)의 기본적인 이해

by 지식id 2013. 10. 28.
반응형

자바는 편의를 위해 많은 종류의 스트림을 제공하고 있기 때문에 초보자 입장에서는 어떤 스트림을 사용해야 되는지 햇갈릴 때가 많다. 그냥 다른 사람이 쓴 예제를 복사, 붙여넣기 하다 보니 스트림을 여러개 중첩한, 불필요하게 복잡한 소스를 사용하기도 한다.


만들고 있는 프로그램이 제대로된 프로젝트가 아니라, 학교 프로그래밍 과제라던가 파일 입출력이 큰 비중을 차지 하지 않는 간단한 프로그램이라면 그냥 기본적인 스트림만 사용해도 된다.

그럼 뭐가 기본적인 스트림이고, 어떻게 사용하는지 알아 보자.
JAVA의 스트림은 '바이트 기반'인 InputStream과 OutputStream. 그리고 '문자 기반'인 Reader와 Writer가 있다.


1. 바이트 기반


바이트 기반의 스트림들은 모두 InputStraem과 OutputStream의 자손이다. 
FileInputStream, FileOutputStream, ByteArrayInputStream, PipedInputStream, AudioInputStream등의 입출력 스트림, 입출력 보조 스트림이 있지만 기회가 되면 다음에 다루기로 하고 일단은

FileInputStream
FileOutputStream

두개만 알자. 가장 기본적이고 많이 쓰는 스트림이다. 아까 말했듯이 제대로된 프로젝트가 아니라면 딴거 필요 없다.


import java.io.*;
public class FileCopy {
	public static void main(String args[]) throws IOException {
		FileInputStream fis = new FileInputStream("test1.txt");
		FileOutputStream fos = new FileOutputStream("test2.txt");

		int data=0;
		while((data=fis.read())!=-1) {
			System.out.print((char)data);
			fos.write(data);
		}

		fis.close();
		fos.close();
	}
}


가장 기본적인 예제이다. text1.txt라는 텍스트파일을 text2.txt로 복사 하는 것이다. FileInputStream으로 파일을 읽어서 FileOutputStream으로 쓰는 것이다.

파일 입출력을 다루는 스트림을 사용할 때에는 항상 IOException이 발생할 소지가 있으므로 예외처리를 해 주어야 한다. 편하게 하려면 그냥 별도의 처리 없이 throw해 주면 되고, 제대로 하려면 try catch문으로 감싸주자.

test1.txt파일에 영어, 숫자, 한글을 넣고 테스트 해 보면 콘솔에 출력되는 한글이 깨지는 것을 확인 할 수 있다. 말그래도 바이트 기반이다 보니 바이트 단위로 불러와서 출력하기 때문이다. 하지만 복사는 정상적으로 되었을 것이다. 출력에는 문제가 있다고 하더라도 바이트 단위로 쪼개서 읽어들이는 만큼 저장하기 때문에 손실되는 값이 있는 것은 아니다.

이처럼 FileInputStream, FileOutputStream은 파일을 처리 할 때 많이 쓰이는 스트림이다. 하지만 문자열을 다룰 것이라면 문자기반 스트림을 사용하는 것이 좋다.


2. 문자 기반

문자 기반 스트림들은 모두 Reader와 Writer의 자손이다. 문자기반 스트림은 다양한 인코딩을 지원하기 때문에 한글이나 한자같은 특수문자들도 깨지지 않는다.

import java.io.*;
public class FileCopy {
	public static void main(String args[]) throws IOException {
		FileReader fr = new FileReader("test1.txt");
		FileWriter fw = new FileWriter("test2.txt");

		int data=0;
		while((data=fr.read())!=-1) {
			System.out.print((char)data);
			fw.write(data);
		}

		fr.close();
		fw.close();
	}
}



한글이 정상적으로 출력 되는것을 확인 할 수 있다. 즉 단순히 파일을 다룰 때에는 바이트기반 스트림, 문자열을 다루고자 할때에는 문자기반 스트림을 사용하는게 맞다고 할 수 있겠다.


반응형

댓글