gpt4 book ai didi

java - Java FileWriter 的 "Persistent streams"?

转载 作者:太空宇宙 更新时间:2023-11-04 07:32:05 26 4
gpt4 key购买 nike

当我想编写用于将文本写入文件的 Java 代码时,它通常看起来像这样:

File logFile = new File("/home/someUser/app.log");
FileWriter writer;

try {
writer = new FileWriter(logFile, true);

writer.write("Some text.");

writer.close();
} catch (IOException e) {
e.printStackTrace();
}

但是如果我连续执行大量写入操作怎么办?如果我每秒记录数十、数百甚至数千个写入操作怎么办?

与数据库(和 JDBC)允许“持久连接”(在多个调用中保持打开状态的连接)一样,是否有一种方法可以让“持久流”不需要在多个 write(String) 调用中打开/关闭?如果是这样,这将如何运作?我必须注意哪些陷阱/警告?提前致谢!

最佳答案

如果你看看这个实现

class Logger {
private final BufferedWriter w;

public Logger(final File file) throws IOException {
this.w = new BufferedWriter(new FileWriter(file));
LoggerRegistry.register(this);
}

public void log(String s) throws IOException {
synchronized (this.w) {
this.w.write(s);
this.w.write("\n");
}
}

public void close() throws IOException {
this.w.close();
}
}

文件保持打开状态。

如果有多个线程,则必须在 write 方法中进行同步(但无论如何都必须考虑这一点)。

如果文件保持打开状态,可能存在以下问题:

  • 理论上,您可能会用完文件句柄。这些可能是有限的(例如,请参阅 Linux 系统上的 ulimit -a):每个记录器消耗一个句柄。

  • 如果您使用不带缓冲的 FileWriter,则每次调用 write 时都会有 I/O 调用。这可能会很慢。

  • 如果您在 FileWriter 之上使用 BufferedWriter,则必须确保它在程序结束时正确关闭,否则缓冲区中的剩余内容可能无法写入磁盘。因此,您的程序需要一个 try/finally block ,它必须正确关闭所有记录器。

因此您需要注册所有记录器。这是一个简化版本(它不是线程安全的):

class LoggerRegistry {
private final static List<Logger> loggers = new ArrayList<Logger>();

public static void register(Logger l) {
loggers.add(l);
}

public static void close() {
for (Logger l : loggers) {
try {
l.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

并在主程序中使用它,如下所示:

public static void main(String[] args) throws IOException {
try {
final Logger l = new Logger(new File("/tmp/1"));
l.log("Hello");

// ...

} finally {
LoggerRegistry.close();
}
}

如果您有 Web 应用程序,则可以调用 ServletContextListener 中的 close 方法(方法 contextDestroyed)。

最大的性能提升可能是 BufferedWriter。如果您为每个写入操作打开/关闭它,那么这个优势就会消失,因为 close 必须调用 flush。因此,打开文件与缓冲的结合将非常快。

关于java - Java FileWriter 的 "Persistent streams"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17533199/

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