package org.limewire.player.impl;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
/**
* An InputStream created from a RandomAccessFile. Seek is overridden
* to take advantage of the fast search time of RandomAccessFile.
*/
public class RandomAudioInputStream extends InputStream {
/**
* The file the input stream reads from.
*/
private final RandomAccessFile file;
/**
* The current byte location in the file.
*/
private long fileBytePosition;
public RandomAudioInputStream(RandomAccessFile file) {
this.file = file;
fileBytePosition = 0;
}
@Override
public int read() throws IOException {
int a = file.read();
fileBytePosition++;
return a;
}
@Override
public int read(byte[] b) throws IOException {
return read(b, 0, b.length);
}
@Override
public int read(byte[] b, int off, int len) throws IOException {
if (file == null) {
return -1;
}
int r = file.read(b, off, len);
fileBytePosition += r;
return r;
}
@Override
public int available() throws IOException {
return (int) (file.length() - fileBytePosition);
}
/**
* Skip uses the RandomAccessFile seek. Note that unlike normal
* seek on an inputStream, the value passed in here is the location
* from the beginning of the file, not the current location in the stream.
*/
@Override
public long skip(long bytesToSkip) throws IOException {
int bytes = file.skipBytes((int)bytesToSkip);
fileBytePosition = bytes;
return bytes;
}
@Override
public void close() throws IOException {
file.close();
}
}