DeferredFileOutputStream.java
上传用户:u_thks
上传日期:2022-07-31
资源大小:1910k
文件大小:4k
源码类别:
WEB源码(ASP,PHP,...)
开发平台:
Java
- package com.gamvan.fileUpload;
- import java.io.ByteArrayOutputStream;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.OutputStream;
- public class DeferredFileOutputStream extends ThresholdingOutputStream
- {
- // ----------------------------------------------------------- Data members
- /**
- * The output stream to which data will be written prior to the theshold
- * being reached.
- */
- private ByteArrayOutputStream memoryOutputStream;
- /**
- * The output stream to which data will be written after the theshold is
- * reached.
- */
- private FileOutputStream diskOutputStream;
- /**
- * The output stream to which data will be written at any given time. This
- * will always be one of <code>memoryOutputStream</code> or
- * <code>diskOutputStream</code>.
- */
- private OutputStream currentOutputStream;
- /**
- * The file to which output will be directed if the threshold is exceeded.
- */
- private File outputFile;
- // ----------------------------------------------------------- Constructors
- /**
- * Constructs an instance of this class which will trigger an event at the
- * specified threshold, and save data to a file beyond that point.
- *
- * @param threshold The number of bytes at which to trigger an event.
- * @param outputFile The file to which data is saved beyond the threshold.
- */
- public DeferredFileOutputStream(int threshold, File outputFile)
- {
- super(threshold);
- this.outputFile = outputFile;
- memoryOutputStream = new ByteArrayOutputStream(threshold);
- currentOutputStream = memoryOutputStream;
- }
- // --------------------------------------- ThresholdingOutputStream methods
- /**
- * Returns the current output stream. This may be memory based or disk
- * based, depending on the current state with respect to the threshold.
- *
- * @return The underlying output stream.
- *
- * @exception IOException if an error occurs.
- */
- protected OutputStream getStream() throws IOException
- {
- return currentOutputStream;
- }
- /**
- * Switches the underlying output stream from a memory based stream to one
- * that is backed by disk. This is the point at which we realise that too
- * much data is being written to keep in memory, so we elect to switch to
- * disk-based storage.
- *
- * @exception IOException if an error occurs.
- */
- protected void thresholdReached() throws IOException
- {
- byte[] data = memoryOutputStream.toByteArray();
- FileOutputStream fos = new FileOutputStream(outputFile);
- fos.write(data);
- diskOutputStream = fos;
- currentOutputStream = fos;
- memoryOutputStream = null;
- }
- // --------------------------------------------------------- Public methods
- /**
- * Determines whether or not the data for this output stream has been
- * retained in memory.
- *
- * @return <code>true</code> if the data is available in memory;
- * <code>false</code> otherwise.
- */
- public boolean isInMemory()
- {
- return (!isThresholdExceeded());
- }
- /**
- * Returns the data for this output stream as an array of bytes, assuming
- * that the data has been retained in memory. If the data was written to
- * disk, this method returns <code>null</code>.
- *
- * @return The data for this output stream, or <code>null</code> if no such
- * data is available.
- */
- public byte[] getData()
- {
- if (memoryOutputStream != null)
- {
- return memoryOutputStream.toByteArray();
- }
- return null;
- }
- /**
- * Returns the data for this output stream as a <code>File</code>, assuming
- * that the data was written to disk. If the data was retained in memory,
- * this method returns <code>null</code>.
- *
- * @return The file for this output stream, or <code>null</code> if no such
- * file exists.
- */
- public File getFile()
- {
- return outputFile;
- }
- }