원지의 개발
article thumbnail
728x90

- 로그 파일은 문자열이 기록된 파일이므로 Character Stream 사용
- 읽을 때 네이티브 메소드 호출 횟수를 줄이기 위해 버퍼 사용하는 것이 좋음
- BufferedReader 이용

'-' 는 0임 split 사용해서 공백 뒤의 자리 더하기
각각이 몇번 접속했는지 확인
똑같은 아이피가 나오면 count
Map은 똑같은게 있으면 덮는게 아님 있으면 1, 또 있으면 1에 추가
마지막으로 sort (내림차순)

조건

  • 로그 파일 읽기
  • 하나의 ip가 몇 번 접속했는지 확인
  • 가장 많이 접속한 ip부터 순차 출력

과정

1. BufferedReader 객체 생성

package logTest;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class LogTest2 {
	//파일에 문자열을 문자 단위로 읽어오기: FileReader 와 BufferedReader 이용
	public static void main(String[] args) {
		BufferedReader br = null;
		try {
			br = new BufferedReader(new FileReader("C:\\Users\\pheng\\Desktop\\course\\강의\\log test.txt"));
		
        } catch (Exception e) {
			System.out.println(e.getLocalizedMessage());
		
        } finally {
			if(br != null)
				try {
					br.close(); //닫기 필수
				} catch (IOException e) {
					e.printStackTrace();
				}
		}
	}
}
  • 파일에 문자열을 문자 단위로 읽어오기: FileReader 와 BufferedReader 이용
  • stream은 만들면 반드시 close() 필수

2. 줄 단위로 읽어서 출력

package logTest;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class LogTest2 {
	//파일에 문자열을 문자 단위로 읽어오기: FileReader 와 BufferedReader 이용
	//줄 단위로 읽어오기
	public static void main(String[] args) {
		BufferedReader br = null;
		try {
			br = new BufferedReader(new FileReader("C:\\Users\\pheng\\Desktop\\course\\강의\\log test.txt"));

			//줄 단위로 읽어서 출력하기
			while(true) {
				//한 줄 읽기
				String line = br.readLine();
				if(line == null)
					break;
				
				System.out.println(line); //단지 로그를 띄움
			}
		} catch (Exception e) {
			System.out.println(e.getLocalizedMessage());
		} finally {
			if(br != null)
				try {
					br.close(); //닫기 필수
				} catch (IOException e) {
					e.printStackTrace();
				}
		}
	}
}
  • readLine() 메서드를 사용해서 한 줄씩 읽기 = 한 줄씩 로그 띄우기
  • 읽을 내용이 없으면 멈춤

3. 필요한 ip 추출

