package egovframework.rte.fdl.logging.util;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.RandomAccessFile;
public class LogFileUtil {
public static String getLastLine(File logFile) throws Exception {
return getTailLines(logFile, 1)[0];
// // RandomAccessFile 을 사용하면 임의의 위치로 seek 하여 포인터를 이동할 수 있음, read 모드
// RandomAccessFile file = new RandomAccessFile(logFile, "r");
// long fileLength = file.length();
// boolean isDummy = true;
// // 마지막 위치로 포인터 이동
// file.seek(fileLength);
// //
// for (int i = 1; i <= fileLength; i++) {
// // 로그 파일의 마지막 라인에 dummy new line 이 들어있음
// if (file.read() == '\n') {
// if (isDummy == true) {
// isDummy = false;
// // 거꾸로 scan 하며 두번째 뉴라인을 만나면 그 위치에서 readLine 을 하면 원하는 마지막 라인(데이터)임
// } else {
// return file.readLine();
// }
// }
// // 뉴라인을 만날때 까지 뒤에서 부터 한 바이트씩 늘려가며 포인터 이동. cf.) seek 는 파일시작지점부터의
// offset 임에 유의
// file.seek(fileLength - i);
// }
// // 위에서 최초 로그파일에 1행만 존재하는 경우 dummy 라인만 있고 그 위에 new line 이 없음.
// // 이 때는 파일 포인터가 파일 시작위치에 왔을 것이므로 그냥 readLine 하면 됨.
// return file.readLine();
}
public static String[] getTailLines(File logFile, int paramLines)
throws Exception {
int lines = paramLines; // PMD 바보
String[] tailLines = new String[lines];
// RandomAccessFile 을 사용하면 임의의 위치로 seek 하여 포인터를 이동할 수 있음, read 모드
RandomAccessFile file = new RandomAccessFile(logFile, "r");
long fileLength = file.length();
boolean isDummy = true;
// 마지막 위치로 포인터 이동
file.seek(fileLength);
// 파일의 마지막부터 원하는 라인수 만큼
while (lines > 0) {
for (int i = 1; i <= fileLength; i++) {
// 로그 파일의 마지막 라인에 dummy new line 이 들어있음
if (file.read() == '\n') {
if (isDummy) {
isDummy = false;
// 거꾸로 scan 하며 dummy가 아닌 뉴라인을 만나면 그 위치에서 readLine 을 하면
// 원하는 해당 라인 데이터 임
} else {
if (lines > 0) {
tailLines[--lines] = file.readLine();
}
}
}
// 뉴라인을 만날때 까지 뒤에서 부터 한 바이트씩 늘려가며 포인터 이동. cf.) seek 는 파일시작지점부터의
// offset 임에 유의
file.seek(fileLength - i);
}
// 위에서 최초 로그파일에 1행만 존재하는 경우 dummy 라인만 있고 그 위에 new line 이 없음.
// 이 때는 파일 포인터가 파일 시작위치에 왔을 것이므로 그냥 readLine 하면 됨.
if (lines > 0) {
tailLines[--lines] = file.readLine();
}
}
file.close();
return tailLines;
}
// 파일의 라인수 리턴
public static int countLines(BufferedReader in) throws IOException {
int numLines = 0;
String line;
do {
line = in.readLine();
if (line != null) {
numLines++;
}
} while (line != null);
return numLines;
}
// 파일의 라인수 리턴
public static int countLines(String fileName) {
BufferedReader in = null;
int numLines = 0;
try {
FileReader fileReader = new FileReader(fileName);
in = new BufferedReader(fileReader);
numLines = countLines(in);
} catch (IOException ioe) {
ioe.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
return numLines;
}
// 단어 포함여부 확인
public static Boolean contains(String str, BufferedReader in)
throws IOException {
String line;
Boolean bool = false;
do {
line = in.readLine();
if (line != null && line.contains(str)) {
bool = true;
}
} while (line != null);
return bool;
}
// 단어 포함여부 확인
public static Boolean contains(String fileName, String str) {
BufferedReader in = null;
Boolean bool = false;
try {
FileReader fileReader = new FileReader(fileName);
in = new BufferedReader(fileReader);
bool = contains(str, in);
} catch (IOException ioe) {
ioe.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
return bool;
}
// 단어수 리턴
public static int countWords(String str, BufferedReader in)
throws IOException {
int numWords = 0;
String line;
do {
line = in.readLine();
if (line != null && line.contains(str)) {
numWords++;
}
} while (line != null);
return numWords;
}
// 단어수 리턴
public static int countWords(String fileName, String str) {
BufferedReader in = null;
int numWords = 0;
try {
FileReader fileReader = new FileReader(fileName);
in = new BufferedReader(fileReader);
numWords = countWords(str, in);
} catch (IOException ioe) {
ioe.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
return numWords;
}
}