多个类的一个文件编写器(快速)

时间:2014-12-28 20:16:57

标签: java filewriter printwriter bufferedwriter writer

我正在研究一种旨在缩短运行时/计算时间的启发式算法。要检索结果,我需要将它们写入文件。 写作是由不同的类完成的,但它们都应该写入同一个文件,我猜他们应该只使用一个编写器。

我一直在使用Logger课程,但我不喜欢输出样式(带有时间戳和内容)。我宁愿创建我可以轻松解析的文件(例如JSON文件)。我应该使用BufferedWriter,因为快速运行时至关重要。但是,我不知道如何使所有班级的作家都可以访问。也许像静态作家类?

编辑:我没有使用Thread接口。

5 个答案:

答案 0 :(得分:0)

文件是独占资源,不能以多线程方式使用,对于你提到的问题,你有两种方法

  1. 正如您已经提到过的,您正在使用记录器,您可以继续这样做,并且可以根据您的需要通过您为所述类(Log4j Formatting Patterns )定义的记录器模式更改输出。然而 对于打印JSON输出,您只需自定义要写入json的消息并保存即可。
  2. 将您自己的文件编写器实现为现有文件编写器(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并且能够从应用程序的各个线程和部分添加条目,则以下方法可能有效。

  • 创建一个可以接收日志语句的类。这可以是POJO的形式,描述您的日志消息(稍后将是JSON)。我们暂时致电课程AsyncLogger ......
  • AsyncLogger中,包装将用于存储所有日志消息的java.util.concurrent.BlockingQueue
  • 确保所有数据生成者(计算)都可以访问AsyncLogger的同一个实例。
  • 创建一个不同的线程,该线程不断从队列中读取条目。
    • 将每个条目转换为JSON,例如:使用the Jackson library。查看ObjectMapper
    • 将JSON条目附加到文件,例如使用Java 7 Files.write方法。

此模式提供了一种处理这些条目的异步方式,可确保您的计算不会受到日志框架中I / O的干扰。此外,它使用众所周知的库来处理JSON转换。