package logTest;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class LogTest2 {
	//파일에 문자열을 문자 단위로 읽어오기: FileReader 와 BufferedReader 이용
	//줄 단위로 읽어오기
	public static void main(String[] args) {
		BufferedReader br = null;
		try {
			br = new BufferedReader(new FileReader("C:\\Users\\pheng\\Desktop\\course\\강의\\log test.txt"));

			//줄 단위로 읽어서 출력하기
			while(true) {
				//한 줄 읽기
				String line = br.readLine();
				if(line == null)
					break;
				
				//System.out.println(line); //단지 로그를 띄움
				
				//읽은 문자열에서 로그를 라인 단위로 분리
				String[] lines = line.split(" ");
				System.out.println(lines[0]);
			}
		} catch (Exception e) {
			System.out.println(e.getLocalizedMessage());
		} finally {
			if(br != null)
				try {
					br.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
		}
	}
}
  • split을 사용하여 읽은 문자열에서 로그를 라인 단위로 분리
    로그 파일이 ip - - [ 날짜, 시간 ] "GET/POST ..." 이런식으로 씌어있기 떄문에 공백 기준으로 분리
  • String 배열에 한 줄씩 저장되므로 0번 인덱스 출력

4. HashMap을 이용하여 ip별로 접속한 횟수 저장

package logTest;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class LogTest2 {
	//파일에 문자열을 문자 단위로 읽어오기: FileReader 와 BufferedReader 이용
	//줄 단위로 읽어오기
	public static void main(String[] args) {
		BufferedReader br = null;
		try {
			br = new BufferedReader(new FileReader("C:\\Users\\pheng\\Desktop\\course\\강의\\log test.txt"));
			
			//HashMap을 이용하여 접속한 ip별 횟수 출력
			Map<String, Integer> map = new HashMap<>();
			
			//줄 단위로 읽어서 출력하기
			while(true) {
				//한 줄 읽기
				String line = br.readLine();
				if(line == null)
					break;
				
				//System.out.println(line); //단지 로그를 띄움
				
				//읽은 문자열에서 로그를 라인 단위로 분리
				String[] lines = line.split(" ");
				//System.out.println(lines[0]);
			
				//저장된 키 있는지 확인
				Integer count = map.get(lines[0]);
				if(count == null) //키가 없으면
					map.put(lines[0], 1);
				else { //키가 저장되어 있으면
					map.put(lines[0], count + 1);
				}
			}
		} catch (Exception e) {
			System.out.println(e.getLocalizedMessage());
		} finally {
			if(br != null)
				try {
					br.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
		}
	}
}
  • HashMap 생성 후 저장된 키가 있는지 확인 - count 변수
  • 없으면 key, value 저장 (ip, 1)
  • 있으면 기존에 있던 key의 value에 +1

5. HashMap의 데이터 출력

			//데이터 출력 - 모든 key에 접근할 수 있는 set 가져오기
			//Set<String> keys = map.keySet();
			//for(String key : map.keySet())
			//	System.out.println(key + ": " + map.get(key) + "번");
			
			List<String> keySet = new ArrayList<>(map.keySet());
			
			//key 값으로 오름차순 정렬
	        //Collections.sort(keySet);
			
			//value 값으로 오름차순 정렬
			keySet.sort(new Comparator<String>() {
				@Override
				public int compare(String o1, String o2) {
					return map.get(o2).compareTo(map.get(o1));
				}
			});
			
			for(String key : keySet)
				System.out.println(key + ": " + map.get(key) + "번");
  • 정렬 없이 Set으로 데이터 출력
  • 정렬하기 위해서는 ArrayList 사용 - 익명 객체로 Comparator 생성해서 compare 메서드 오버라이딩

결과

package logTest;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class LogTest {

	//파일에 문자열을 문자 단위로 읽어오기: FileReader 와 BufferedReader 이용
	//줄 단위로 읽어오기
	public static void main(String[] args) {
		BufferedReader br = null;
		try {
			br = new BufferedReader(new FileReader("C:\\Users\\pheng\\Desktop\\course\\강의\\log test.txt"));
			
			//HashMap을 이용하여 접속한 ip별 횟수 출력
			Map<String, Integer> map = new HashMap<>();
			
			//줄 단위로 읽어서 출력하기
			while(true) {
				//한 줄 읽기
				String line = br.readLine();
				if(line == null)
					break;
				
				//System.out.println(line); //단지 로그를 띄움
				//읽은 문자열에서 로그를 라인 단위로 분리
				String[] lines = line.split(" ");
				//System.out.println(lines[0]);
				
				//저장된 키 있는지 확인
				Integer count = map.get(lines[0]);
				if(count == null) //키가 없으면
					map.put(lines[0], 1);
				else { //키가 저장되어 있으면
					map.put(lines[0], count + 1);
				}
			}
			
			//데이터 출력 - 모든 key에 접근할 수 있는 set 가져오기
			//Set<String> keys = map.keySet();
			//for(String key : map.keySet())
			//	System.out.println(key + ": " + map.get(key) + "번");
			
			List<String> keySet = new ArrayList<>(map.keySet());
			
			//key 값으로 오름차순 정렬
	        //Collections.sort(keySet);
			
			//value 값으로 오름차순 정렬
			keySet.sort(new Comparator<String>() {
				@Override
				public int compare(String o1, String o2) {
					return map.get(o2).compareTo(map.get(o1));
				}
			});
			
			for(String key : keySet)
				System.out.println(key + ": " + map.get(key) + "번");
			
			
		} catch (Exception e) {
			System.out.println(e.getLocalizedMessage());
		} finally {
			if(br != null)
				try {
					br.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
		}
	}
}
728x90
profile

원지의 개발

@원지다

250x250