gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 21:12:52 34 4
gpt4 key购买 nike

我有一个 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”日志文件。

关于java - 以相反的顺序逐行读取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6011345/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com