package java.io;
import lejos.nxt.Flash;
/**
* Reads a stream of bytes from a file.
* This stream uses an internal Buffer of 256 bytes.
*
* @author Brian Bagnall
* @author Sven Köhler
*/
public class FileInputStream extends InputStream
{
private int offset;
private int file_limit;
private int page_limit;
private int first_page;
private byte[] buff;
public FileInputStream(File f) throws FileNotFoundException
{
if (!f.exists())
throw new FileNotFoundException();
this.buff = new byte[Flash.BYTES_PER_PAGE];
this.offset = 0;
this.file_limit = f.file_length;
this.page_limit = 0;
this.first_page = f.page_location;
}
@Override
public int available() throws IOException
{
return this.file_limit - this.offset;
}
private void buffPage()
{
if (this.offset < this.page_limit)
return;
int pnum = this.offset / Flash.BYTES_PER_PAGE;
Flash.readPage(this.buff, this.first_page + pnum);
this.page_limit = (pnum + 1) * Flash.BYTES_PER_PAGE;
}
@Override
public int read() throws IOException
{
if (this.offset >= this.file_limit)
return -1;
this.buffPage();
return buff[this.offset++ % Flash.BYTES_PER_PAGE] & 0xFF;
}
@Override
public int read(byte[] b, int off, int len) throws IOException
{
if (this.offset >= this.file_limit)
return -1;
int favail = this.file_limit - this.offset;
if (len > favail)
len = favail;
int offorig = off;
while (len > 0)
{
this.buffPage();
int pavail = this.page_limit - this.offset;
if (pavail > len)
pavail = len;
System.arraycopy(this.buff, this.offset % Flash.BYTES_PER_PAGE, b, off, pavail);
this.offset += pavail;
off += pavail;
len -= pavail;
}
return off - offorig;
}
@Override
public long skip(long n) throws IOException
{
if (n <= 0)
return 0;
int avail = this.file_limit - this.offset;
if (avail > n)
avail = (int)n;
this.offset += avail;
return n - avail;
}
}