長い末尾、長い番号、ファイル ファイル、文字列の文字セット
4 パラメータの説明
end は座標に相当し、tail は上向きの開始点、num は読み取られた行数、ファイルターゲットファイルの文字セットのデフォルトは 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";
public static Final String POINT="ポイント";
public static Map tail(Long end,long num,File file,String charset)throws Exception{
if(num<=0||(end!=null&&end<0)){
新しい IllegalArgumentException() をスローします。
}
マップmap=new HashMap();
ランダムアクセスファイル acc=null;
試す {
acc = new RandomAccessFile(file, "r");
long temp_end = (end == null ? acc.length() : end);
ロング my_point = temp_end > ステップ ? (temp_end-step) : 0;
acc.seek(my_point);
LinkedList<Object[]> キュー = new LinkedList<Object[]>();
文字列温度;
int n=0;
while((temp=acc.readLine())!=null){
if(++n==1&&my_point!=0){
続く;
}
オブジェクト[] オブジェクト=新しいオブジェクト[2];
ロングポイント = acc.getFilePointer();
if(point>=temp_end&&end!=null){break;}
オブジェクト[0]=ポイント;
object[1]=new String(temp.getBytes("8859_1"),charset);
if(queue.size()==num){
queue.poll();
}
キュー.オファー(オブジェクト);
}
if(queue.size()<num&&my_point>0){
long last_num=num-queue.size();
Object[] ヘッダー = queue.peek();
if(header==null){throw new RuntimeException("FileUtil step:"+step+" の長さが足りません");}
マップ m = tail((Long)header[0], last_num, file,charset);
マップ.put(ポイント,m.get(ポイント));
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();
}
}
}
マップを返す。
}
}