Author: j16sdiz Date: 2008-10-19 13:32:27 +0000 (Sun, 19 Oct 2008) New Revision: 23010
Modified: trunk/freenet/src/freenet/support/io/ArrayBucket.java Log: Don't append for ArrayBucket - see http://archives.freenetproject.org/message/20081014.143053.dd1d17ba.en.html Modified: trunk/freenet/src/freenet/support/io/ArrayBucket.java =================================================================== --- trunk/freenet/src/freenet/support/io/ArrayBucket.java 2008-10-18 23:14:36 UTC (rev 23009) +++ trunk/freenet/src/freenet/support/io/ArrayBucket.java 2008-10-19 13:32:27 UTC (rev 23010) @@ -5,8 +5,6 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.util.ArrayList; -import java.util.Iterator; import freenet.support.api.Bucket; @@ -18,8 +16,7 @@ * @author oskar */ public class ArrayBucket implements Bucket { - - private final ArrayList<byte[]> data; + private volatile byte[] data; private String name; private boolean readOnly; @@ -29,11 +26,11 @@ public ArrayBucket(byte[] initdata) { this("ArrayBucket"); - data.add(initdata); + data = initdata; } public ArrayBucket(String name) { - data = new ArrayList<byte[]>(); + data = new byte[0]; this.name = name; } @@ -43,24 +40,16 @@ } public InputStream getInputStream() { - return new ArrayBucketInputStream(); + return new ByteArrayInputStream(data); } @Override public String toString() { - StringBuilder s = new StringBuilder(250); - for (byte[] b : data) { - s.append(new String(b)); - } - return s.toString(); + return new String(data); } public long size() { - long size = 0; - for (byte[] b : data) { - size += b.length; - } - return size; + return data.length; } public String getName() { @@ -77,85 +66,13 @@ @Override public synchronized void close() throws IOException { if(hasBeenClosed) return; - data.add(super.toByteArray()); + data = super.toByteArray(); if(readOnly) throw new IOException("Read only"); // FIXME maybe we should throw on write instead? :) hasBeenClosed = true; } } - private class ArrayBucketInputStream extends InputStream { - - private Iterator<byte[]> i; - private ByteArrayInputStream in; - - public ArrayBucketInputStream() { - i = data.iterator(); - } - - @Override - public int read() { - return priv_read(); - } - - private int priv_read() { - if (in == null) { - if (i.hasNext()) { - in = new ByteArrayInputStream(i.next()); - } else { - return -1; - } - } - int i = in.read(); - if (i == -1) { - in = null; - return priv_read(); - } else { - return i; - } - } - - @Override - public int read(byte[] b) { - return priv_read(b, 0, b.length); - } - - @Override - public int read(byte[] b, int off, int len) { - return priv_read(b, off, len); - } - - private int priv_read(byte[] b, int off, int len) { - if (in == null) { - if (i.hasNext()) { - in = new ByteArrayInputStream(i.next()); - } else { - return -1; - } - } - int i = in.read(b, off, len); - if (i == -1) { - in = null; - return priv_read(b, off, len); - } else { - return i; - } - } - - @Override - public int available() { - if (in == null) { - if (i.hasNext()) { - in = new ByteArrayInputStream(i.next()); - } else { - return 0; - } - } - return in.available(); - } - - } - public boolean isReadOnly() { return readOnly; } @@ -165,7 +82,7 @@ } public void free() { - data.clear(); + data = new byte[0]; // Not much else we can do. } @@ -173,13 +90,7 @@ long sz = size(); int size = (int)sz; byte[] buf = new byte[size]; - int index = 0; - for (byte[] obuf : data) { - System.arraycopy(obuf, 0, buf, index, obuf.length); - index += obuf.length; - } - if(index != buf.length) - throw new IllegalStateException(); + System.arraycopy(data, 0, buf, 0, size); return buf; } }
