|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object java.io.OutputStream org.archive.io.RecordingOutputStream
public class RecordingOutputStream
An output stream that records all writes to wrapped output stream. A RecordingOutputStream can be wrapped around any other OutputStream to record all bytes written to it. You can then request a ReplayInputStream to read those bytes.
The RecordingOutputStream uses an in-memory buffer and backing disk file to allow it to record streams of arbitrary length limited only by available disk space.
As long as the stream recorded is smaller than the in-memory buffer, no disk access will occur.
Recorded content can be recovered as a ReplayInputStream (via getReplayInputStream() or, for only the content after the content-begin-mark is set, getContentReplayInputStream() ) or as a ReplayCharSequence (via getReplayCharSequence()).
This class is also used as a straight output stream
by RecordingInputStream
to which it records all reads.
RecordingInputStream
is exploiting the file backed buffer
facility of this class passing null
for the stream
to wrap. TODO: Make a FileBackedOutputStream class that is
subclassed by RecordingInputStream.
Field Summary | |
---|---|
protected byte[] |
bufStreamBuf
Reusable buffer for FastBufferedOutputStream |
protected static java.util.logging.Logger |
logger
|
protected static long |
MAX_HEADER_MATERIAL
Maximum amount of header material to accept without the content body beginning -- if more, throw a RecorderTooMuchHeaderException. |
protected long |
maxLength
maximum length of material to record before throwing exception |
protected long |
maxRateBytesPerMs
maximum rate to record (adds delays to hit target rate) |
protected long |
startTime
time recording begins for timeout, rate calculations |
protected long |
timeoutMs
maximum time to record before throwing exception |
Constructor Summary | |
---|---|
RecordingOutputStream(int bufferSize,
java.lang.String backingFilename)
Create a new RecordingOutputStream. |
Method Summary | |
---|---|
protected void |
checkLimits()
Check any enforced limits. |
void |
close()
|
protected void |
closeDiskStream()
|
void |
closeRecorder()
|
void |
flush()
|
long |
getContentBegin()
Return stored content-begin-mark (which is also end-of-headers) |
ReplayInputStream |
getContentReplayInputStream()
Return a replay stream, cued up to begining of content |
byte[] |
getDigestValue()
Return the digest value for any recorded, digested data. |
long |
getRemainingLength()
Return number of bytes that could be recorded without hitting length limit |
ReplayCharSequence |
getReplayCharSequence()
|
ReplayCharSequence |
getReplayCharSequence(java.lang.String characterEncoding)
|
ReplayCharSequence |
getReplayCharSequence(java.lang.String characterEncoding,
long startOffset)
|
ReplayInputStream |
getReplayInputStream()
|
ReplayInputStream |
getReplayInputStream(long skip)
|
long |
getResponseContentLength()
|
long |
getSize()
|
boolean |
isOpen()
|
void |
mark()
When used alongside a mark-supporting RecordingInputStream, remember a position reachable by a future reset(). |
void |
markContentBegin()
Remember the current position as the start of the "response body". |
void |
open()
Wrap the given stream, both recording and passing along any data written to this RecordingOutputStream. |
void |
open(java.io.OutputStream wrappedStream)
Wrap the given stream, both recording and passing along any data written to this RecordingOutputStream. |
void |
reset()
When used alongside a mark-supporting RecordingInputStream, reset the position to that saved by previous mark(). |
void |
resetLimits()
Reset limits to effectively-unlimited defaults |
void |
setDigest(java.security.MessageDigest md)
Sets a digest function which may be applied to recorded data. |
void |
setDigest(java.lang.String algorithm)
Sets a digest function which may be applied to recorded data. |
void |
setLimits(long length,
long milliseconds,
long rateKBps)
Set limits on length, time, and rate to enforce. |
void |
setSha1Digest()
Convenience method for setting SHA1 digest. |
void |
startDigest()
Starts digesting recorded data, if a MessageDigest has been set. |
void |
write(byte[] b,
int off,
int len)
|
void |
write(int b)
|
Methods inherited from class java.io.OutputStream |
---|
write |
Methods inherited from class java.lang.Object |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
Field Detail |
---|
protected static java.util.logging.Logger logger
protected byte[] bufStreamBuf
protected static final long MAX_HEADER_MATERIAL
protected long maxLength
protected long timeoutMs
protected long maxRateBytesPerMs
protected long startTime
Constructor Detail |
---|
public RecordingOutputStream(int bufferSize, java.lang.String backingFilename)
bufferSize
- Buffer size to use.backingFilename
- Name of backing file to use.Method Detail |
---|
public void open() throws java.io.IOException
java.io.IOException
- If failed creation of backing file.public void open(java.io.OutputStream wrappedStream) throws java.io.IOException
wrappedStream
- Stream to wrap. May be null for case where we
want to write to a file backed stream only.
java.io.IOException
- If failed creation of backing file.public void write(int b) throws java.io.IOException
write
in class java.io.OutputStream
java.io.IOException
public void write(byte[] b, int off, int len) throws java.io.IOException
write
in class java.io.OutputStream
java.io.IOException
protected void checkLimits() throws RecorderIOException
RecorderIOException
public void close() throws java.io.IOException
close
in interface java.io.Closeable
close
in class java.io.OutputStream
java.io.IOException
protected void closeDiskStream() throws java.io.IOException
java.io.IOException
public void closeRecorder() throws java.io.IOException
java.io.IOException
public void flush() throws java.io.IOException
flush
in interface java.io.Flushable
flush
in class java.io.OutputStream
java.io.IOException
public ReplayInputStream getReplayInputStream() throws java.io.IOException
java.io.IOException
public ReplayInputStream getReplayInputStream(long skip) throws java.io.IOException
java.io.IOException
public ReplayInputStream getContentReplayInputStream() throws java.io.IOException
java.io.IOException
public long getSize()
public void markContentBegin()
public long getContentBegin()
public void startDigest()
public void setSha1Digest()
setDigest(String)
public void setDigest(java.lang.String algorithm)
setDigest(MessageDigest)
is that this method tries to reuse MethodDigest instance if already allocated
and of appropriate algorithm.
algorithm
- Message digest algorithm to use.setDigest(MessageDigest)
public void setDigest(java.security.MessageDigest md)
md
- Message digest function to use.public byte[] getDigestValue()
public ReplayCharSequence getReplayCharSequence() throws java.io.IOException
java.io.IOException
public ReplayCharSequence getReplayCharSequence(java.lang.String characterEncoding) throws java.io.IOException
java.io.IOException
public ReplayCharSequence getReplayCharSequence(java.lang.String characterEncoding, long startOffset) throws java.io.IOException
characterEncoding
- Encoding of recorded stream.
java.io.IOException
public long getResponseContentLength()
public boolean isOpen()
public void mark()
public void reset()
public void setLimits(long length, long milliseconds, long rateKBps)
length
- milliseconds
- rateKBps
- public void resetLimits()
public long getRemainingLength()
|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |