이미지09
Coding Story/JAVA

[ Java ] TXT 파일 한 줄씩 읽기, 두 개의 TXT 파일 비교, 파일 출력

반응형

 

 

본 포스팅은 자바 입출력이 아닌 파일 입출력 중 파일 출력부분을 다루어본다.

 

 

자바에서 텍스트 파일(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 파일이 존재한다고 가정한다.

파일 출력 및 비교 텍스트파일 예제 A와 B

 

 

두 개의 텍스트 파일을 보면 각각 동일한 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

 

 

본 포스팅에서 다룬 내용을 이해했다면, 이를 보다 간략하게 할 수 있는 방법이 없을까 싶을 수도 있다.

 

이 내용은 다음 포스팅에서 다루고 있으니 한 번쯤은 참고해보는 걸 추천 드림..

 

 

 

반응형