Class BinaryDeltaInputStream
- java.lang.Object
-
- java.io.InputStream
-
- org.eclipse.jgit.util.io.BinaryDeltaInputStream
-
- All Implemented Interfaces:
java.io.Closeable
,java.lang.AutoCloseable
public class BinaryDeltaInputStream extends java.io.InputStream
AnInputStream
that applies a binary delta to a base on the fly.Delta application to a base needs random access to the base data. The delta is expressed as a sequence of copy and insert instructions. A copy instruction has the form "COPY fromOffset length" and says "copy length bytes from the base, starting at offset fromOffset, to the result". An insert instruction has the form "INSERT length" followed by length bytes and says "copy the next length bytes from the delta to the result".
These instructions are generated using a content-defined chunking algorithm (currently C git uses the standard Rabin variant; but there are others that could be used) that identifies equal chunks. It is entirely possible that a later copy instruction has a fromOffset that is before the fromOffset of an earlier copy instruction.
This makes it impossible to stream the base.
JGit is limited to 2GB maximum size for the base since array indices are signed 32bit values.
- Since:
- 5.12
-
-
Field Summary
Fields Modifier and Type Field Description private byte[]
base
private int
baseOffset
private java.io.InputStream
delta
private int
fromBase
private int
fromDelta
private long
resultLength
private long
toDeliver
-
Constructor Summary
Constructors Constructor Description BinaryDeltaInputStream(byte[] base, java.io.InputStream delta)
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description void
close()
long
getExpectedResultSize()
Tells the expected size of the final result.private void
initialize()
boolean
isFullyConsumed()
Tells whether the delta has been fully consumed, and the expected number of bytes for the combined result have been read from thisBinaryDeltaInputStream
.private int
next(java.io.InputStream in)
int
read()
int
read(byte[] b, int off, int len)
private int
readNext()
private long
readVarInt(java.io.InputStream in)
-
-
-
Method Detail
-
read
public int read() throws java.io.IOException
- Specified by:
read
in classjava.io.InputStream
- Throws:
java.io.IOException
-
read
public int read(byte[] b, int off, int len) throws java.io.IOException
- Overrides:
read
in classjava.io.InputStream
- Throws:
java.io.IOException
-
initialize
private void initialize() throws java.io.IOException
- Throws:
java.io.IOException
-
readNext
private int readNext() throws java.io.IOException
- Throws:
java.io.IOException
-
next
private int next(java.io.InputStream in) throws java.io.IOException
- Throws:
java.io.IOException
-
readVarInt
private long readVarInt(java.io.InputStream in) throws java.io.IOException
- Throws:
java.io.IOException
-
getExpectedResultSize
public long getExpectedResultSize() throws java.io.IOException
Tells the expected size of the final result.- Returns:
- the size
- Throws:
java.io.IOException
- if the size cannot be determined fromdelta
-
isFullyConsumed
public boolean isFullyConsumed()
Tells whether the delta has been fully consumed, and the expected number of bytes for the combined result have been read from thisBinaryDeltaInputStream
.- Returns:
- whether delta application was successful
-
close
public void close() throws java.io.IOException
- Specified by:
close
in interfacejava.lang.AutoCloseable
- Specified by:
close
in interfacejava.io.Closeable
- Overrides:
close
in classjava.io.InputStream
- Throws:
java.io.IOException
-
-