我正在研究一种旨在缩短运行时/计算时间的启发式算法。要检索结果,我需要将它们写入文件。 写作是由不同的类完成的,但它们都应该写入同一个文件,我猜他们应该只使用一个编写器。
我一直在使用Logger
课程,但我不喜欢输出样式(带有时间戳和内容)。我宁愿创建我可以轻松解析的文件(例如JSON文件)。我应该使用BufferedWriter
,因为快速运行时至关重要。但是,我不知道如何使所有班级的作家都可以访问。也许像静态作家类?
编辑:我没有使用Thread接口。
答案 0 :(得分:0)
文件是独占资源,不能以多线程方式使用,对于你提到的问题,你有两种方法
将您自己的文件编写器实现为现有文件编写器(BufferedWriter)的包装器,它将允许您写入同一文件,确保在不同线程之间正确控制共享资源(在本例中为文件编写器) 答:这样做有两种选择,要么将作者公开的方法设为静态,要么根据需要使用它们。
B中。创建此writer类的公共实例,并将其注入所有使用者类。
答案 1 :(得分:0)
使用日志记录框架,但重新配置它不打印时间戳和内容,但只打印您要记录的字符串。
然后只需创建所需的确切字符串表示,并记录下来。
对于logback,您需要在类路径中看到一个logback.xml文件(改编自http://logback.qos.ch/manual/configuration.html):
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%msg%n</pattern>
</encoder>
</appender>
<root level="debug">
<appender-ref ref="STDOUT" />
</root>
</configuration>
其他日志框架使用类似的方法。使用SLF4J API,您可以自由选择后端。
答案 2 :(得分:0)
最好的日志记录引擎之一是Log4j
对于本机Java Logger,您可以创建自定义Formatter并将其设置为FileHandler,例如。
fileHandler.setFormatter(new CustomFormatter());
格式化程序类使用类似这样的东西
public class CustomFormatter extends Formatter {
@Override
public String format(LogRecord record) {
//write your custom JSON message when logging
//use a fast JSON library such as Boon or Jackson when writing to your Log
return record.getMessage();
}
}
答案 3 :(得分:0)
您可以使用Singleton设计模式。你可以拥有一个StringBuffer(它是线程安全的)并为你的StringBuffer定义一个最大大小,并在你的Singleton类中包含一个BufferedWriter。你的所有类都可以写入你的单例中定义的StringBuffer,一旦StringBuffer达到你为它定义的最大大小,使用Writer将StringBuffer写入你的文件,并清空StringBuffer以便你想要编写的下一批东西到磁盘
答案 4 :(得分:0)
如果您想在文件中编写JSON并且能够从应用程序的各个线程和部分添加条目,则以下方法可能有效。
AsyncLogger
...... AsyncLogger
中,包装将用于存储所有日志消息的java.util.concurrent.BlockingQueue
。 AsyncLogger
的同一个实例。ObjectMapper
。Files.write
方法。 此模式提供了一种处理这些条目的异步方式,可确保您的计算不会受到日志框架中I / O的干扰。此外,它使用众所周知的库来处理JSON转换。