/**
 * @license
 * Copyright 2017 The FOAM Authors. All Rights Reserved.
 * http://www.apache.org/licenses/LICENSE-2.0
 */

package foam.blob;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;

public class FileBlob
  extends InputStreamBlob
{
  protected File file_;

  public FileBlob(File file) throws FileNotFoundException {
    super(new FileInputStream(file), (int) file.length());
    file_ = file;
  }

  public File getFile() {
    return this.file_;
  }
}
/**
 * @license
 * Copyright 2017 The FOAM Authors. All Rights Reserved.
 * http://www.apache.org/licenses/LICENSE-2.0
 */

package foam.blob;

public class FileBlob extends AbstractBlob {
  public static final int BUFFER_SIZE = 4096;

  private java.io.File file_;
  private java.io.RandomAccessFile raf_;

  public FileBlob(java.io.File file) throws java.io.IOException {
    file_ = file;
    raf_ = new java.io.RandomAccessFile(file.getPath(), "r");
  }

  public java.io.File getFile() {
    return this.file_;
  }

  @Override
  public long read(java.io.OutputStream out, long offset, long length) {
    try {
      byte[] buffer = new byte[BUFFER_SIZE];
      raf_.seek(offset);
      long read = 0;
      while ( read < length ) {
        int n = raf_.read(buffer, 0,
          Math.min((int)(length - read), BUFFER_SIZE));
        out.write(buffer, 0, n);
        read += n;
      }
      return read;
    } catch (Throwable t) {
      return -1;
    }
  }

  @Override
  public long getSize() {
    return file_.getTotalSpace();
  }
}

Make FileBlob able to read at any position