You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by le...@apache.org on 2011/04/29 20:48:34 UTC
svn commit: r1097910 -
/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/io/RandomAccessBuffer.java
Author: lehmi
Date: Fri Apr 29 18:48:34 2011
New Revision: 1097910
URL: http://svn.apache.org/viewvc?rev=1097910&view=rev
Log:
PDFBOX-1005: improved buffer handling when it needs to grow as proposed by Kevin Jackson
Modified:
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/io/RandomAccessBuffer.java
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/io/RandomAccessBuffer.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/io/RandomAccessBuffer.java?rev=1097910&r1=1097909&r2=1097910&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/io/RandomAccessBuffer.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/io/RandomAccessBuffer.java Fri Apr 29 18:48:34 2011
@@ -28,7 +28,6 @@ import java.util.Arrays;
public class RandomAccessBuffer implements RandomAccess
{
- private static final int EXTRA_SPACE = 16384; // 16kb
private byte[] buffer;
private long pointer;
private long size;
@@ -38,7 +37,8 @@ public class RandomAccessBuffer implemen
*/
public RandomAccessBuffer()
{
- buffer = new byte[EXTRA_SPACE];
+ // starting with a 16kb buffer
+ buffer = new byte[16384];
pointer = 0;
size = 0;
}
@@ -103,7 +103,20 @@ public class RandomAccessBuffer implemen
*/
public void write(int b) throws IOException
{
- write(new byte[] {(byte) b}, 0, 1);
+ if (pointer >= buffer.length)
+ {
+ if (pointer >= Integer.MAX_VALUE)
+ {
+ throw new IOException("RandomAccessBuffer overflow");
+ }
+ buffer = Arrays.copyOf(buffer, (int)Math.min(2L * buffer.length, Integer.MAX_VALUE));
+ }
+ buffer[(int)pointer] = (byte)b;
+ pointer++;
+ if (pointer > this.size)
+ {
+ this.size = pointer;
+ }
}
/**
@@ -111,13 +124,15 @@ public class RandomAccessBuffer implemen
*/
public void write(byte[] b, int offset, int length) throws IOException
{
- if (pointer+length >= buffer.length)
+ long newSize = pointer+length;
+ if (newSize >= buffer.length)
{
- // expand buffer
- byte[] temp = new byte[buffer.length+length+EXTRA_SPACE];
- Arrays.fill(temp, (byte)0);
- System.arraycopy(buffer, 0, temp, 0, (int) this.size);
- buffer = temp;
+ if (newSize > Integer.MAX_VALUE)
+ {
+ throw new IOException("RandomAccessBuffer overflow");
+ }
+ newSize = Math.min(Math.max(2L * buffer.length, newSize), Integer.MAX_VALUE);
+ buffer = Arrays.copyOf(buffer, (int)newSize);
}
System.arraycopy(b, offset, buffer, (int)pointer, length);
pointer += length;