본 포스팅은 자바 입출력이 아닌 파일 입출력 중 파일 출력부분을 다루어본다.
자바에서 텍스트 파일(txt file) 을 읽어들여 출력하고 싶다면 어떻게 해야 할까?
먼저 실행 원리부터 말하자면 파일을 가져와 객체를 만들고, 파일 객체에서 값을 읽어 가공 및 사용한다.
사용을 끝마치면 파일을 다시 닫아주는 이런 개념이다.
그럼 본론으로 들어가 직접 예제를 보며 이해해보도록 하자.
아래와 같은 ATEXT.txt 파일이 있다고 가정해보자.
ATEXT.txt 의 파일 경로는 아래와 같이 해놓았다. 코드 작성 때는 '\'가 아니라 '/'로 바꿔주어야 한다.
C:\Users\jnmoon\Desktop\TEST
이러한 ATEXT.txt 를 읽어와 텍스트내용을 출력해보고자 한다.
코드는 다음과 같다. ( JUNIT TEST 를 사용했음 ).
@Test
public void test() {
try {
//file을 가져와 file 객체 생성 ( '\'가 아닌 '/'임을 명심 )
File aText = new File("C:/Users/jnmoon/Desktop/TEST/ATEXT.txt");
//file 입력 스트림을 생성
FileReader aReader = new FileReader(aText);
//스트림으로 입력 버퍼를 생성
BufferedReader aBufReader = new BufferedReader(aReader);
List<String> aLines = new ArrayList<String>();
String aLine = "";
//텍스트 내용을 한 줄씩 읽어와 aLine에 담고, 이를 aLines에 add 함.
while((aLine = aBufReader.readLine()) != null) {
aLines.add(aLine);
}
//버퍼를 닫아줌 ( 파일을 닫아줌 )
aBufReader.close();
for(int i = 0 ; i < aLines.size() ; i++) {
System.out.println(i + " 번 행 데이터 : " + aLines.get(i));
}
} catch(Exception e) {
//TODO
}
}
주석으로 설명을 해놨지만 다시 간결하게 코드의 목적을 순서대로 정리해보면 다음과 같다,
① txt 파일을 가져와 File 객체를 생성한다.
② File 객체를 읽을 수 있는 통로인 스트림을 생성한다.
③ 생성한 스트림으로 버퍼를 생성한다.
- 버퍼는 파일 데이터를 저장해놓고 그때그때 사용할 수 있는 효율성이 있음
④ 버퍼를 통해 한 줄씩 파일의 데이터를 읽어 리스트에 담았음
⑤ 리스트 사이즈만큼 리스트 내의 데이터 출력
실행 결과
0 번 행 데이터 : A1
1 번 행 데이터 : A2
2 번 행 데이터 : A3
3 번 행 데이터 : A4
4 번 행 데이터 : A5
그럼 이번엔 이를 응용해 두 개의 텍스트 파일을 읽어와 텍스트 내용을 비교해 중복되는 내용만 출력해보자.
아래와 같은 ATEXT.txt 파일과 BTEXT.txt 파일이 존재한다고 가정한다.
두 개의 텍스트 파일을 보면 각각 동일한 A5 를 가지고 있음을 알 수 있다.
이렇게 두 파일이 가지고 있는 A5 에 대해서만 출력해보도록 하자.
이전과 동일하게 코드에 주석을 달아놓은 설명을 참고하며 이해해보도록 하자.
@Test
public void test() {
try {
//ATEXT.txt 와 BTEXT.txt 파일을 가져와 객체를 생성
File aText = new File("C:/Users/jnmoon/Desktop/TEST/ATEXT/txt");
File bText = new File("C:/Users/jnmoon/Desktop/TEST/BTEXT/txt");
//A, B 각각 file 입력 스트림을 생성
FileReader aReader = new FileReader(aText);
FileReader bReader = new FileReader(bText);
//스트림으로 입력 버퍼를 생성
BufferedReader aBufReader = new BufferedReader(aReader);
BufferedReader bBufReader = new BufferedReader(bReader);
List<String> aLines = new ArrayList<String>();
List<String> bLines = new ArrayList<String>();
String aLine = "";
String bLine = "";
//A의 텍스트내용을 한 줄씩 aLine에 담고 이를 aLines에 add.
while((aLine = aBufReader.readLine()) != null) {
aLines.add(aLine);
}
//A Buffer 닫아줌
aBufReader.close();
//B의 텍스트내용을 한 줄씩 bLine에 담고 이를 bLines에 add.
while((bLine = bBufReader.readLine()) != null) {
bLines.add(bLine);
}
//B Buffer 닫아줌
bBufReader.close();
for(int i = 0 ; i < aLines.size() ; i++) {
int matchCount = 0;
for(int j = 0 ; j < bLines.size() ; j++) {
if(aLines.get(i).equals(bLines.get(j)) {
matchCount = matchCount + 1;
}
}
if(matchCount > 0) {
System.out.println("동일한 데이터 : " + aLines.get(i));
}
}
} catch(Exception e) {
//TODO
}
}
이전의 내용과 원리는 동일하며, ATEXT.txt 와 BTEXT.txt 의 텍스트 내용을 각각 리스트에 담고,
A List 와 B List 를 사이즈만큼 돌려 동일한 값을 찾아낸다.
실행 결과는 다음과 같다.
동일한 데이터 : A5
본 포스팅에서 다룬 내용을 이해했다면, 이를 보다 간략하게 할 수 있는 방법이 없을까 싶을 수도 있다.
이 내용은 다음 포스팅에서 다루고 있으니 한 번쯤은 참고해보는 걸 추천 드림..
'Coding Story > JAVA' 카테고리의 다른 글
[ Java ] FileUtils 사용 ( readLines ) Maven Repository (1) | 2021.02.10 |
---|---|
[ Java ] 문자에서 정수, 실수에서 정수, 정수에서 문자 등 형변환 (0) | 2021.01.06 |
[ Java ] 자바 반복문의 continue 와 break (5) | 2020.12.16 |
[ Java ] 변수의 6가지 성질 ( 속성 ) (4) | 2020.10.28 |
[ Spring ] 스프링 Export & Import 방법, Import 에러 (0) | 2020.10.28 |