DeferredFileOutputStream.java
上传用户:u_thks
上传日期:2022-07-31
资源大小:1910k
文件大小:4k
源码类别:

WEB源码(ASP,PHP,...)

开发平台:

Java

  1. package com.gamvan.fileUpload;
  2. import java.io.ByteArrayOutputStream;
  3. import java.io.File;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6. import java.io.OutputStream;
  7. public class DeferredFileOutputStream extends ThresholdingOutputStream
  8. {
  9.     // ----------------------------------------------------------- Data members
  10.     /**
  11.      * The output stream to which data will be written prior to the theshold
  12.      * being reached.
  13.      */
  14.     private ByteArrayOutputStream memoryOutputStream;
  15.     /**
  16.      * The output stream to which data will be written after the theshold is
  17.      * reached.
  18.      */
  19.     private FileOutputStream diskOutputStream;
  20.     /**
  21.      * The output stream to which data will be written at any given time. This
  22.      * will always be one of <code>memoryOutputStream</code> or
  23.      * <code>diskOutputStream</code>.
  24.      */
  25.     private OutputStream currentOutputStream;
  26.     /**
  27.      * The file to which output will be directed if the threshold is exceeded.
  28.      */
  29.     private File outputFile;
  30.     // ----------------------------------------------------------- Constructors
  31.     /**
  32.      * Constructs an instance of this class which will trigger an event at the
  33.      * specified threshold, and save data to a file beyond that point.
  34.      *
  35.      * @param threshold  The number of bytes at which to trigger an event.
  36.      * @param outputFile The file to which data is saved beyond the threshold.
  37.      */
  38.     public DeferredFileOutputStream(int threshold, File outputFile)
  39.     {
  40.         super(threshold);
  41.         this.outputFile = outputFile;
  42.         memoryOutputStream = new ByteArrayOutputStream(threshold);
  43.         currentOutputStream = memoryOutputStream;
  44.     }
  45.     // --------------------------------------- ThresholdingOutputStream methods
  46.     /**
  47.      * Returns the current output stream. This may be memory based or disk
  48.      * based, depending on the current state with respect to the threshold.
  49.      *
  50.      * @return The underlying output stream.
  51.      *
  52.      * @exception IOException if an error occurs.
  53.      */
  54.     protected OutputStream getStream() throws IOException
  55.     {
  56.         return currentOutputStream;
  57.     }
  58.     /**
  59.      * Switches the underlying output stream from a memory based stream to one
  60.      * that is backed by disk. This is the point at which we realise that too
  61.      * much data is being written to keep in memory, so we elect to switch to
  62.      * disk-based storage.
  63.      *
  64.      * @exception IOException if an error occurs.
  65.      */
  66.     protected void thresholdReached() throws IOException
  67.     {
  68.         byte[] data = memoryOutputStream.toByteArray();
  69.         FileOutputStream fos = new FileOutputStream(outputFile);
  70.         fos.write(data);
  71.         diskOutputStream = fos;
  72.         currentOutputStream = fos;
  73.         memoryOutputStream = null;
  74.     }
  75.     // --------------------------------------------------------- Public methods
  76.     /**
  77.      * Determines whether or not the data for this output stream has been
  78.      * retained in memory.
  79.      *
  80.      * @return <code>true</code> if the data is available in memory;
  81.      *         <code>false</code> otherwise.
  82.      */
  83.     public boolean isInMemory()
  84.     {
  85.         return (!isThresholdExceeded());
  86.     }
  87.     /**
  88.      * Returns the data for this output stream as an array of bytes, assuming
  89.      * that the data has been retained in memory. If the data was written to
  90.      * disk, this method returns <code>null</code>.
  91.      *
  92.      * @return The data for this output stream, or <code>null</code> if no such
  93.      *         data is available.
  94.      */
  95.     public byte[] getData()
  96.     {
  97.         if (memoryOutputStream != null)
  98.         {
  99.             return memoryOutputStream.toByteArray();
  100.         }
  101.         return null;
  102.     }
  103.     /**
  104.      * Returns the data for this output stream as a <code>File</code>, assuming
  105.      * that the data was written to disk. If the data was retained in memory,
  106.      * this method returns <code>null</code>.
  107.      *
  108.      * @return The file for this output stream, or <code>null</code> if no such
  109.      *         file exists.
  110.      */
  111.     public File getFile()
  112.     {
  113.         return outputFile;
  114.     }
  115. }