当前位置: 首页 > 面试题库 >

以相反的顺序逐行读取文件

慕阳
2023-03-14
问题内容

我有一个Java
ee应用程序,在该应用程序中,我使用servlet来打印使用log4j创建的日志文件。在读取日志文件时,通常会寻找最后一个日志行,因此,如果servlet以相反的顺序打印日志文件,则它会更加有用。我的实际代码是:

    response.setContentType("text");
    PrintWriter out = response.getWriter();
    try {
        FileReader logReader = new FileReader("logfile.log");
        try {
            BufferedReader buffer = new BufferedReader(logReader);
            for (String line = buffer.readLine(); line != null; line = buffer.readLine()) {
                out.println(line);
            }
        } finally {
            logReader.close();
        }
    } finally {
        out.close();
    }

我在互联网上找到的实现涉及使用StringBuffer并在打印之前加载所有文件,难道没有找到找到文件结尾并读取内容直到文件开头的代码轻巧的方式吗?


问题答案:

[编辑]

根据要求,我将在稍后的评论中添加此答案:如果您经常需要此行为,则“更合适的”解决方案可能是使用DBAppender将日志从文本文件移动到数据库表(log4j
2的一部分)。然后,您可以简单地查询最新条目。

[/编辑]

与列出的答案相比,我可能会略有不同。

(1)创建一个子类,Writer该子类以相反的顺序写入每个字符的编码字节:

public class ReverseOutputStreamWriter extends Writer {
    private OutputStream out;
    private Charset encoding;
    public ReverseOutputStreamWriter(OutputStream out, Charset encoding) {
        this.out = out;
        this.encoding = encoding;
    }
    public void write(int ch) throws IOException {
        byte[] buffer = this.encoding.encode(String.valueOf(ch)).array();
        // write the bytes in reverse order to this.out
    }
    // other overloaded methods
}

(2)创建log4j
WriterAppender的子类,该子类的createWriter方法将被覆盖以创建的实例ReverseOutputStreamWriter

(3)创建一个log4j Layout的子类,其format方法以相反的字符顺序返回日志字符串:

public class ReversePatternLayout extends PatternLayout {
    // constructors
    public String format(LoggingEvent event) {
        return new StringBuilder(super.format(event)).reverse().toString();
    }
}

(4)修改我记录配置文件发送日志消息到 两个
“正常”的日志文件和“反向”的日志文件。“反向”日志文件将包含与“正常”日志文件相同的日志消息,但是每条消息将向后写入。(请注意,“反向”日志文件的编码不一定符合UTF-8甚至任何字符编码。)

(5)创建一个InputStream包装的实例的子类,RandomAccessFile以便以相反的顺序读取文件的字节:

public class ReverseFileInputStream extends InputStream {
    private RandomAccessFile in;
    private byte[] buffer;
    // The index of the next byte to read.
    private int bufferIndex;
    public ReverseFileInputStream(File file) {
        this.in = new RandomAccessFile(File, "r");
        this.buffer = new byte[4096];
        this.bufferIndex = this.buffer.length;
        this.in.seek(file.length());
    }
    public void populateBuffer() throws IOException {
        // record the old position
        // seek to a new, previous position
        // read from the new position to the old position into the buffer
        // reverse the buffer
    }
    public int read() throws IOException {
        if (this.bufferIndex == this.buffer.length) {
            populateBuffer();
            if (this.bufferIndex == this.buffer.length) {
                return -1;
            }
        }
        return this.buffer[this.bufferIndex++];
    }
    // other overridden methods
}

现在,如果我想以相反的顺序读取“正常”日志文件的条目,我只需要创建一个实例ReverseFileInputStream,将其赋予“
revere”日志文件。



 类似资料:
  • 问题内容: 如何使用python以相反的顺序读取文件?我想从最后一行读取文件。 问题答案: 在Python 3中:

  • 我正在努力阅读附加的TXT文件,以csv形式显示从文件中读取的每个字段,我做了一个接近我想要的代码,但我没有前进。 TXT文件格式: 我的代码在我想要的位置读取第一行,但下面的行我不能,更不用说重复文件中包含的下一个工资单的读数了。 目前的输出是这样的: 出口应该是怎样的 逐行读取和捕获数据,我必须完成一个工资单,它将在输出中形成一行,第二个工资单将在输出中形成第二行,因此,直到txt文件结束,此

  • 问题内容: 我有一个LinkedHashMap: 我需要从给定键的位置向后迭代。因此,如果为我提供了第十个项目的密钥,则需要向后迭代哈希表9、8、7等。 问题答案: 您不必遍历它。但是拔下钥匙并将其存储在列表中会很方便。这就是执行indexOf()类型操作的唯一方法。

  • 我正在试着阅读我的文件的每一行,其中包含一个用户名列表,并用它创建一个登录系统。我正在尝试实现一个基本的登录系统,它的用户名存储在.txt文件中,但我的代码不工作,我不知道为什么。我认为问题出在检查用户名的循环中。 这是我的代码,但它不起作用,只是打印总是失败: 有什么想法吗?

  • 本文向大家介绍C#逐行读取文件的方法,包括了C#逐行读取文件的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#逐行读取文件的方法。分享给大家供大家参考。具体如下: 这里使用C#逐行读取文件,对于大文件的读取非常有用。 希望本文所述对大家的C#程序设计有所帮助。

  • 问题内容: 我实现了一个小的IO类,它可以从不同磁盘(例如,两个包含相同文件的硬盘)上的多个相同文件中读取数据。在顺序情况下,两个磁盘在文件上的平均读取速度均为60MB / s,但是当我进行交错操作(例如4k磁盘1、4k磁盘2然后合并)时,有效读取速度会降低到40MB / s而不是增加吗? 上下文:Win 7 + JDK 7b70、2GB RAM,2.2GB测试文件。基本上,我尝试以穷人的方式模仿