import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

/**
A whacky-whacky class for succint text file handling.
@author Daniel Sykes
**/

class TextFile
{
  private BufferedReader reader = null;
  private BufferedWriter writer = null;
  private File f;

  public TextFile(String filename) throws IOException
  {
    f = new File(filename);
    if (!f.exists())
      f.createNewFile();
    if (!(f.isFile() && f.canRead() && f.canWrite()))
      throw new IOException("Invalid filename to create a TextFile.");
    reader = new BufferedReader(new FileReader(f));
  }
  
  private void switchToRead() throws IOException
  {
    if (reader == null)
    {
      writer.close();
      writer = null;
      reader = new BufferedReader(new FileReader(f)); 
    }
  }
  
  public char read() throws IOException
  {
    switchToRead();
    return (char) reader.read();
  }
  
  public String readLine() throws IOException
  {
    switchToRead();
    return reader.readLine();
  }
  
  private void switchToWrite() throws IOException
  {
    if (writer == null)
    {
      reader.close();
      reader = null;
      writer = new BufferedWriter(new FileWriter(f)); 
    }
  }
  
  public void write(String data) throws IOException
  {
    switchToWrite();
    for (int i = 0; i < data.length(); i++)
      writer.write(data.charAt(i));
  }
  
  public void writeLine(String data) throws IOException
  {
    switchToWrite();
    write(data);
    writer.newLine();
  }
  
  public String readWholeFile() throws IOException
  {
    switchToRead();
    StringBuffer b = new StringBuffer("");
    String str = readLine();
    while (str != null)
    {
      b.append(str);
      str = readLine();
    }
    return b.toString();
  }
  
  public void close() throws IOException
  {
    if (reader != null)
      reader.close();
    if (writer != null)
      writer.close();
  }
}