[JAVA] JAVA 파일 입출력
저번엔 JAVA 의 콘솔 입출력에 대해서 알아보았습니다. 사실 콘솔 입출력은 개인 프로젝트나 특정 데이터의 예외 처리 및 버그 수정 등에서만 사용되며, 실제 실무에서 사용되는 프로그램들은 데이터를 DB 가 아니라면 파일 입출력을 이용하게 됩니다. 그래서 콘솔 입출력 보다 파일 입출력이 좀 더 중요하다고 볼 수 있습니다.
그래서 JAVA 에서의 파일 입출력은 어떻게 하면 되는지 개념과 실제 예시로 알아보도록 하겠습니다.
파일 입력
JAVA 에서는 파일을 읽기 위해 FileInputStream 클래스를 이용합니다. 다음 예제를 보도록 하겠습니다.
import java.io.FileInputStream;
import java.io.IOException;
public class Sample {
public static void main(String[] args) throws IOException {
byte[] b = new byte[1024];
FileInputStream input = new FileInputStream("./out.txt");
input.read(b);
System.out.println(new String(b));
input.close();
}
}
위와 같이 FileInputStream 은 byte 배열을 이용해서 읽어야 하기 때문에 고정된 배열의 길이를 미리 설정해야 하고, byte 를 String 등과 같은 다른 타입으로 변환시키는 작업도 필요해 사용하기에는 조금 불편합니다. 그래서 이러한 문제가 해소된 FileReader 와 BufferedReader 를 사용합니다. 자세한 것은 아래 예시로 알아보도록 하겠습니다.
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class Sample {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("./out.txt"));
while (true) {
String line = br.readLine();
if (line == null) { // 더 이상 읽을 라인이 없을 경우 while 문을 빠져 나갑니다.
break;
}
System.out.println(line);
}
br.close();
}
}
BufferedReader 의 readline 메서드는 더 이상 읽을 라인이 없을 경우 null 을 반환합니다. 그리고 파일 읽기가 끝난 경우 BufferedReader 객체 close 를 꼭 진행해 주어야 합니다.
파일 출력
JAVA 에서는 파일 출력을 위해 여러 다양한 클래스들을 제공하고 있습니다. 하지만 이번에는 제가 실무에서 주로 사용했던 것들 위주로 알아보도록 하겠습니다.
파일 출력을 위해서 여러 다양한 방법이 있지만 저는 주로 다음과 같이 사용하였습니다.
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
public class Sample {
public static void main(String[] args) throws IOException {
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("./output.txt"), "UTF-8"));
String output = "출력";
bw.write(output);
bw.flush();
bw.close();
}
}
위와 같이 사용하면 간편하게 String 을 바로 파일에 출력할 수 있습니다. 그렇다면 BufferedWriter, OutputStreamWriter, FileOutputStream 에 대해서 알아보도록 하겠습니다.
추가적으로 파일 출력 또한 사용이 끝나면 close 를 진행해 주어야 합니다.
FileOutputStream
InputStream 과 마찬가지로 OutputStream 역시 byte 단위로 데이터를 처리하는 클래스입니다. 사용한 FileOutputStream 은 OutputStream 클래스를 상속받아 만든 클래스이므로 역시 byte 단위로 데이터를 처리합니다.
FileOutputStream 에 값을 쓸 때는 byte 단위로 써야 하므로 String 을 byte 배열로 바꾸어 주는 getBytes() 메서드를 이용합니다. 예시로 알아보도록 하겠습니다.
import java.io.FileOutputStream;
import java.io.IOException;
public class Sample {
public static void main(String[] args) throws IOException {
FileOutputStream output = new FileOutputStream("c:/out.txt");
for(int i=1; i<11; i++) {
String data = i+" 번째 줄입니다.\r\n";
output.write(data.getBytes());
}
output.close();
}
}
OutputStreamWriter
OutputStreamWriter 는 바이트 출력 스트림에 연결되어 문자 출력 스트림인 Writer 로 변환시켜주는 보조 스트림입니다. 저는 주로 FileOutputStream 을 UTF-8 로 인코딩 해주기 위해서 사용합니다.
BufferedWriter
BufferedWriter 는 문자 출력 스트림에 연결되어 버퍼를 제공해주는 보조 스트림입니다. 프로그램에서 전송한 데이터를 내부 버퍼에 쌓아두었다가 버퍼가 꽉 차면 버퍼의 모든 데이터를 한꺼번에 보내는 구조입니다.
한 번에 하나씩 보내는 것이 아닌 메모리 버퍼를 통해 데이터를 고속 전송하기 때문에 실행 성능이 향상되며, 다른 OutputStream 과 동일하게 Write()를 통해 데이터를 전송하지만 buffer 에 잔여 데이터가 있을 수 있으니 항상 flush 를 해주어야 합니다.
Comments