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
'프로그래밍 언어 > Java' 카테고리의 다른 글
[Java] Date, LocalDateTime..., Calendar, DecimalFormat (1) | 2023.09.01 |
---|---|
[Heap] Priority Queue(우선 순위 큐) (0) | 2023.06.12 |
[Java] Enum(열거형) (0) | 2023.06.08 |
진법 변환 / StringBuilder & StringBuffer / Arrays.stream (0) | 2023.05.07 |
[Java] 정규 표현식, Network (0) | 2022.10.31 |