1. 程式人生 > 其它 >RandomAccessFile檔案讀取工具類

RandomAccessFile檔案讀取工具類

技術標籤:實習的一年java

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() 獲取檔案長度