긴 끝, 긴 숫자, 파일 파일, 문자열 문자 집합
4개의 매개변수 설명
end는 좌표와 동일하고 tail은 위쪽 시작점, num은 읽은 줄 수, 파일 대상 파일 charset 문자 집합의 기본값은 UTF8입니다.
end가 null이면 파일 끝에서 위쪽으로 가져오는 것을 의미합니다.
Map m=FileUtil.tail(null,10,file,null)//파일의 마지막 10줄을 읽으면 결과는 m.get(FileUtil.ARR)에 있습니다.
FileUtil.tail(m.get(FileUtil.POINT),3,file,null)//파일의 마지막 줄부터 11~13번째 줄을 읽는다. 실제로는 위에서 10번째 줄을 읽은 후 3줄을 읽는다는 뜻이다. 상승.
다음과 같이 코드 코드를 복사합니다.
공개 클래스 FileUtil {
개인 정적 최종 긴 단계=5000;
공개 정적 최종 문자열 ARR="arr";
공개 정적 최종 문자열 POINT="포인트";
공개 정적 지도 꼬리(긴 끝, 긴 숫자, 파일 파일, 문자열 문자 집합)에서 예외가 발생합니다.
if(num<=0||(end!=null&&end<0)){
새로운 IllegalArgumentException()을 던져라;
}
지도 맵=new HashMap();
RandomAccessFile acc=null;
노력하다 {
acc = new RandomAccessFile(file, "r");
long temp_end = (end == null ? acc.length() : end);
long my_point = temp_end > step ? (temp_end-step) : 0;
acc.seek(my_point);
LinkedList<Object[]> 대기열 = new LinkedList<Object[]>();
문자열온도;
정수 n=0;
while((temp=acc.readLine())!=null){
if(++n==1&&my_point!=0){
계속하다;
}
객체[] 객체=새 객체[2];
긴 지점 = acc.getFilePointer();
if(point>=temp_end&&end!=null){break;}
객체[0]=점;
개체[1]=new String(temp.getBytes("8859_1"),charset);
if(queue.size()==num){
queue.poll();
}
queue.offer(객체);
}
if(queue.size()<num&&my_point>0){
long last_num=num-queue.size();
Object[] 헤더 = queue.peek();
if(header==null){throw new RuntimeException("FileUtil 단계:"+step+" 길이가 충분하지 않음");}
맵 m = tail((Long)header[0], last_num, file,charset);
map.put(POINT,m.get(POINT));
map.put(ARR,ArrayUtils.addAll((Object[])m.get(ARR),queue.toArray()));
}else if(queue.size()>0){//얻은 행 수가 충분하지 않아 TOP에 도달하지 않았습니다.
map.put(POINT,queue.peek()[0]);
map.put(ARR,queue.toArray());
}
}마지막으로 {
if(acc!=null){
노력하다 {
acc.close();
} 잡기(IOException e) {
e.printStackTrace();
}
}
}
반환 지도;
}
}