java/ch/wlkl/wsh/FileRW.java

package ch.wlkl.wsh;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class FileRW extends Top implements Read<String>, Write<String> {
    
    private BufferedWriter writer = null;
    private BufferedReader reader = null;
    private String filename = null;
    
    public FileRW () {
    }

    public FileRW (String fn) {
        reset(fn);
    }

    public void reset(String fn) {
        close();
        filename = fn;
        if (fn.charAt(0) == Cat.eExtFD)
            sFail("reset(" + fn + ") external FD not supported");
    }

    public void reset(Object... o) {
        if (o.length != 1)
            fail("reset with " + o.length + " args instead of 1");
        else if (! (o[0] instanceof String)) 
            fail("reset(" + o[0] + ") arg not String");
        reset((String) o[0]);    
    }

    public void open(String opt) {
        boolean app = false;
        close();
        if (opt.indexOf('r') >= 0) {
            reader = fileReader(filename);
        } else if (opt.indexOf('w') >= 0 || (app = opt.indexOf('a') >= 0)) {    
            writer = fileWriter(filename, app);
        } else {
            fail("bad opt for open(" + opt + ")");
        }
    }

    public void close() {
        try {
            if (writer != null) {
                writer.close();
                writer = null;
                say("??? fileRW closed wri " + new File(filename).getAbsolutePath());
            }
            if (reader != null) {
                reader.close();
                reader = null;
                say("??? fileRW closed rea " + filename);
            }
        } catch (IOException e) {
            fail("close of " + filename + " caught " + e);
        }
    }
    
    public String read() {
        try {
            return reader.readLine();
        } catch (IOException e) {
            fail("write read " + filename + " caught " + e);
            return null;
        }
    }
    
    public void write(String data) {
        try {
            writer.write(data);
            writer.newLine();
        } catch (Exception ex) {
            fail("write on " + filename + " caught " + ex);
        }
    }
    
    public     void writeAll(String opt, Read<String> r) {
        Cat.writeAll(this, opt, r);
    }

    static public BufferedReader fileReader(String fileName) {
        try {
            return new BufferedReader(new FileReader(fileName));
        } catch (FileNotFoundException e) {
            sFail("fileReader open " + fileName + " caught " + e);
            return null;
        }
    }
    
    static public BufferedWriter fileWriter(String fileName, boolean app) {
        try {
            return new BufferedWriter(new FileWriter(fileName, app));
        } catch (Exception ex) {
            try {
                new File(fileName).getParentFile().mkdirs();
                return new BufferedWriter(new FileWriter(fileName, app));
            } catch (Exception e2) {
                Top.sFail("fileWriter open(" + fileName + ") caught " + ex + " and after mkdirs " + e2);
                return null;
            }
        }
    }    
}