package java.io; import lejos.nxt.Flash; /** * Writes a stream of bytes to a file. * * @author Brian Bagnall * */ public class FileOutputStream extends OutputStream { /** * Current page this stream is writing to */ private int page_pointer; /** * Current byte in *buffer* (buff below) it is writing to */ private int data_pointer; /** * A buffer of the same size as a page of flash memory. */ private byte [] buff; /** * File attached to this stream */ File file; /** * create a new OutputStream to write to this file, starting at the beginning of the file. * @param f the file this stream writes to */ public FileOutputStream(File f) { this(f, false); } /** * create a new OutputStream to write to this file * @param f the file this stream writes to * @param append if true this stream will start writing at the end of the file, otherwise at the beginning */ public FileOutputStream(File f, boolean append) { file = f; buff = new byte[Flash.BYTES_PER_PAGE]; page_pointer = file.page_location; data_pointer = 0; // Start of first page if(append) { page_pointer = file.page_location + file.file_length/Flash.BYTES_PER_PAGE ; data_pointer = file.file_length%Flash.BYTES_PER_PAGE; Flash.readPage(buff, page_pointer); } else file.file_length = 0;// can this cause trouble? } /** * write 1 byte to the file; if necessary, file will be moved become the last file in memory */ public void write(int b) throws IOException { if(file.page_location < 0) throw new IOException(); // "File has not been created!" buff[data_pointer] = (byte)b; data_pointer++; file.file_length++; if(data_pointer >= Flash.BYTES_PER_PAGE) { if(file.getIndex()< ( File.totalFiles -1)) { file.moveToTop(); page_pointer = file.page_location + file.file_length/Flash.BYTES_PER_PAGE; } flush(); // Write to flash page_pointer++; // Move to next page data_pointer = 0; } } public void flush() throws IOException { Flash.writePage(buff, page_pointer); } /** * Write the buffer to flash memory and update the file parameters in flash. * Resets pointers, so file can be written again from beginning with the same output stream. */ public void close() throws IOException { // !! Alternate implementation: If this is a new file, perhaps only // write the file table information AFTER close() called so // incomplete/partial files don't exist. flush(); File.writeTable(File.listFiles()); // Updates file size for this file. page_pointer = file.page_location; data_pointer = 0; // Start of first page } }