1

如何仅读取 5 行并按降序排列的文件。示例我有一个 my.log 文件,其中包含以下内容:

one
two
three
four
five
six
seven
eight
nine
ten
eleven
twelve

我想要的结果如下:

twelve
eleven
ten
nine
eight

我现在的代码是:

import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class MainActivity extends Activity {

    long sleepTime = 1000;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        String log = "/sdcard/my.log";
        try {
            Tail(log);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void Tail(String filename) throws IOException {
        File checkfile = new File(filename);
        if (checkfile.exists()) {
            BufferedReader input = new BufferedReader(new FileReader(filename));
            String currentLine = null;

            while (true) {
                if ((currentLine = input.readLine()) != null) {
                    Log.d("MyLog", currentLine);
                    continue;
                }

                try {
                    Thread.sleep(sleepTime);
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                    break;
                }

            }
            input.close();
        } else {
            Log.d("MyLog", "File not found...");
        }
    }

}

但是这次结果是打印文件中的所有内容,结果不是按降序排序。所以现在结果如下:

one
two
three
four
five
six
seven
eight
nine
ten
eleven
twelve

谢谢。

4

7 回答 7

2

您需要先缓存 List 中的所有行。然后你可以得到最后五行。

List<String> l = new List<String>();
...
l.add(currentLine);
...
for(int i = 0; i < 5; i++){
    Log.d("MyLog", l.get(l.size() - i - 1));
}
于 2013-08-15T19:02:21.793 回答
1

维护一个由 5 个字符串组成的数组并循环填充文件行。然后以相反的顺序枚举:

int MAX_LINES_COUNT = 5;
String[] lastFiveLines = new String[MAX_LINES_COUNT];    
int lineNumber = 0;

// populate
// .... inside the loop

         lastFiveLines[lineNumber++ % MAX_LINES_COUNT] = currentLine;

//....
// Now get the last five lines

for(int i=0; i<MAX_LINES_COUNT; i++)
{
    Log.d("MyLog", lastFiveLines[(--lineNumber) % MAX_LINES_COUNT]);
}

它只会占用必要的内存量(适用于大文件)。

于 2013-08-15T19:08:47.467 回答
0

使用 RandomAccessFile 是最简单的解决方案之一。指向文件末尾,然后向后读取。该线程列出了它的源代码。

于 2013-08-15T19:09:58.010 回答
0

如果文件足够大,读取整个文件会引发性能问题。

为了提高效率,您需要使用 RandomAccessFile 类,并向后读取文件(将文件指针移动到最后一个字符并向后搜索,直到获得 5 行)。

当您只需要读取或操作文件内容的一部分时,RandomAccessFile 是一种选择。

于 2013-08-15T19:07:43.593 回答
0

逐行读取文件,但只保留最后五行,使用 aLinkedList并在开头添加最后读取的行。如果在每一行之后列表超过五行,则删除第 5 行:

BufferedReader reader = new BufferedReader(new FileReader(myLog));
String line;
while((line = reader.readLine()) != null) {
    lastLines.add(0, line);
    if(lastLines.size() > 5)
        lastLines.remove(5);
}

// lastLines will have your five lines in reversed order
System.out.println(lastLines);
于 2013-08-15T19:07:46.983 回答
0

我不知道你为什么使用 Thread。无论如何,我将尝试仅使用 Java I/O 和 Util 来回答您的问题。因此,如果这不合适,请使用等效的 android 开发包。

public void tail(File in){
    List<String> list = new ArrayList<String>();\\ You could use an Linked List as well
    try {
    Scanner scanner = new Scanner(in).useDelimiter("\n");

    while(scanner.hasNext()){
    String line = scanner.next().trim();
    list.add(line);
    scanner.close();
} 
     catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
}
    for(int i=list.size()-1; i>list.size()-6; i--){
        System.out.println(list.get(i));
    }
}
于 2013-08-15T19:12:25.573 回答
0

如果您知道您的文件已排序,您不需要正确排序吗?

一次读取一行文件。保持读取最后 5 行的窗口,并读取整个文件。

最后,文件的最后五行将按升序排列。现在翻转它们。现在你已经按降序排列了它们。

如果您需要按顺序排列任何范围的行,只需将文件读入 RAM 并遍历您需要的范围。

于 2013-08-15T19:01:02.533 回答