Java에서 여러 개의 텍스트 파일을 하나의 파일로 통합해야 하는 경우가 종종 있습니다. 예를 들어 로그 파일을 병합하거나, 분산된 데이터를 한곳에 모아 처리할 때 유용합니다. 이 글에서는 File 클래스의 listFiles() 메서드를 활용해 폴더 내 모든 파일을 읽고, 그 내용을 하나의 출력 파일에 저장하는 방법을 소개합니다.
listFiles() 메서드란?
File 클래스의 listFiles() 메서드는 현재 File 객체가 나타내는 경로에 존재하는 모든 파일과 디렉터리의 추상 경로(abstract path) 객체들을 배열 형태로 반환합니다. 이 메서드를 사용하면 특정 폴더 안의 파일 목록을 손쉽게 가져올 수 있습니다.
구현 절차
폴더에 있는 모든 파일의 내용을 하나의 파일로 읽어 들이려면 다음 단계를 따릅니다.
- 대상 폴더의 경로를 매개변수로 전달하여 File 객체를 생성합니다.
- Scanner 또는 다른 리더(reader) 클래스를 사용해 각 파일의 내용을 읽습니다.
- 읽어 들인 내용을 StringBuffer에 누적하여 추가합니다.
- StringBuffer에 저장된 전체 내용을 원하는 출력 파일에 기록합니다.
예제 코드
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;
public class Test {
public static void main(String args[]) throws IOException {
// 디렉터리를 나타내는 File 객체 생성
File directoryPath = new File("D:\\SampleDirectory");
// 모든 파일 및 디렉터리 목록 가져오기
File filesList[] = directoryPath.listFiles();
System.out.println("지정한 디렉터리의 파일 및 디렉터리 목록:");
Scanner sc = null;
StringBuffer sb = new StringBuffer();
for(File file : filesList) {
System.out.println("파일 이름: "+file.getName());
System.out.println("파일 경로: "+file.getAbsolutePath());
System.out.println("크기 :"+file.getTotalSpace());
// Scanner 클래스 인스턴스 생성
sc= new Scanner(file);
String input;
while (sc.hasNextLine()) {
input = sc.nextLine();
sb.append(input+" ");
}
System.out.println("파일 내용: "+sb.toString());
System.out.println(" ");
// FileOutputStream 클래스 인스턴스 생성
FileOutputStream fileOut = new FileOutputStream("D:\\output.txt");
// DataOutputStream 클래스 인스턴스 생성
DataOutputStream outputStream = new DataOutputStream(fileOut);
// 출력 스트림에 UTF 데이터 쓰기
outputStream.write(sb.toString().getBytes());
outputStream.flush();
System.out.println("파일에 데이터가 입력되었습니다");
}
}
}실행 결과
지정한 디렉터리의 파일 및 디렉터리 목록: 파일 이름: sample1.txt 파일 경로: D:\SampleDirectory\sample1.txt 파일 내용: sample text file1 파일에 데이터가 입력되었습니다 파일 이름: sample2.txt 파일 경로: D:\SampleDirectory\sample2.txt 파일 내용: sample text file2 파일에 데이터가 입력되었습니다 파일 이름: sample3.txt 파일 경로: D:\SampleDirectory\sample3.txt 파일 내용: sample text file3 파일에 데이터가 입력되었습니다
참고 사항
위 예제에서는 간단한 구현을 위해 DataOutputStream을 사용했지만, 실무 환경에서는 Files.writeString()이나 BufferedWriter 같은 최신 Java NIO API를 활용하면 더욱 효율적이고 안전하게 파일을 처리할 수 있습니다. 또한 대용량 파일을 다룰 때는 StringBuffer 대신 StringBuilder를 사용하거나 스트림 방식으로 바로 출력 파일에 기록하는 것이 메모리 사용 측면에서 유리합니다.