In some places we may find ourselves with an InputStream we need to copy into a TemporaryBuffer, so we can flatten out the entire stream to a single byte[]. Putting the copy loop here is more useful then duplicating it in application level code. Signed-off-by: Shawn O. Pearce <spearce@xxxxxxxxxxx> --- "Shawn O. Pearce" <spearce@xxxxxxxxxxx> wrote: > Robin Rosenberg <robin.rosenberg@xxxxxxxxxx> wrote: > > torsdag 11 december 2008 05:58:39 skrev Shawn O. Pearce: > > > + final byte[] b = new byte[2048]; > > > > Why not 8192 here too? > > Blargh, you're right. Actually what I should do is look to see > if blocks != null, in which case I should alloc a block and read > directly into it. That would avoid one copy of the data. And now we do that... diff --git a/org.spearce.jgit/src/org/spearce/jgit/util/TemporaryBuffer.java b/org.spearce.jgit/src/org/spearce/jgit/util/TemporaryBuffer.java index b1ffd6e..761f359 100644 --- a/org.spearce.jgit/src/org/spearce/jgit/util/TemporaryBuffer.java +++ b/org.spearce.jgit/src/org/spearce/jgit/util/TemporaryBuffer.java @@ -42,6 +42,7 @@ import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; @@ -135,6 +136,39 @@ public void write(final byte[] b, int off, int len) throws IOException { diskOut.write(b, off, len); } + /** + * Copy all bytes remaining on the input stream into this buffer. + * + * @param in + * the stream to read from, until EOF is reached. + * @throws IOException + * an error occurred reading from the input stream, or while + * writing to a local temporary file. + */ + public void copy(final InputStream in) throws IOException { + if (blocks != null) { + for (;;) { + Block s = last(); + if (s.isFull()) { + if (reachedInCoreLimit()) + break; + s = new Block(); + blocks.add(s); + } + + final int n = in.read(s.buffer, s.count, Block.SZ - s.count); + if (n < 1) + return; + s.count += n; + } + } + + final byte[] tmp = new byte[Block.SZ]; + int n; + while ((n = in.read(tmp)) > 0) + diskOut.write(tmp, 0, n); + } + private Block last() { return blocks.get(blocks.size() - 1); } -- 1.6.1.rc2.306.ge5d5e -- Shawn. -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html