如何将.txt文件的最后5行读入java

kda*_*av4 3 java file-io

我有一个文本文件,包含几个条目,如:

hello
there
my
name
is
JoeBloggs
Run Code Online (Sandbox Code Playgroud)

我如何按降序读取最后五个条目,即来自JoeBloggs-那里

我目前只有代码来阅读最后一行:

public class TestLastLineRead {
    public static void main(String[] args) throws Exception {           
        FileInputStream in = new FileInputStream(file.txt);
        BufferedReader br = new BufferedReader(new InputStreamReader(in));
        String strLine = null, tmp;
        while ((tmp = br.readLine()) != null) {
            strLine = tmp;
        }

        String lastLine = strLine;
        System.out.println(lastLine);
        in.close();    
    }
}
Run Code Online (Sandbox Code Playgroud)

Pet*_*rey 15

您可以将行添加到a List,例如a LinkedList.当列表超过五行时,删除第一个/最后一个.

List<String> lines = new LinkedList<String>();
for(String tmp; (tmp = br.readLine()) != null;) 
    if (lines.add(tmp) && lines.size() > 5) 
        lines.remove(0);
Run Code Online (Sandbox Code Playgroud)


Ern*_*ill 9

一种非常简单的方法是使用Apache Commons Collections库中的CircularFifoBuffer类.它基本上是一个固定大小的列表,它会在旧元素已满时丢弃旧元素并添加新元素.所以你要创建一个CircularFifoBuffer5的大小,然后添加所有行.最后,它只包含文件的最后五行.


Try*_*ing 5

我们可以MemoryMappedFile用于打印最后5行:

private static void printByMemoryMappedFile(File file) throws FileNotFoundException, IOException{
        FileInputStream fileInputStream=new FileInputStream(file);
        FileChannel channel=fileInputStream.getChannel();
        ByteBuffer buffer=channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());
        buffer.position((int)channel.size());
        int count=0;
        StringBuilder builder=new StringBuilder();
        for(long i=channel.size()-1;i>=0;i--){
            char c=(char)buffer.get((int)i);
            builder.append(c);
            if(c=='\n'){
                if(count==5)break;
                count++;
                builder.reverse();
                System.out.println(builder.toString());
                builder=null;
                builder=new StringBuilder();
            }
        }
        channel.close();
    }
Run Code Online (Sandbox Code Playgroud)

RandomAccessFile 打印最后5行:

private static void printByRandomAcessFile(File file) throws FileNotFoundException, IOException{
        RandomAccessFile randomAccessFile = new RandomAccessFile(file, "r");
        int lines = 0;
        StringBuilder builder = new StringBuilder();
        long length = file.length();
        length--;
        randomAccessFile.seek(length);
        for(long seek = length; seek >= 0; --seek){
            randomAccessFile.seek(seek);
            char c = (char)randomAccessFile.read();
            builder.append(c);
            if(c == '\n'){
                builder = builder.reverse();
                System.out.println(builder.toString());
                lines++;
                builder = null;
                builder = new StringBuilder();
                if (lines == 5){
                    break;
                }
            }

        }
    }
Run Code Online (Sandbox Code Playgroud)