我有一个文本文件,包含几个条目,如:
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)
一种非常简单的方法是使用Apache Commons Collections库中的CircularFifoBuffer类.它基本上是一个固定大小的列表,它会在旧元素已满时丢弃旧元素并添加新元素.所以你要创建一个CircularFifoBuffer5的大小,然后添加所有行.最后,它只包含文件的最后五行.
我们可以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)
| 归档时间: |
|
| 查看次数: |
19824 次 |
| 最近记录: |