업무를 하다 보면 백업된 쿼리(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을 맞춰주는것이 편리하긴하다.
'모바일환경코딩 > java' 카테고리의 다른 글
[quartz scudule] 1. 스케쥴러로 특정 시간에 DB업데이트 환경설정 (0) | 2023.02.07 |
---|---|
[모바일환경코딩] java NULL 공백 체크 용 공통함수 작성. (0) | 2021.01.11 |