RandomAccessFile檔案讀取工具類
阿新 • • 發佈:2020-12-15
RandomAccessFile
java.io包下檔案讀寫工具類,能夠設定偏移量讀取檔案
需求
將系統輸出的日誌檔案讀取出來,給前端展示在頁面上
思路
日誌檔案的配置最大為20M,一次性讀取整個檔案是不可取的。所以就考慮“分頁讀取”,一次性讀取多少行返回前端,然後前端請求翻頁。java中有沒有象C那樣有偏移指標的工具類來讀取檔案?
實現
/**
* 獲取日誌內容
* @param fileName 檔名
* @param offset 檔案讀取的偏移量
* @return
*/
public DetailLogResponse readFile (String fileName, long offset) {
List<String> content = new ArrayList<>();
String filePath = UrlUtils.contact(logHome, fileName);
DetailLogResponse response = new DetailLogResponse(fileName, offset, content);
File file = new File(filePath);
try (RandomAccessFile randomAccessFile = new RandomAccessFile(file, "r")) {
randomAccessFile.seek(offset);
for (int i = 0; i < lineNumber; i++) {
// 防止阻塞
if (randomAccessFile.getFilePointer() >= randomAccessFile.length() - 500) {
break;
} else {
content.add(randomAccessFile.readLine());
}
}
response.setOffset(randomAccessFile.getFilePointer());
} catch (IOException e) {
log.error("獲取目標日誌出錯{}", filePath);
}
return response;
}
API
public RandomAccessFile(File file, String mode) 第二個引數看原始碼得知有r、rw、rws、rwd四種模式
if (mode.equals("r"))
imode = O_RDONLY;
else if (mode.startsWith("rw")) {
imode = O_RDWR;
rw = true;
if (mode.length() > 2) {
if (mode.equals("rws"))
imode |= O_SYNC;
else if (mode.equals("rwd"))
imode |= O_DSYNC;
else
imode = -1;
}
}
seek(long) 設定偏移量
getFilePointer() 獲取當前的偏移量
length() 獲取檔案長度