View Javadoc
1   /*
2    * #%L
3    * nom.tam FITS library
4    * %%
5    * Copyright (C) 1996 - 2024 nom-tam-fits
6    * %%
7    * This is free and unencumbered software released into the public domain.
8    *
9    * Anyone is free to copy, modify, publish, use, compile, sell, or
10   * distribute this software, either in source code form or as a compiled
11   * binary, for any purpose, commercial or non-commercial, and by any
12   * means.
13   *
14   * In jurisdictions that recognize copyright laws, the author or authors
15   * of this software dedicate any and all copyright interest in the
16   * software to the public domain. We make this dedication for the benefit
17   * of the public at large and to the detriment of our heirs and
18   * successors. We intend this dedication to be an overt act of
19   * relinquishment in perpetuity of all present and future rights to this
20   * software under copyright law.
21   *
22   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23   * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24   * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
25   * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
26   * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
27   * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
28   * OTHER DEALINGS IN THE SOFTWARE.
29   * #L%
30   */
31  
32  package nom.tam.util;
33  
34  import java.io.BufferedOutputStream;
35  import java.io.IOException;
36  import java.io.OutputStream;
37  
38  /**
39   * Efficient writing of binary arrays to streams with custom binary encoding.
40   * 
41   * @author Attila Kovacs
42   * @since 1.16
43   * @see ArrayInputStream
44   * @see ArrayDataFile
45   */
46  public class ArrayOutputStream extends BufferedOutputStream implements OutputWriter {
47  
48      /** conversion from Java arrays to FITS binary representation */
49      private OutputEncoder encoder;
50  
51      /**
52       * Instantiates a new output stream for efficient array transactions. For
53       * use by subclass constructors only.
54       * 
55       * @param o
56       *            the underlying output stream
57       * @param bufLength
58       *            the buffer size in bytes.
59       */
60      protected ArrayOutputStream(OutputStream o, int bufLength) {
61          super(o, bufLength);
62      }
63  
64      /**
65       * Instantiates a new output stream for efficient array transactions.
66       * 
67       * @param o
68       *            the underlying output stream
69       * @param bufLength
70       *            the buffer size in bytes.
71       * @param java2bin
72       *            the conversion from Java arrays to the binary representation
73       *            in the stream.
74       */
75      public ArrayOutputStream(OutputStream o, int bufLength, OutputEncoder java2bin) {
76          this(o, bufLength);
77          setEncoder(java2bin);
78      }
79  
80      /**
81       * Sets the conversion from Java arrays to their binary representation in
82       * the stream. For use by subclass constructors only.
83       * 
84       * @param java2bin
85       *            the conversion from Java arrays to their binary representation
86       *            in stream
87       * @see #getEncoder()
88       */
89      protected void setEncoder(OutputEncoder java2bin) {
90          encoder = java2bin;
91      }
92  
93      /**
94       * Returns the conversion from Java arrays to their binary representation in
95       * the stream. Subclass implementeations can use this to access the required
96       * conversion when writing data to file.
97       * 
98       * @return the conversion from Java arrays to their binary representation in
99       *         stream
100      * @see #setEncoder(OutputEncoder)
101      */
102     protected OutputEncoder getEncoder() {
103         return encoder;
104     }
105 
106     /**
107      * See {@link ArrayDataOutput#writeArray(Object)} for a contract of this
108      * method.
109      * 
110      * @param o
111      *            an array ot any type.
112      * @throws IllegalArgumentException
113      *             if the argument is not an array or if it contains an element
114      *             that is not supported for encoding.
115      * @throws IOException
116      *             if there was an IO error writing to the output.
117      */
118     public synchronized void writeArray(Object o) throws IOException, IllegalArgumentException {
119         try {
120             encoder.writeArray(o);
121         } catch (IllegalArgumentException e) {
122             throw new IOException(e);
123         }
124     }
125 }