Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java로 폴더 내 모든 파일을 하나의 파일로 합치는 방법

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를 사용하거나 스트림 방식으로 바로 출력 파일에 기록하는 것이 메모리 사용 측면에서 유리합니다.