본문 바로가기

모바일환경코딩/java

[파일내용 합치기] java로 파일내용 합치는 간단한 방법

반응형

업무를 하다 보면 백업된 쿼리(QUERY)가 DB 데이터로 들어가 있는 경우가 있다. 이 데이터는 칼럼에 CLOB 또는 BLOB형태로 들어가 있다. 이렇게 들어 있는 파일을 query 실행하는 툴(toad, orange 등)을 사용하여 데이터를 추출한 후 이걸 파일로 만들었다. 만들고 보니 각 쿼리마다 파일이 하나가 생성되었다. 이런 경우에 쓸 수 있는 java 구문이다. 이렇게 안 하더라도 다른 방법으로 하나의 파일에 넣는 방법은 있다. 그래도 오늘 소개할 방법은 나중에 파일내용 합칠 때 또 사용하기 위해 작성한다.

 

[전체 java class 구문]

import java.io.BufferedOutputStream;

import java.io.BufferedReader;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOut0utStream;

import java.io.IOException;

import java.io.InputStreamReader;

public class FileInStream {

    public static void main(String[ ]  args) throws IOException {

        String path = "D:₩₩test₩₩test";

        String targetFile = "D:₩₩test₩₩test₩₩test.txt";

        

        File folder = new File(path);

        File[]  fleList = folder.listFiles();

        BufferedReader input = null;

        BufferedOutputStream out = null;

        String line = null;

        byte[]  data = null;

        int cnt = 0;

        try {

            output = new BufferedOutputStream(new FileOutputStream(targetFile));

            for ( File file : fleList ) {

                if ( file.exists() && file.isFile() ) {

                    if (    file.toString().toUpperCase().endWith(".DAT") ) {

                        System.out.println(" fileNm : ".concat(file.toString().toUpperCase());

                        input = new BufferedReader(new InputStreamReader(new FileInputStream(file)));

                        while ( ( line = input.readLine() )  != null) {

                            data = line.getBytes();

                            System.out.println("data : ".concat(line.toString());

                            output.write(data);

                            output.write(System.lineSeparator().getBytes());

                        }

                        cnt++;

                    } // if file.toString()...

                }  // if file.exists...

            } // for

            System.out.println("########## FINISH CNT : ".concat(String.valueOf(cnt)) );

        } finallily {

            if (input != null ) {

                try {

                    input.close();

                } catch ( Exception ignore) {

                    System.out.println("ignore: {} " + ignore);

                }

            } // if output != null

            if (output != null ) {

                try {

                    output.close();

                } catch ( Exception ignore) {

                    System.out.println("ignore: {} " + ignore);

                }

            } // if output != null

       }

    }

}

 

구문의 내용은 간단하다.

특정위치에 있는 파일들을 하나의 파일로 합친다. 이 내용이 핵심이다. 하나씩 코드들을 살펴보겠다.

 

1. import 문.

 - 코드를 작성하다 보면 자동으로 추가되거나 추가 안되면 eclipse에서 ctrl +shift + o 를 하면 추가되니 걱정은 하지 않고 넘어가자.

 

2. public static void main(String [] args) throws IOException 

 - 코드를 실행하는 부분이다. 직접적인 실행 부분이며, throws IOException은 파일을 읽고 쓸 때 에러가 나면 처리해 주는 부분이다.

 

3. String path 

 - 이 부분의 경로는 파일들의 집합이 있는 경로이다. 폴더 위치라고 보면 될 것이다.

 

4. String targetFile

 - 합쳐진 파일이 쓰일 파일의 이름이다.

 

5. File folder = new File(path);

 - 폴더명을 가져온다 생각하자. 

 

6. File [] fleList = folder.listFiles();

 - 폴더에서 파일 리스트를 배열에 담아 가져온다.

 

7. input, output

 - 파일을 읽고 쓰는 부분이다.

 

8. line, data, cnt

 - line 은 파일의 내용을 한줄한줄 읽기 위한 부분

 - data는 파일을 쓰기 위한 데이터 집합

 - cnt는 얼마나 데이터를 읽고 썼는지 확인하는 부분.

 

9. try { } finally { }

 - 파일을 읽고 쓸 때는 예외처리를 해 주어야 한다. try 구문에 거 오류가 나면 2번의 IOException에서 처리해 준다. finally 부분은 처리가 끝났던지 아니면 에러가 났던지 무조건 실행되는 부분이다. finally에서는 BufferedReader와 BufferedOutputStream을 닫아준다. 끝내는 부분이라 보면 되겠다.

 

10. output = new BufferedOutputStream(new FileOutputStream(targetFile));

 - 파일을 쓸 준비라고 보면 되겠다. 예를 들어 파일을 쓰기 위해 열었다!

 

11.  for ( File file : fleList ) 

 - 반복문이다. fleList에 있는 파일들의 집합을 하나씩 꺼낸다. 꺼낸 파일은 file에 담는다. fleList에 있는 파일을 전부 읽을 때까지 반복된다.

 

12. if ( file.exists() && file.isFile() ) 

 - 읽을 파일이 있는지 파일인지 확인!

 

13. if ( file.toString().toUpperCase().endWith(".DAT") 

 - 파일의 확장자가 .DAT파일인지 확인한다. 대소문자가 섞여 있을 수 있으니 대문자로 변경하여 비교한다. 확장자는 필요한 파일의 확장자를 써서 읽는다.

 

14. input 

 - 파일을 연다!

 

15. while ( ( line = input.readLine() ) != null) 

 - 반복문이다. 읽은 파일에서 한줄을 읽어서 처리한다. null이 아닐때 반복문을 실행한다. 

 

16. 파일을 쓴다.

 - 읽은 line의 데이터를 byte형태로 output에 넣는다. 파일에 데이터를 넣는다고 생각하자.

 

17. cnt증가

 - 처리한 건수를 알고 싶을 때 쓴다. while문은 line단위 이므로 while문 밖에 for문 안에 cnt++를 해준다. 건수는 알고싶지 않다면 안해도 된다.

 

18. 프로그램이 종료되면 파일이 생성된다.

 - targetFile에 있는 위치에 파일이 생성된다.

 

중요!

한가지 중요한것이 있다. 읽을 대상 파일의 encoding 이 무엇이냐에 따라서 java를 encoding에 맞게 변경을 해 주던지 읽고 쓸때 인코딩을 맞춰야한다. 제일 좋은건 읽을 파일과 java의 encoding을 맞춰주는것이 편리하긴하다.