Method supports direct rewriting of file segment to the specified output stream. Signed-off-by: Marek Zawirski <marek.zawirski@xxxxxxxxx> --- .../src/org/spearce/jgit/lib/WindowedFile.java | 43 ++++++++++++++++++++ 1 files changed, 43 insertions(+), 0 deletions(-) diff --git a/org.spearce.jgit/src/org/spearce/jgit/lib/WindowedFile.java b/org.spearce.jgit/src/org/spearce/jgit/lib/WindowedFile.java index 323b396..fff8990 100644 --- a/org.spearce.jgit/src/org/spearce/jgit/lib/WindowedFile.java +++ b/org.spearce.jgit/src/org/spearce/jgit/lib/WindowedFile.java @@ -40,6 +40,7 @@ package org.spearce.jgit.lib; import java.io.EOFException; import java.io.File; import java.io.IOException; +import java.io.OutputStream; import java.io.RandomAccessFile; import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel.MapMode; @@ -195,6 +196,48 @@ public class WindowedFile { throw new EOFException(); } + /** + * Copy the requested number of bytes to the provided output stream. + * <p> + * This routine always reads until either the requested number of bytes has + * been copied or EOF has been reached. + * </p> + * + * @param position + * the starting offset, as measured in bytes from the beginning + * of this file, to copy from. + * @param buf + * temporary buffer to copy bytes into. In case of a big amount + * of data to copy, size of at least few kB is recommended. It + * does not need to be of size <code>cnt</code>, however. + * @param cnt + * number of bytes to copy. Must not exceed + * <code>file.length - position</code>. + * @param out + * output stream where read data is written out. No buffering is + * guaranteed by this method. + * @param curs + * current cursor for reading data from the file. + * @throws IOException + * a necessary window was not found in the window cache and + * trying to load it in from the operating system failed. + * @throws EOFException + * the file ended before <code>cnt</code> bytes could be read. + */ + public void copyToStream(long position, final byte[] buf, long cnt, + final OutputStream out, final WindowCursor curs) + throws IOException, EOFException { + while (cnt > 0) { + int toRead = (int) Math.min(cnt, buf.length); + int read = read(position, buf, 0, toRead, curs); + if (read != toRead) + throw new EOFException(); + position += read; + cnt -= read; + out.write(buf, 0, read); + } + } + void readCompressed(final long position, final byte[] dstbuf, final WindowCursor curs) throws IOException, DataFormatException { final Inflater inf = InflaterCache.get(); -- 1.5.5.1 -- 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