code cleanup, fix for ReplaceInputStream
[nikiroo-utils.git] / src / be / nikiroo / utils / Image.java
index 6edc1051ab7b910c0b47733407c99d804a08a8fe..58b1f5aeac05f71370365ac9c3a562f70f722797 100644 (file)
@@ -3,10 +3,11 @@ package be.nikiroo.utils;
 import java.io.ByteArrayInputStream;
 import java.io.Closeable;
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 
+import be.nikiroo.utils.streams.MarkableFileInputStream;
+
 /**
  * This class represents an image data.
  * 
@@ -50,40 +51,49 @@ public class Image implements Closeable {
        }
 
        /**
-        * Create a new {@link Image} from its Base64 representation.
+        * Create a new {@link Image} from a stream.
         * 
-        * @param base64
-        *            the {@link Image} in Base64 format
+        * @param in
+        *            the stream
         * 
         * @throws IOException
         *             in case of I/O error
         */
-       public Image(String base64) throws IOException {
-               this(Base64.decode(base64));
+       public Image(InputStream in) throws IOException {
+               data = getTemporaryFile();
+               IOUtils.write(in, data);
        }
 
        /**
-        * Create a new {@link Image} from a stream.
+        * Generate an {@link InputStream} that you can {@link InputStream#reset()}
+        * for this {@link Image}.
+        * <p>
+        * This {@link InputStream} will (always) be a new one, and <b>you</b> are
+        * responsible for it.
+        * <p>
+        * Note: take care that the {@link InputStream} <b>must not</b> live past
+        * the {@link Image} life time!
         * 
-        * @param in
-        *            the stream
+        * @return the stream
         * 
         * @throws IOException
         *             in case of I/O error
         */
-       public Image(InputStream in) throws IOException {
-               data = getTemporaryFile();
-               IOUtils.write(in, data);
+       public InputStream newInputStream() throws IOException {
+               return new MarkableFileInputStream(data);
        }
 
        /**
         * <b>Read</b> the actual image data, as a byte array.
+        * <p>
+        * Note: if possible, prefer the {@link Image#newInputStream()} method, as
+        * it can be more efficient.
         * 
         * @return the image data
         */
        public byte[] getData() {
                try {
-                       FileInputStream in = new FileInputStream(data);
+                       InputStream in = newInputStream();
                        try {
                                return IOUtils.toByteArray(in);
                        } finally {
@@ -94,16 +104,6 @@ public class Image implements Closeable {
                }
        }
 
-       /**
-        * Convert the given {@link Image} object into a Base64 representation of
-        * the same {@link Image} object.
-        * 
-        * @return the Base64 representation
-        */
-       public String toBase64() {
-               return Base64.encodeBytes(getData());
-       }
-
        /**
         * Closing the {@link Image} will delete the associated temporary file on
         * disk.