Class RollingFileStream
- java.lang.Object
-
- java.io.OutputStream
-
- org.apache.derby.impl.services.stream.RollingFileStream
-
- All Implemented Interfaces:
java.io.Closeable
,java.io.Flushable
,java.lang.AutoCloseable
public class RollingFileStream extends java.io.OutputStream
This class provides rolling file OutputStream. The file pattern, file size, and number of files can be customized.This class borrows extensively from the java.util.logger.FileHandler class for its file handling ability and instead of handling logger messages it extends java.io.OutputStream.
A pattern consists of a string that includes the following special components that will be replaced at runtime:
- "/" the local pathname separator
- "%t" the system temporary directory
- "%h" the value of the "user.home" system property
- "%d" the value of the "derby.system.home" system property
- "%g" the generation number to distinguish rotated logs
- "%u" a unique number to resolve conflicts
- "%%" translates to a single percent sign "%"
Thus for example a pattern of "%t/java%g.log" with a count of 2 would typically cause files to be written on Solaris to /var/tmp/java0.log and /var/tmp/java1.log whereas on Windows 95 they would be typically written to C:\TEMP\java0.log and C:\TEMP\java1.log
Generation numbers follow the sequence 0, 1, 2, etc.
Normally the "%u" unique field is set to 0. However, if the FileHandler tries to open the filename and finds the file is currently in use by another process it will increment the unique number field and try again. This will be repeated until FileHandler finds a file name that is not currently in use. If there is a conflict and no "%u" field has been specified, it will be added at the end of the filename after a dot. (This will be after any automatically added generation number.)
Thus if three processes were all trying to output to fred%u.%g.txt then they might end up using fred0.0.txt, fred1.0.txt, fred2.0.txt as the first file in their rotating sequences.
Note that the use of unique ids to avoid conflicts is only guaranteed to work reliably when using a local disk file system.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description private class
RollingFileStream.MeteredStream
-
Field Summary
Fields Modifier and Type Field Description private boolean
append
The append flag which indicates at creation time to append to an existing file or to always create a new oneprivate int
count
The rolling file count.private java.io.File[]
files
The array of File instance representing the rolling filesprivate int
limit
private java.lang.String
lockFileName
The lockfile nameprivate static java.util.HashMap<java.lang.String,java.lang.String>
locks
private java.io.FileOutputStream
lockStream
The output stream that is used as a lockprivate static int
MAX_LOCKS
private RollingFileStream.MeteredStream
meter
The underlying stream being written to that keeps track of how much has been writtenprivate java.lang.String
pattern
The filename pattern.
-
Constructor Summary
Constructors Constructor Description RollingFileStream()
Construct a default RollingFileStream.RollingFileStream(java.lang.String pattern, int limit, int count, boolean append)
Initialize a RollingFileStream to write to a set of files with optional append.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description private void
checkMeter()
Invoked by the metered OutputStreamvoid
close()
Close all the files.private void
fileDelete(java.io.File file)
Delete a file in a privilege blockprivate boolean
fileExists(java.io.File file)
Check to see if a file exists in a privilege blockprivate long
fileLength(java.io.File file)
Get the length of a file in a privilege blockprivate boolean
fileRename(java.io.File file1, java.io.File file2)
Rename a file in a privilege blockprivate java.io.File
generate(java.lang.String pattern, int generation, int unique)
Generates and returns File from a patternprivate java.lang.String
getSystemProperty(java.lang.String property)
Gets a system property in a privileged blockprivate void
open(java.io.File fname, boolean append)
Opens a new file that and delegates it to a MeteredStreamprivate java.io.FileOutputStream
openFile(java.lang.String filename, boolean append)
Opens a file in the privileged blockprivate void
openFiles()
Opens the output files files based on the configured pattern, limit, count, and append mode.private void
rotate()
Rotates the log files.void
write(int b)
Implements the write method of the OutputStream.
-
-
-
Field Detail
-
meter
private RollingFileStream.MeteredStream meter
The underlying stream being written to that keeps track of how much has been written
-
append
private boolean append
The append flag which indicates at creation time to append to an existing file or to always create a new one
-
limit
private int limit
-
count
private int count
The rolling file count. This many files will be created before the oldest is removed and the files rolled.
-
pattern
private java.lang.String pattern
The filename pattern.
-
lockFileName
private java.lang.String lockFileName
The lockfile name
-
lockStream
private java.io.FileOutputStream lockStream
The output stream that is used as a lock
-
files
private java.io.File[] files
The array of File instance representing the rolling files
-
MAX_LOCKS
private static final int MAX_LOCKS
- See Also:
- Constant Field Values
-
locks
private static java.util.HashMap<java.lang.String,java.lang.String> locks
-
-
Constructor Detail
-
RollingFileStream
public RollingFileStream() throws java.io.IOException, java.lang.SecurityException
Construct a default RollingFileStream. This will be configured entirely with default values:- pattern - %d/derby-%g.log (DERBY_HOME/derby-0.log)
- limit - 0 (unlimited)
- count - 1 (one file)
- append - false (overwrite and not append)
- Throws:
java.io.IOException
- if there are IO problems opening the files.java.lang.SecurityException
- if a security manager exists and if the caller does not have LoggingPermission("control")).java.lang.NullPointerException
- if pattern property is an empty String.
-
RollingFileStream
public RollingFileStream(java.lang.String pattern, int limit, int count, boolean append) throws java.io.IOException, java.lang.SecurityException
Initialize a RollingFileStream to write to a set of files with optional append. When (approximately) the given limit has been written to one file, another file will be opened. The output will cycle through a set of count files.- Parameters:
pattern
- the pattern for naming the output filelimit
- the maximum number of bytes to write to any one filecount
- the number of files to useappend
- specifies append mode- Throws:
java.io.IOException
- if there are IO problems opening the files.java.lang.SecurityException
- if a security manager exists and if the caller does not have LoggingPermission("control").java.lang.IllegalArgumentException
- if limit < 0, or count < 1.java.lang.IllegalArgumentException
- if pattern is an empty string
-
-
Method Detail
-
write
public void write(int b) throws java.io.IOException
Implements the write method of the OutputStream. This writes the value to the metered stream.- Specified by:
write
in classjava.io.OutputStream
- Parameters:
b
- The value to write- Throws:
java.io.IOException
-
openFiles
private void openFiles() throws java.io.IOException
Opens the output files files based on the configured pattern, limit, count, and append mode.- Throws:
java.io.IOException
-
generate
private java.io.File generate(java.lang.String pattern, int generation, int unique) throws java.io.IOException
Generates and returns File from a pattern- Parameters:
pattern
- The filename patterngeneration
- The generation number used if there is a conflictunique
- The unique number to append to the filename- Returns:
- The File
- Throws:
java.io.IOException
-
rotate
private void rotate() throws java.io.IOException
Rotates the log files. The metered OutputStream is closed,the log files are rotated and then a new metered OutputStream is created.- Throws:
java.io.IOException
-
close
public void close() throws java.lang.SecurityException
Close all the files.- Specified by:
close
in interfacejava.lang.AutoCloseable
- Specified by:
close
in interfacejava.io.Closeable
- Overrides:
close
in classjava.io.OutputStream
- Throws:
java.lang.SecurityException
- if a security manager exists and if the caller does not have LoggingPermission("control").
-
getSystemProperty
private java.lang.String getSystemProperty(java.lang.String property)
Gets a system property in a privileged block- Parameters:
property
- The propety to get- Returns:
- The property value
-
openFile
private java.io.FileOutputStream openFile(java.lang.String filename, boolean append) throws java.io.IOException
Opens a file in the privileged block- Parameters:
filename
- The name of the file to openappend
- iftrue
open the file in append mode- Returns:
- The FileOutputStream for the file
- Throws:
java.io.IOException
-
fileExists
private boolean fileExists(java.io.File file)
Check to see if a file exists in a privilege block- Parameters:
file
- The file to check- Returns:
true
if the file exists orfalse
otherwise
-
fileDelete
private void fileDelete(java.io.File file)
Delete a file in a privilege block- Parameters:
file
- The file to delete
-
fileRename
private boolean fileRename(java.io.File file1, java.io.File file2)
Rename a file in a privilege block- Parameters:
file1
- The file to renamefile2
- The file to rename it to- Returns:
true
if the file was renamed or false otherwise
-
fileLength
private long fileLength(java.io.File file)
Get the length of a file in a privilege block- Parameters:
file
- The file to get the length of- Returns:
- The length of the file
-
open
private void open(java.io.File fname, boolean append) throws java.io.IOException
Opens a new file that and delegates it to a MeteredStream- Parameters:
fname
- The name of the fileappend
- Iftrue
append to the existing file- Throws:
java.io.IOException
-
checkMeter
private void checkMeter() throws java.io.IOException
Invoked by the metered OutputStream- Throws:
java.io.IOException
-
-