You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ti...@apache.org on 2021/09/25 14:24:43 UTC

svn commit: r1893623 - /pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/cos/COSInputStream.java

Author: tilman
Date: Sat Sep 25 14:24:43 2021
New Revision: 1893623

URL: http://svn.apache.org/viewvc?rev=1893623&view=rev
Log:
PDFBOX-4892: optimize memory usage, as suggested by valerybokov

Modified:
    pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/cos/COSInputStream.java

Modified: pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/cos/COSInputStream.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/cos/COSInputStream.java?rev=1893623&r1=1893622&r2=1893623&view=diff
==============================================================================
--- pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/cos/COSInputStream.java (original)
+++ pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/cos/COSInputStream.java Sat Sep 25 14:24:43 2021
@@ -23,6 +23,7 @@ import java.io.FilterInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -61,41 +62,43 @@ public final class COSInputStream extend
     static COSInputStream create(List<Filter> filters, COSDictionary parameters, InputStream in,
                                  ScratchFile scratchFile, DecodeOptions options) throws IOException
     {
-        List<DecodeResult> results = new ArrayList<DecodeResult>();
         InputStream input = in;
-        if (!filters.isEmpty())
+        if (filters.isEmpty())
         {
-            Set<Filter> filterSet = new HashSet<Filter>(filters);
-            if (filterSet.size() != filters.size())
-            {
-                throw new IOException("Duplicate");
-            }
-            // apply filters
-            for (int i = 0; i < filters.size(); i++)
+            return new COSInputStream(in, Collections.<DecodeResult>emptyList());
+        }
+
+        List<DecodeResult> results = new ArrayList<DecodeResult>(filters.size());
+        Set<Filter> filterSet = new HashSet<Filter>(filters);
+        if (filterSet.size() != filters.size())
+        {
+            throw new IOException("Duplicate");
+        }
+        // apply filters
+        for (int i = 0; i < filters.size(); i++)
+        {
+            if (scratchFile != null)
             {
-                if (scratchFile != null)
+                // scratch file
+                final RandomAccess buffer = scratchFile.createBuffer();
+                DecodeResult result = filters.get(i).decode(input, new RandomAccessOutputStream(buffer), parameters, i, options);
+                results.add(result);
+                input = new RandomAccessInputStream(buffer)
                 {
-                    // scratch file
-                    final RandomAccess buffer = scratchFile.createBuffer();
-                    DecodeResult result = filters.get(i).decode(input, new RandomAccessOutputStream(buffer), parameters, i, options);
-                    results.add(result);
-                    input = new RandomAccessInputStream(buffer)
+                    @Override
+                    public void close() throws IOException
                     {
-                        @Override
-                        public void close() throws IOException
-                        {
-                            buffer.close();
-                        }
-                    };
-                }
-                else
-                {
-                    // in-memory
-                    ByteArrayOutputStream output = new ByteArrayOutputStream();
-                    DecodeResult result = filters.get(i).decode(input, output, parameters, i, options);
-                    results.add(result);
-                    input = new ByteArrayInputStream(output.toByteArray());
-                }
+                        buffer.close();
+                    }
+                };
+            }
+            else
+            {
+                // in-memory
+                ByteArrayOutputStream output = new ByteArrayOutputStream();
+                DecodeResult result = filters.get(i).decode(input, output, parameters, i, options);
+                results.add(result);
+                input = new ByteArrayInputStream(output.toByteArray());
             }
         }
         return new COSInputStream(input, results);