/* * Copyright (C) The Apache Software Foundation. All rights reserved. * * This software is published under the terms of the Apache Software License * version 1.1, a copy of which has been included with this distribution in * the LICENSE file. */ package org.jivesoftware.util.log.output.io; import org.jivesoftware.util.log.format.Formatter; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; /** * A basic target that writes to a File. * * @author <a href="mailto:peter@apache.org">Peter Donald</a> */ public class FileTarget extends StreamTarget { ///File we are writing to private File m_file; ///Flag indicating whether or not file should be appended to private boolean m_append; /** * Construct file target to send to a file with a formatter. * * @param file the file to send to * @param append true if file is to be appended to, false otherwise * @param formatter the Formatter * @throws IOException if an error occurs */ public FileTarget(final File file, final boolean append, final Formatter formatter) throws IOException { super(null, formatter); if (null != file) { setFile(file, append); openFile(); } } /** * Set the file for this target. * * @param file the file to send to * @param append true if file is to be appended to, false otherwise * @throws IOException if directories can not be created or file can not be opened */ protected synchronized void setFile(final File file, final boolean append) throws IOException { if (null == file) { throw new NullPointerException("file property must not be null"); } if (isOpen()) { throw new IOException("target must be closed before " + "file property can be set"); } m_append = append; m_file = file; } /** * Open underlying file and allocate resources. * This method will attempt to create directories below file and * append to it if specified. */ protected synchronized void openFile() throws IOException { if (isOpen()) close(); final File file = getFile().getCanonicalFile(); final File parent = file.getParentFile(); if (null != parent && !parent.exists()) { parent.mkdir(); } final FileOutputStream outputStream = new FileOutputStream(file.getPath(), m_append); setOutputStream(outputStream); open(); } /** * Retrieve file associated with target. * This allows subclasses to access file object. * * @return the output File */ protected synchronized File getFile() { return m_file; } }