All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.qiniu.datasource.TextFileReader Maven / Gradle / Ivy

package com.qiniu.datasource;

import com.qiniu.interfaces.ITextReader;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class TextFileReader implements ITextReader {

    private String name;
    private BufferedReader bufferedReader;
//    private String endPrefix;
    private int limit;
    private String line;
    private List lineList; // 缓存读取的行
    private long count;

    public TextFileReader(File file, String startPrefix, int limit) throws IOException {
        name = file.getPath();
        bufferedReader = new BufferedReader(new FileReader(file));
        this.limit = limit;
        line = bufferedReader.readLine();
        if (startPrefix != null) {
            while (line != null && line.compareTo(startPrefix) <= 0) {
                line = bufferedReader.readLine();
            }
        }
        lineList = new ArrayList<>();
        if (line != null) lineList.add(line);
//        this.endPrefix = "".equals(endPrefix) ? null : endPrefix;
//        if (line != null && this.endPrefix != null && this.endPrefix.compareTo(line) >= 0) lineList.add(line);
    }

    @Override
    public String getName() {
        return name;
    }

    @Override
    public List readLines() throws IOException {
        if (line == null) return null;
        List srcList = new ArrayList<>(limit);
        srcList.addAll(lineList);
        lineList.clear();
        while (true) {
            if (srcList.size() >= limit) break;
            try {
                // 避免文件过大,行数过多,使用 lines() 的 stream 方式直接转换可能会导致内存泄漏,故使用 readLine() 的方式
                line = bufferedReader.readLine();
            } catch (IOException e) {
                lineList = srcList;
                throw e;
            }
            if (line == null) break;
//            else if (endPrefix != null && endPrefix.compareTo(line) < 0) line = null;
            else srcList.add(line);
        }
        count += srcList.size();
        return srcList;
    }

    @Override
    public String currentEndLine() {
        return line;
    }

    @Override
    public long count() {
        return count;
    }

    @Override
    public void close() {
        try {
            bufferedReader.close();
        } catch (IOException e) {
            bufferedReader = null;
        }
        lineList.clear();
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy